我想自动加载我的类,只放置命名空间+文件名。
示例:
目录骨架:
\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类中使用classname声明命名空间,当我使用它时,我打印__autoload的变量并且是正确的,在调用构造函数时,bur,找不到类。< / p>
错误:
Fatal error: Class 'foo\A' not found in /var/www/foo/B.php on line 7
如果我只实例化A,而我不使用B,问题是一样的。
我需要像这样做,因为我想要在B类中,如果你不使用use语句就不能使用A,要做得更严格。
如果你理解我的解释问题,我现在不行,但无论如何都要感谢任何建议!!
PD:对不起我的英语技能。答案 0 :(得分:4)
您的代码应该是类:
<强> a.php只会强>
<?php
namespace foo;
class A {
private $a;
public function __construct($a) {
$this->a = $a;
}
}
<强> B.php 强>
<?php
namespace foo;
class B extends A {
private $b;
public function __construct($a, $b) {
parent::__construct($a);
$this->b = $b;
}
}