PHP - переменные частного класса, дающие ошибку: неопределенная переменная

Я получаю сообщение об ошибке "Неопределенная переменная: интервал в C:\wamp\www\DGC\classes\DateFilter.php"

Вот мой код для класса DateFilter:

class DateFilter extends Filter
{
    //@param daysOld: how many days can be passed to be included in filter
    //Ex. If daysOld = 7, everything that is less than a week old is included
    private $interval;

    public function DateFilter($daysOld)
    {
        echo 'days old' . $daysOld .'</ br>';
        $interval = new DateInterval('P'.$daysOld.'D');
    }


    function test()
    {
        echo $interval->format("%d days old </br>");
        //echo 'bla';
    }

}

Когда я создаю новый экземпляр класса DateFilter и вызываю test(), он дает мне ошибку. Я понимаю, что это означает, что переменная не была инициализирована, но я знаю, что конструктор вызывается, потому что я поместил туда оператор эха, и он был выведен.

Я также пробовал: $this::$interval->format(...); self::$interval->format(...); но это не сработало.

Я знаю, что это, вероятно, легко исправить, извините за нубский вопрос. Не могу поверить, что это поставило меня в тупик.


person CHawk    schedule 12.10.2011    source источник


Ответы (3)


Вы должны использовать $this->interval для доступа к переменной-члену interval в PHP. См. раздел PHP: основы.

class DateFilter extends Filter
{
    private $interval;    // this is correct.

    public function DateFilter($daysOld)
    {
        $this->interval = new DateInterval('P'.$daysOld.'D');   // fix this
    }

    function test()
    {
        echo $this->interval->format("%d days old </br>");     // and fix this
    }
}
person Jonathon Reinhart    schedule 12.10.2011
comment
echo $this-›$interval-›format(%d дней назад ‹/br›); Также дает мне ту же ошибку:/ - person CHawk; 13.10.2011
comment
удалить второй знак доллара. Это $this-›интервал - person Jonathon Reinhart; 13.10.2011
comment
Я всегда находил довольно странным, что PHP заставляет вас использовать $this для доступа к полям объекта. Многие другие языки, такие как C#, не будут (если переменная не имеет того же имени, что и локальная). В любом случае использование this всегда является хорошей практикой, ИМХО: это помогает вам быстро просмотреть свойства объекта и избежать путаницы с локальными переменными. - person gremo; 13.10.2011
comment
Определенно. Python имеет такое же требование (с «self.», хотя «self» — это просто соглашение, и вы должны фактически предоставить параметр «self» в функции). Я не возражаю, потому что это гарантирует, что вы знаете, на что вы на самом деле ссылаетесь. Довольно важно в этих динамических языках, когда вы можете объявлять вещи повсюду. - person Jonathon Reinhart; 13.10.2011
comment
Спасибо вам за помощь! Я использую языки, где это необязательно. В любом случае, когда я убираю 2-й знак доллара, я получаю эту ошибку: Неустранимая ошибка: вызов функции-члена format() для не-объекта - person CHawk; 13.10.2011
comment
вам нужно использовать $this->interval везде. Включая конструктор DateFilter. Прямо сейчас вы просто создаете локальную переменную с именем $interval в своем ctor. - person Jonathon Reinhart; 13.10.2011
comment
Благодарю за разъяснение. Работает как шарм. - person CHawk; 13.10.2011

$interval является локальным для функции. $this->interval ссылается на вашу частную собственность.

class DateFilter extends Filter
{
    //@param daysOld: how many days can be passed to be included in filter
    //Ex. If daysOld = 7, everything that is less than a week old is included
    private $interval;

    public function DateFilter($daysOld)
    {
        echo 'days old' . $daysOld .'</ br>';
        $this->interval = new DateInterval('P'.$daysOld.'D');
    }


    function test()
    {
        echo $this->interval->format("%d days old </br>");
        //echo 'bla';
    }

}
person Herbert    schedule 12.10.2011
comment
Отлично, это была последняя часть головоломки, которую мне не хватало. - person CHawk; 13.10.2011

пытающийся

public var $interval;

а также

echo $this->interval;
person Jan Wiemers    schedule 12.10.2011