Можно сделать доступным Учебный класс в 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::
).
Ты не можешь В этом весь смысл использования пространств имен. Вы можете сослаться на класс без обратной косой черты или use
заявление только если он находится в том же пространстве имен, которое вы используете. Вы не можете взломать автозагрузчик, чтобы автоматически импортировать целевой класс в текущее пространство имен, изменяя его пространство на лету.
Если ваш класс не принадлежит названный пространство имен, то это в Глобальный пространство имен, и вы все равно должны использовать с \
или же use
, То же самое для import
или же use
ключевые слова в python, java, go, .net, c / c ++ и т. д.
Там нет стандартного ничего, чтобы сделать это, кроме использования 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