[英]How to use roots classes in all namespaces automatically with spl_autoload?
是否可以在spl_autoload_register
自动访问类 ?
例如,我在index.php中使用spl_autoload_register
:
<?php
class Utils {
public function example() {
echo 'Hello word!';
}
}
spl_autoload_register(function($class)
{
$relative_class = strtolower(str_replace('\\', '/', $class));
$file = './src/' . $relative_class . '.php';
if (is_file($file)) {
require_once $file;
}
});
$user = new \Controllers\Foo\User;
这个new \\Controllers\\Foo\\User;
自动加载该文件./src/controllers/foo/user.php
user.php的:
<?php
namespace Controllers/Foo;
class User
{
public function foo() {
//Something...
}
}
如果需要使用Utils类 ,则必须在文件user.php中添加new \\Controllers\\Foo\\User
,如下所示:
public function foo() {
\Utils::example();
}
要么
<?php
namespace Controllers/Foo;
use \Utils as Utils;
class User
{
public function foo() {
Utils::example();
}
}
是否可以使spl_autoload_register
Utils类可访问(自动)? 我会不use \\Utils as Utils;
并且没有反斜杠( \\Utils::
。
你不能 这就是使用命名空间的全部意义。 仅当类反斜杠或use
语句与您使用的名称空间位于同一名称空间时, 才可以引用该类。 您无法破解自动加载器以将目标类自动导入到当前名称空间中,从而动态更改其名称空间。
如果您的类不属于命名命名空间,则它在全局命名空间中,您仍然必须使用\\
或use
。 对于python,java,go,.net,c / c ++等中的import
或use
关键字也是如此。
除了将use ... as ...
或“反斜杠”( \\
)外,没有任何其他标准可做,但是我们可以在spl_autoload_register()
使用eval()
来“欺骗PHP”,以扩展Utils类 。 namespace
。
仅在确实必要时使用此选项,
use \\Utils as Utils
使用“反斜杠”(\\
)或use \\Utils as Utils
示例(阅读代码注释):
<?php
class Utils {
public static function example() {
echo 'Hello World!';
}
}
spl_autoload_register(function($class)
{
$relative_class = strtolower(str_replace('\\', '/', $class));
$file = './src/' . $relative_class . '.php';
if (is_file($file)) {
$np = explode('\\', $class); //Dividi string
//Check if class exists in namespace (prevent conflicts)
if (class_exists(implode('::', $np)) === false) {
//Remove "class name", use only "namespace"
array_pop($np);
//evaluate a namespace in eval (extends the Utils class)
eval(
'namespace ' . implode('\\', $np) . ' {' . PHP_EOL .
'class Utils extends \Utils {}' . PHP_EOL .
'}'
);
}
require_once $file;
}
});
$user = new \Controllers\Foo\User;
$user->foo(); //Show "Hello word!"
我承认这是一个丑陋的技巧 ,也许我不会使用,但这仍然是一个提示。
注意:
use \\Utils as Utils
在eval
不起作用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.