【发布时间】:2013-11-25 09:16:04
【问题描述】:
我想自动加载我的类,只放置命名空间 + 文件名。
示例:
目录骨架:
\var\www
|_ foo
| |_ A.php
| |_ B.php
|
|_ index.php
A.php:
<?php
namespace foo\A;
class A {
private $a;
public function __construct($a) {
$this->a = $a;
}
}
B.php:
<?php
namespace foo\B;
use foo\A;
class B extends A {
private $b;
public function __construct($a, $b) {
parent::__construct($a);
$this->b = $b;
}
}
index.php:
<?php
use foo\B;
define('ROOT', __DIR__ . DIRECTORY_SEPARATOR);
$b = new B('s', 2);
function __autoload($classname) {
$namespace = substr($classname, 0, strrpos($classname, '\\'));
$namespace = str_replace('\\', DIRECTORY_SEPARATOR, $classname);
$classPath = ROOT . str_replace('\\', '/', $namespace) . '.php';
if(is_readable($classPath)) {
require_once $classPath;
}
}
问题是在A类和BI类中用类名声明了命名空间,我使用的时候打印了__autoload的变量并且是正确的,bur调用构造函数时,找不到类。
错误:
Fatal error: Class 'foo\A' not found in /var/www/foo/B.php on line 7
如果我只实例化A,不使用B,问题是一样的。
我需要这样做,因为我希望在B类中,如果你不放use语句,你不能使用A,这样做更严格。
如果您理解我的问题,我现在不明白我的解释,但无论如何感谢您的任何建议!
PD:对不起我的英语水平。
【问题讨论】:
-
您的命名空间声明错误。如果您想归档您在该树中描绘的内容,则两个类都必须为
namespace foo- 命名空间声明中没有类名。 -
我知道,但是我希望我放置的命名空间带有类名,更加严格,因为如果我不这样做,我可以使用同一个命名空间中的类而无需导入使用语句。
-
按照你的做法,类名实际上是
foo\A\A和foo\B\B。所以类加载器正在寻找文件ROOT/A/A.php和ROOT/B/B.php。它们存在吗? -
是的,就是这样,所以有什么方法可以只导入java之类的类,而不是完整的命名空间?
-
你的意思是像
use foo\B\B as B? ;)
标签: php namespaces autoload