Пространства имен PHP spl_autoload_register мешают включению файлов

0

Я не знаю, не хватает ли я чего-то, но использование пространств имен, похоже, нарушает мое приложение. Он не найдет родительский класс, поскольку он включает пространство имен в имени класса при вызове регистра автозагрузки

spl_autoload_register(function($classname){
    if (preg_match('/[a-zA-Z]+Controller$/', $classname)) {
        echo __DIR__ . '/controllers/' . $classname.".php" . "<br />";
        require __DIR__ . '/controllers/' . $classname.".php";
    }
});

//echo produces:
/var/www/web/controllers/DefaultController.php
/var/www/web/controllers/Project\Controllers\BaseController.php

Project\Controllers - это пространство имен, используемое как в стандартном, так и в базовом контроллере. Значение по умолчанию расширяет базовый контроллер.

Почему это делает автозагрузка spl?

Состав:

веб/контроллеры:

BaseController.php

DefaultController.php

BaseController:

namespace Project\Controllers;

class BaseController
{
    private $config;

    public function __construct($config)
    {
        $this->config = $config;
    }
}

контроллера по умолчанию:

<?php
namespace Project\Controllers;

class DefaultController extends BaseController
{
}
  • 0
    @MichaelBerkowski Я так растерялся. Пространство имен объявлено в обоих файлах. Как бы вы включили файл, принимая во внимание пространство имен?
Теги:
spl-autoload-register

1 ответ

0

Основные проблемы, похоже, в том, что ваш автозагрузчик не знает о корневом пространстве имен, к которому он принадлежит. Поэтому действительно ваш автозагрузчик должен быть осведомлен или быть частью пространства имен, поэтому в этом случае Project.

Итак, первое, что нужно сделать автозагрузке, это удалить известное корневое пространство имен (если, конечно, оно не используется как часть файловой структуры, которая в этом случае не является)

<?php namespace Project;

// Within the namespace
$classname = ltrim(str_replace(__NAMESPACE__ . '\\', '', $classname), '\\');

// Outside of the namespace
$classname = ltrim(str_replace('Project\\', '', $classname), '\\');

Теперь для имени класса и фактического расположения файла.

// find the last backslash
if($last = strripos($classname, '\\')) {
    $namespace = substr($classname, 0, $last); // Controllers
    $classname = substr($classname, $last+1); // DefaultController
}

Теперь вы можете создать фактическое местоположение файла в файле класса PHP

$filepath = '/var/www/'; // Root
if(isset($namespace)) {
    // Add the controllers bit onto the root
    $filepath .= str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
// add the class name (DefaultController) to the file path
$filepath .= str_replace('\\', DIRECTORY_SEPARATOR, $classname) . '.php';

Это должно привести к следующим файлам, которые могут быть проверены, если они будут включены, если они это сделают.

/var/www/Controllers/BaseController.php

/var/www/Controllers/DefaultController.php

Ещё вопросы

Сообщество Overcoder
Наверх
Меню