PHP вызывает self на нестатическом методе

почему в этом примере работает "self" -вызов метода non-satic?

class A{

    protected function aNonStaticMethod(){
        return __class__;
    }

    public function aEcho(){
        echo self::aNonStaticMethod();
    }
}

Спасибо за объяснение.

2 ответов


вызов нестатического метода статически

теоретически это должно не работать, а как этой комментарии:

в php4 не было статического ключевого слова, но php4 допускал статическое звонки. Для поддержания обратной совместимости это было оставлено, когда static ключевое слово было добавлено в php5.

этот комментарий поддерживается этой официальный php.net wiki:

Это уже устарел, если вызов происходит из метода экземпляра. Не аннотирование методов как статических является устаревшим PHP4-ism.

вы действительно не должны вызывать нестатический метод статически - это не имеет смысла (если есть static ключевое слово).

избегайте вызова нестатических методов статически полностью!

...потому что a) это плохой подход б)PHP docs скажи:

осторожностью
в PHP 5 вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.

и

предупреждение
в PHP 7 вызов нестатических методов статически устарел и будет генерировать предупреждение E_DEPRECATED. Поддержка вызова нестатических методов статически может быть удалена в будущем.

используя :: оператора нестатические звонки - может быть хороший подход!

как указал @Kontrollfreak и как это docs сказать :: оператор не ограничивается статическими вызовами:

на двойной, является маркером, который позволяет получить доступ к статическим, постоянным, и переопределенные свойства или методы класса

так что это нормально, если вы ссылаетесь таким образом на метод или свойства из родительский класс - что is не ограничено прямой родитель.


в вашем простом примере $this и self взаимозаменяемы. Но имейте в виду другой метод разрешения при работе с наследованием (я добавил static для полноты):

class A {
    protected function aNonStaticMethod(){
        return __class__;
    }

    public function selfEcho(){
        echo self::aNonStaticMethod();
    }

    public function staticEcho(){
        echo static::aNonStaticMethod();
    }

    public function thisEcho(){
        echo $this->aNonStaticMethod();
    }
}

class B extends A {
    protected function aNonStaticMethod(){
        return __class__;
    }
}

$b = new B();
$b->selfEcho(); // A
$b->staticEcho(); // B
$b->thisEcho(); // B