【问题标题】:php namespaces & autoloadphp 命名空间和自动加载
【发布时间】:2011-08-06 15:04:22
【问题描述】:

我已经阅读了一些关于 php 5.3+ 中的命名空间和自动加载的帖子,但仍然没有成功创建一个工作 :x 也许你们中的一些人知道我的代码出了什么问题? 之前谢谢你。

Autoloader.php

<?php

    namespace my;

    class AutoLoader {

        private $aExt;
        private $sPath;
        protected static $instance;

        public static function getInstance() {
            if(!self::$instance instanceof self ) {
                self::$instance = new self();
            }
            return self::$instance;
        }

        function __construct($sPath = __DIR__, $exts = 'php') {
            // define path and extensions to include
            $this->setPath($sPath);
            $this->setExtensions($exts);
        }

        public function getPath() {
            return $this->sPath;
        }

        public function setPath($path){
            $this->sPath = $path;
        }

        public function removePath() {
            unset ($this->sPath);
        }

        public function addExtension($ext) {
            // prepends period to extension if none found
            $this->aExt[$ext]   = (substr($ext, 0, 1) !== '.') ? '.'.$ext : $ext;
        }

        public function removeExtension($ext) {
            unset ($this->aExt[$ext]);
        }

        public function getExtensions() {
            return $this->aExt;
        }

        public function setExtensions($extensions) {
            // convert
            if (is_string($extensions)) {
                $extensions = array($extensions);
            }

            // add
            foreach($extensions as $ext) {
                $this->addExtension($ext);
            }
        }

        public function register() {
            set_include_path($this->sPath);
            // comma-delimited list of valid source-file extensions
            spl_autoload_extensions(implode(',',$this->aExt));
            // default behavior without callback
            spl_autoload_register(array($this, 'autoload'));
        }


            public function autoload($sClassName) {
            include_once($sClassName.'.php');
            return;
        }

    }

    $autoloader = new AutoLoader();
    $autoloader->register();
?>

MyClass.php 我试图动态加载的类

<?php

    namespace my\tools;

    class MyClass {

        function __construct() {}

        function __destruct() {}

        function test() {
            echo 'ok';
        }
    }

?>

index.php 调用者

<?php

    include_once('../Libraries/php/my/AutoLoader.php');

    new my\tools\MyClass();
?>

最后是我磁盘上的类结构

Libraries
  |_php
     |_my
     | |_Autoloader.php
     |
     |_MyClass.php

【问题讨论】:

  • 对不起,我没有找到如何编辑我的帖子,我想用自动加载器做什么,它只包括 include_once('../Libraries/php/my/AutoLoader.php ');在我编写的每个脚本的开头,然后当然是自动加载:p

标签: php namespaces autoload


【解决方案1】:

这有点过度设计了,我的朋友。

您可能想看看简单地使用 PSR-0(PRS-0 现在已弃用,PSR-4 是新的),来自大量 PHP 项目(如 phpBB、Joomla、CakePHP)的自动加载器规范, Zend 框架and lots more。它在构建时考虑了命名空间,但无论有没有它们都可以很好地工作。

PSR-0(或 PSR-4)的优势在于它带来了一个干净、简单、明显的目录结构,越来越多的项目正在支持它。这意味着对每组代码使用一个自动加载器而不是一个自动加载器。

【讨论】:

  • 我会看看 :) 我通常使用更简单的自动加载器(我在工作中使用 php 5.2.n),在为个人项目尝试不同的设置时,我发现自动加载器的这种利用看起来很有趣:)
  • Charles,我修复了一个断开的链接 (PSR0) 并添加了有关新 PSR4 的信息,另一个链接也断开了(链接文本“等等”)但找不到替代品。跨度>
【解决方案2】:

spl_autoload_register() 需要一个有效的回调。你给......一些东西^^但不是回调。回调是

// a closure
$cb = function ($classname) { /* load class */ }
// object method
$cb = array($object, 'methodName');
// static class method
$cb = array('className', 'methodName');
// function
$cb = 'functionName';

有关更多信息和示例,请参阅manual: spl_autoload_register()

【讨论】:

  • 我知道回调是如何工作的 :) 但是如果你没有为 spl_autoload_register() 方法指定一个有效的回调,(来自 php doc)“正在注册的自动加载函数。如果没有提供参数,那么spl_autoload() 的默认实现将被注册。”所以我可能误解了描述,但如果省略回调,php不会自动加载类?
  • @aoi-onore:“如果没有提供参数”,对,但是你提供了一个参数。 PHP 只会注册一个内置加载器(然后应该自动加载类)。但是:如果您想使用默认值,请不带参数调用spl_autoload_register()spl_autoload_register('spl_autoload')。但是,如果您不想使用它,为什么要编写自己的呢? :?
  • 我没有看到错误。当然,外部自动加载系统也不能调用私有方法。
  • 我在您评论时编辑了我的答案,我想我试图将自动加载器功能公开,但结果是一样的:/
【解决方案3】:

在PHP.net网站上搜索了一下,解决方案非常简单:/

事实上 php 自动加载功能必须在根命名空间 /,我的在我的包的第一级 (my/),当我将类移动到根命名空间时一切正常。

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 2012-05-21
    • 2013-10-24
    • 2013-11-25
    • 2014-04-13
    • 2015-06-11
    相关资源
    最近更新 更多