繁体   English   中英

如何通过spl_autoload在所有名称空间中自动使用根类?

[英]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 ++等中的importuse关键字也是如此。

除了将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 Utilseval不起作用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM