0

我的库文件夹中有一个以我的网站命名的文件夹。文件夹路径如下:

~\www\library\myWebsite.com

如果我使用 Zend 自动加载器来加载库路径中所有内容的命名空间,那么从该文件中自动加载具有如下命名空间的类会不会有任何问题:

\myWebsite.com\myClass::myFunction();

我在网上查找了有关这方面的文档,但找不到任何有关以这种方式使用句点的信息。

4

2 回答 2

0

我试过了,复杂的是PHP。我认为 Zend 很好地注册了命名空间,因为当我调用 \Zend_Load_Autoloader::getRegisteredNamespaces() 时,它表明它已注册。但是当我从完全限定的命名空间调用静态方法时,php 给出了一个错误:

Fatal error: Undefined constant 'myWebsite' in /home/jesse/www/application/controllers/MyController.php on line 15 

似乎 PHP 在解析期间终止了命名空间标识符,在 . (句号字符)。这令人失望,因为对我来说,拥有一个以网站命名的库对我的设计很重要。

我会将目录重命名为 myWebsitecom 或可能将 .com 设为自己的子目录,例如

myWebsite\com 并将其合并到我的命名空间树中,例如:\MyNamespace\Com\MyClass::myFunction();

于 2011-02-04T16:33:31.030 回答
0

找出答案的最简单方法是尝试一下。

如果它不起作用,您总是可以编写一个自定义自动加载器来使其工作。我对 php 命名空间没有太多经验,但自动加载器看起来像这样(我想你必须稍微修改一下才能确定给定类名的正确文件路径):

<?php
class My_Loader_Autoloader_MyWebsite implements Zend_Loader_Autoloader_Interface {

    /**
     * (non-PHPdoc)
     * @see Zend_Loader_Autoloader_Interface::autoload()
     */
    public function autoload($class) {

        if (strtolower(substr($class, 0, 9)) == 'mywebsite') {
            $file = realpath(APPLICATION_PATH . '/../library/myWebsite.com/' . $class);
            if ($file) {
                require_once $file;
                return $class;
            }
        }
        return false;
    }
}

然后把它放在你的引导程序中:

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->pushAutoloader(new My_Loader_Autoloader_MyWebsite());

如果这个类必须在那个 myWebsite.com 目录中,你也可以作弊并在那里输入一个要求:

 require_once(APPLICATION_PATH . '/../library/myWebsite.com/Loader/Autoloader/MyWebsite.php');
于 2011-02-04T16:05:32.367 回答