【问题标题】:php5.4 autoloading traitsphp5.4 自动加载特征
【发布时间】:2012-05-25 09:21:50
【问题描述】:

php5.4 中的特征会自动加载吗?

我还没有一个测试环境,但我在 php.net 的 __autoload 或特征页面上看不到任何提及它,但似乎特征在某些方面表现得像类。

有人试过吗?

更新:

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

这似乎表明它确实有效,但不是明确的。任何人都可以确认直接 __autoload() 将被称为缺少特征吗?

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

谢谢, 我的流

【问题讨论】:

    标签: php autoload traits


    【解决方案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'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 出色的回复。谢谢!
    • 不客气 :-) (我想安装 5.4 很久了——我终于做到了^^)
    【解决方案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
    

    它们被视为类,因为它们被实现为(修改?)类。

    例如,它们目前具有类的残留行为:它们可以拥有属性。

    理论上他们不应该,你也不应该依赖他们拥有这种能力。未来可能会被淘汰。

    【讨论】:

    • 谢谢你 - 非常有用的答案和建议。 +1 看看它是如何发展的会很有趣。
    • IMO 这是一个非常糟糕/笨拙的语法。允许特征中的属性(如果它继续)。 B.asically 允许“完全”多重继承。我很高兴能测试这个功能,就像我在@php5.3 中讨论命名空间一样,但又一次失望。
    • 同样在php5.4中我们有直接的函数返回值解析:explode(' ', 'Mihai Stancu')[1] == 'Stancu',以及数组语法['key' => '值']。
    • 我不喜欢命名空间或它们的 php 实现,但功能特征目前对我来说非常有用。
    • 是的 - 我记得 :) - 相同的概念已经进入 CSS(SASS 等)我并不反对这个想法 - 主要是实现,但很高兴 Traits 提供了一种缓解方法在 PHP 中膨胀而没有为了附加功能而强制执行命名空间或接口的异常继承模式。
    猜你喜欢
    • 2014-02-05
    • 2017-12-26
    • 2016-10-11
    • 2019-02-09
    • 2022-01-22
    • 1970-01-01
    • 2018-01-07
    • 2014-04-10
    • 2012-12-19
    相关资源
    最近更新 更多