php5.4自动加载特性

时间:2012-05-17 18:55:00

标签: php autoload traits

php5.4中的特征是否会受到自动加载?

我还没有一个可以测试的环境,但是我在php.net或traits页面上的__autoload上看不到任何提及它,但在某些方面它看起来像traits一样。

有人试过这个吗?

更新

我在这里找到了一个请求: https://bugs.php.net/bug.php?id=61265(2012-03-03 13:10 UTC)

似乎表明它确实有效,但没有明确说明。任何人都可以确认将为缺失的特征调用直__autoload()吗?

UPDATE:已确认 - 它按预期工作 - __ autoload将获取特征,尽管让php5.4第一次工作似乎是更大的挑战。

谢谢, MyStream

2 个答案:

答案 0 :(得分:56)

根据手册,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's 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,可以自动加载

答案 1 :(得分: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?)类。

例如,他们目前在类中有一个残留行为:他们可以拥有属性。

理论上他们不应该这样做,你不应该依赖他们拥有这种能力。将来它可能会逐步淘汰。