Подтвердить что ты не робот

Возможности автозагрузки php5.4

Являются ли признаки в php5.4 подлежащими автозагрузке?

У меня еще нет среды для тестирования, но я не вижу никаких упоминаний об этом на __autoload на php.net или на странице признаков, но, похоже, в некоторых отношениях они ведут себя как классы.

Кто-нибудь еще это пробовал?

UPDATE:

Я нашел запрос здесь: https://bugs.php.net/bug.php?id=61265 (2012-03-03 13:10 UTC)

который, кажется, предполагает, что он работает, но не явно. Может ли кто-нибудь подтвердить, что прямой __autoload() будет вызван для недостающей черты?

ОБНОВЛЕНИЕ: Подтверждено - работает как ожидалось - __autoload будет извлекать черты, хотя получение php5.4 для работы в первый раз кажется более сложной задачей.

Спасибо, MyStream

4b9b3361

Ответ 1

В соответствии с руководством функция trait_exists() принимает логический второй параметр, связанный с автозагрузкой; что, по-видимому, указывает на то, что черты и автозагрузка не являются двумя несовместимыми идеями.

Кроме того, если вы посмотрите на исходный код этой функции trait_exists(), вы увидите раздел кода, обусловленного этим вторым параметром, который выглядит очень похоже на то, что вы можете видеть в исходном коде class_exists(). Итак, я бы сказал, второй раз, что черты и автозагрузка не являются несовместимыми идеями; -)

(У меня нет PHP 5.4, установленного на моем текущем компьютере, поэтому я не могу проверить сам, но, глядя на код...)



[edit] ОК, я только что скомпилировал PHP 5.4.3, текущую стабильную версию:

$ /usr/local/bin/php --version
PHP 5.4.3 (cli) (built: May 17 2012 21:11:42)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

Попробуйте следующую короткую часть кода, которая сохраняется как temp-2.php, и пытается использовать признак, который не объявлен в этом файле:

spl_autoload_register(function ($name) {
    echo "AUTOLOAD :: ";
    var_dump($name);
});

class MyClass {
    use MyTrait;   // Let try to use a trait that is not declared in this file
}

$obj = new MyClass();
$obj->plop();

В принципе, если автозагрузка работает для признаков, "AUTOLOAD" и должно отображаться имя моего признака.

Итак, попробуйте выполнить эту часть кода, и вот результат:

$ /usr/local/bin/php ./temp-2.php
AUTOLOAD :: string(7) "MyTrait"

Fatal error: Trait 'MyTrait' not found in /.../temp-2.php on line 13

Таким образом, функция автозагрузки (здесь, анонимная, но которая ничего не меняет) называется...
..., что означает, что признаки, с PHP 5.4.3, подлежат автозагрузке.

Ответ 2

Подтверждено:

PHP 5.4.3-1~dotdeb.0 (cli) (built: May  8 2012 20:49:26)

Fatal error: Trait 'x' not found in /.../index.php on line 12

Они рассматриваются как классы, потому что они реализованы как (modiffied?) классы.

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

В теории они не должны и вам не следует полагаться на них, обладающих этой способностью. В будущем это, вероятно, будет постепенно прекращено.