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

时间:2015-08-05 21:59:07

标签: php namespaces autoload spl

可以在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::)的情况下使用。

2 个答案:

答案 0 :(得分:3)

你不能。这就是使用命名空间的重点。您可以引用类whitout反斜杠或Fancy 1语句(如果它位于您使用它的同一名称空间中)。您无法自动加载自动加载器以将目标类自动导入当前命名空间,从而动态更改其命名空间。

如果您的课程不属于名为的命名空间,那么它位于全局命名空间中,您仍然必须使用LinAlgErroruse。对于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