簡體   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