Как автоматически использовать корневые классы во всех пространствах имен с помощью spl_autoload?

Можно сделать доступным Учебный класс в spl_autoload_register (автоматически)?

Например, я использую spl_autoload_register в index.php:

<?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...
}
}

Если мне нужно использовать Утильс класс Мне придется добавить new \Controllers\Foo\User в файле user.php как это:

public function foo() {
\Utils::example();
}

или же

<?php
namespace Controllers/Foo;

use \Utils as Utils;

class User
{
public function foo() {
Utils::example();
}
}

Можно сделать доступным для Утильс класс в spl_autoload_register (автоматически)? Я бы использовал без use \Utils as Utils; и без обратной косой черты (\Utils::).

1

Решение

Ты не можешь В этом весь смысл использования пространств имен. Вы можете сослаться на класс без обратной косой черты или use заявление только если он находится в том же пространстве имен, которое вы используете. Вы не можете взломать автозагрузчик, чтобы автоматически импортировать целевой класс в текущее пространство имен, изменяя его пространство на лету.

Если ваш класс не принадлежит названный пространство имен, то это в Глобальный пространство имен, и вы все равно должны использовать с \ или же use, То же самое для import или же use ключевые слова в python, java, go, .net, c / c ++ и т. д.

3

Другие решения

Там нет стандартного ничего, чтобы сделать это, кроме использования use ... as ... или «обратная косая черта» (\), однако мы можем «обмануть PHP» с помощью eval() в пределах spl_autoload_register() продлить Утильс класс в пределах 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 не работать в eval

-1

По вопросам рекламы [email protected]