Я не знаю, не хватает ли я чего-то, но использование пространств имен, похоже, нарушает мое приложение. Он не найдет родительский класс, поскольку он включает пространство имен в имени класса при вызове регистра автозагрузки
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
{
}
Основные проблемы, похоже, в том, что ваш автозагрузчик не знает о корневом пространстве имен, к которому он принадлежит. Поэтому действительно ваш автозагрузчик должен быть осведомлен или быть частью пространства имен, поэтому в этом случае 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