Возможная ошибка PHP вокруг статического :: в PHP 5.3.3 - PullRequest
6 голосов
/ 01 июня 2011

Я работал над некоторым PHP вокруг ключевого слова «static ::» и столкнулся с проблемой, когда слишком много статических вызовов приводят к путанице относительно того, где находится метод.Проще показать это на примере:

class Class1
{
    function Test()
    {
        return Class2::Test();
    }
}

class Class2
{
    function Test()
    {
        return static::Test2();
    }

    function Test2()
    {
        return true;
    }
}

/* test 1: calling Class1::Test() statically results in expected call to Class2::Test2() */
echo "test 1: " . Class1::Test() . "\n";

/* test 2: instantiating the class causes Class1::Test2() to be called, which does not exist */
$Class1 = new Class1();
echo "test 2: " . $Class1->Test() . "\n";

Я хотел связаться с экспертами по PHP, которые могут сказать мне, может ли это быть подлинной ошибкой или простым неправильным использованием языка.

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

Пожалуйста, дайте мне знать, если требуется дополнительная информация или уточнение.Спасибо за любую помощь заранее!

1 Ответ

7 голосов
/ 01 июня 2011

PHP-документы по поздним статическим привязкам отвечают на ваш вопрос.

"поздние статические привязки работают, сохраняя класс, названный в последнем" вызове без пересылки ".в случае статических вызовов методов это класс с явным именем (обычно слева от оператора ::), в случае нестатических вызовов методов - это класс объекта. «вызов пересылки» является статическимтот, который представлен self ::, parent ::, static :: "...

Ваш тест 1 является статическим вызовом, поэтому, когда вызывается Class2::Test(), он хранит Class2.Статический вызов test2 ссылается на правильное место в Class2.

Ваш тест 2 является нестатическим вызовом, поэтому он использует класс объекта во всех случаях, и поскольку он является Class1,он не может найти метод Test2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...