首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过autoload使用PHP命名空间?

如何通过autoload使用PHP命名空间?
EN

Stack Overflow用户
提问于 2009-12-02 13:55:14
回答 13查看 133.3K关注 0票数 105

当我尝试使用autoload和命名空间时,我得到了这个错误:

致命错误:在第10行的/usr/local/www/apache22/data/public/php5.3/test.php中找不到Class1类

有人能告诉我我哪里做错了吗?

下面是我的代码:

Class1.php:

代码语言:javascript
复制
<?php

namespace Person\Barnes\David
{
    class Class1
    {
        public function __construct()
        {
            echo __CLASS__;
        }
    }
}

?>

test.php:

代码语言:javascript
复制
<?php

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

use Person\Barnes\David;

$class = new Class1();

?>
EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-12-09 09:35:01

Class1不在全局范围内。

请注意,这是一个古老的答案,自从您不能假设PHP5.1中引入了对spl_autoload_register()的支持以来,情况已经发生了变化(现在是很多年前!)。

这些天,你可能会使用Composer。在引擎盖下,这将是启用class autoloading的代码片段。

代码语言:javascript
复制
spl_autoload_register(function ($class) {
    // Adapt this depending on your directory structure
    $parts = explode('\\', $class);
    include end($parts) . '.php';
});

为了完整,这里是旧的答案:

要加载未在全局作用域中定义的类,需要使用自动加载器。

代码语言:javascript
复制
<?php

// Note that `__autoload()` is removed as of PHP 8 in favour of 
// `spl_autoload_register()`, see above
function __autoload($class)
{
    // Adapt this depending on your directory structure
    $parts = explode('\\', $class);
    require end($parts) . '.php';
}

use Person\Barnes\David as MyPerson;

$class = new MyPerson\Class1();

或不使用别名:

代码语言:javascript
复制
use Person\Barnes\David\Class1;

$class = new Class1();
票数 122
EN

Stack Overflow用户

发布于 2013-05-14 09:01:43

正如前面提到的Pascal MARTIN,您应该将'\‘替换为DIRECTORY_SEPARATOR,例如:

代码语言:javascript
复制
$filename = BASE_PATH . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
include($filename);

另外,我建议您重新组织目录结构,使代码更具可读性。这可能是另一种选择:

目录结构:

代码语言:javascript
复制
ProjectRoot
 |- lib

文件:/ProjectRoot/lib/Person/Barnes/David/Class1.php

代码语言:javascript
复制
<?php
namespace Person\Barnes\David
class Class1
{
    public function __construct()
    {
        echo __CLASS__;
    }
}
?>

  • 为您定义的每个命名空间创建子目录。

文件:/ProjectRoot/test.php

代码语言:javascript
复制
define('BASE_PATH', realpath(dirname(__FILE__)));
function my_autoloader($class)
{
    $filename = BASE_PATH . '/lib/' . str_replace('\\', '/', $class) . '.php';
    include($filename);
}
spl_autoload_register('my_autoloader');

use Person\Barnes\David as MyPerson;
$class = new MyPerson\Class1();

  • 我使用了PHP5推荐的自动加载器声明。如果您仍在使用PHP4,请使用旧语法替换它: function __autoload($class)
票数 29
EN

Stack Overflow用户

发布于 2009-12-02 14:00:12

您的__autoload函数将接收完整的类名,包括名称空间名称。

这意味着,在您的示例中,__autoload函数将接收“Person\Barnes\David\Class1”,而不仅仅是“Class1”。

因此,您必须修改自动加载代码,以处理这种“更复杂”的名称;通常使用的解决方案是在每个“级别”的名称空间中使用一级目录来组织您的文件,并且在自动加载时,将名称空间名称中的“\”替换为DIRECTORY_SEPARATOR

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1830917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档