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(...); но не се получи.

Знам, че това вероятно е лесно решение, съжалявам за въпроса на noob. Не мога да повярвам, че това ме шашна.


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-›interval - person Jonathon Reinhart; 13.10.2011
comment
Винаги съм намирал за доста странно, че PHP ви принуждава да използвате $this за достъп до обектни полета. Много други езици като C# няма (ако променливата няма същото име като локална). Както и да е, използването на this винаги е добра практика, IMHO: помага ви бързо да разгледате свойствата на обекта и да избегнете объркване с локални променливи. - person gremo; 13.10.2011
comment
Определено. Python има същото изискване (с 'self', въпреки че 'self' е само конвенция и трябва действително да предоставите параметър 'self' във функция). Нямам нищо против, защото това гарантира, че знаете какво всъщност имате предвид. Доста важно в тези динамични езици, когато можете да декларирате неща навсякъде. - person Jonathon Reinhart; 13.10.2011
comment
Благодаря ти за помощта! Свикнал съм с езици, където това не е задължително. Както и да е, когато премахна втория знак за долар, получавам тази грешка: Фатална грешка: Извикване на членска функция 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