【问题标题】:PHP namespace and global autoload single filePHP 命名空间和全局自动加载单个文件
【发布时间】:2013-02-07 04:48:31
【问题描述】:

这是一个在单个文件中使用 PHP 命名空间/自动加载的实验。

namespace trust;

class trust_network{        
    public function __construct(){      
        print "SUP";
    }
}

namespace trust2;

$trust = new \trust\trust_network(); $do = new \test();

function __autoload($class){
    require($class.".php");     
    print $class;
}

所以在命名空间 trust2 下,我调用了“\test”——也就是我想从全局基础的外部文件中自动加载该类。我写的东西不起作用。我知道我在命名空间下有 __autoload,但是如何在全局基础上声明它呢?不能在命名空间声明之前包含。

【问题讨论】:

    标签: php namespaces autoload


    【解决方案1】:

    对于一个文件中的多个命名空间,您应该使用大括号语法:

    namespace n1 {
    ...
    }
    namespace n2 {
    ...
    }
    namespace {
    ...
    }
    

    在最后一个块中,您可以在全局命名空间中声明函数。参考:http://www.php.net/manual/en/language.namespaces.definitionmultiple.php

    【讨论】:

    • 这确实有效,有没有办法在不卷曲的情况下做到这一点?
    • PHP 的文档说“不建议使用不带括号的语法将命名空间组合到一个文件中。相反,建议使用替代的括号语法。”
    • 文档还声明,对于全局命名空间,仅支持括号语法
    【解决方案2】:

    自动加载通常是为了让您可以为每个文件放置一个类。因此,您应该具有以下布局

    /index.php

    function __autoload($class){
        // You may need to convert backslashes in $class to forward slashes 
        // and strip the first slash, we'll leave the
        require($class.".php");
        // debug-only:  print $class;
    }
    // Calling new here triggers __autoload to be called
    $trust = new \trust\trust_network();
    $do = new \test();
    

    /trust/trust_network.php

    namespace trust;
    
    class trust_network{        
        public function __construct(){      
            print "TRUST_NETWORK";
        }
    }
    

    /test.php

    class test() {
        public function __construct(){      
            print "TEST";
        }
    }
    

    请注意,您应该改用spl_autoload_register,因为它允许多个系统挂钩它们自己的自动加载行为。从 PHP 5.3 开始,您可以执行以下操作

    spl_autoload_register(function ($class) {
        require($class.".php");
    });
    

    【讨论】:

    • Juan,这是正确的,但这里的目标是在单个文档中尝试这样做。
    • 为什么不呢。并不是说这将在现实世界中使用,而是将 PHP 推向极限。
    • @MichaelMikhjian 所以真正的问题是你想要一些代码被命名空间而一些代码不被命名空间?那么 fab 就有了解决方案。
    • 没错。从拆分文件来看,您的答案是正确的,但这里的主题是单个文件。真的很感谢你经历过!
    猜你喜欢
    • 2011-08-06
    • 2015-07-15
    • 2012-05-21
    • 1970-01-01
    • 2012-03-05
    • 2013-10-24
    • 2013-11-25
    相关资源
    最近更新 更多