[英]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.