当我尝试使用autoload和命名空间时,我得到了这个错误:
致命错误:在第10行的/usr/local/www/apache22/data/public/php5.3/test.php中找不到Class1类
有人能告诉我我哪里做错了吗?
下面是我的代码:
Class1.php:
<?php
namespace Person\Barnes\David
{
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
}
?>
test.php:
<?php
function __autoload($class)
{
require $class . '.php';
}
use Person\Barnes\David;
$class = new Class1();
?>
发布于 2009-12-09 09:35:01
Class1
不在全局范围内。
请注意,这是一个古老的答案,自从您不能假设PHP5.1中引入了对spl_autoload_register()
的支持以来,情况已经发生了变化(现在是很多年前!)。
这些天,你可能会使用Composer。在引擎盖下,这将是启用class autoloading的代码片段。
spl_autoload_register(function ($class) {
// Adapt this depending on your directory structure
$parts = explode('\\', $class);
include end($parts) . '.php';
});
为了完整,这里是旧的答案:
要加载未在全局作用域中定义的类,需要使用自动加载器。
<?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();
或不使用别名:
use Person\Barnes\David\Class1;
$class = new Class1();
发布于 2013-05-14 09:01:43
正如前面提到的Pascal MARTIN,您应该将'\‘替换为DIRECTORY_SEPARATOR,例如:
$filename = BASE_PATH . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
include($filename);
另外,我建议您重新组织目录结构,使代码更具可读性。这可能是另一种选择:
目录结构:
ProjectRoot
|- lib
文件:/ProjectRoot/lib/Person/Barnes/David/Class1.php
<?php
namespace Person\Barnes\David
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
?>
文件:/ProjectRoot/test.php
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();
发布于 2009-12-02 14:00:12
您的__autoload
函数将接收完整的类名,包括名称空间名称。
这意味着,在您的示例中,__autoload
函数将接收“Person\Barnes\David\Class1
”,而不仅仅是“Class1
”。
因此,您必须修改自动加载代码,以处理这种“更复杂”的名称;通常使用的解决方案是在每个“级别”的名称空间中使用一级目录来组织您的文件,并且在自动加载时,将名称空间名称中的“\
”替换为DIRECTORY_SEPARATOR
。
https://stackoverflow.com/questions/1830917
复制相似问题