可以在spl_autoload_register
(自动)中访问 Class 吗?
例如,我在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::
)的情况下使用。
答案 0 :(得分:3)
你不能。这就是使用命名空间的重点。您可以引用类whitout反斜杠或Fancy 1
语句仅(如果它位于您使用它的同一名称空间中)。您无法自动加载自动加载器以将目标类自动导入当前命名空间,从而动态更改其命名空间。
如果您的课程不属于名为的命名空间,那么它位于全局命名空间中,您仍然必须使用LinAlgError
或use
。对于python,java,go,.net,c / c ++等中的\
或use
关键字也是如此。
答案 1 :(得分:-1)
除了使用use ... as ...
或“反斜杠”(\
)之外,没有任何标准要做,但我们可以使用{{1} “欺骗PHP” } eval()
内的spl_autoload_register()
内的 Utils类。
只有在必要时才使用此功能,更喜欢使用“反斜杠”(
namespace
)或\
示例(读取代码中的注释):
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