PHP spl_autoload_register не может загрузить класс с требуемой областью при использовании пространства имен

Ok!!! Теперь я меньше понимаю, почему spl_autoload_register () не может загрузить класс.

Моя структура папок такая ..

  • заявление

    • controller
      • welcome.php
  • система

    • core
      • BaseController.php
      • Load.php
  • index.php

Мой код BaseController.php

<?php
namespace system\core;

class BaseController {
    public function __construct() {
        spl_autoload_register(array($this, 'loader'));
    }

    private function loader($className) {              
        $className = ltrim($className, '\\');
        $fileName  = '';
        $namespace = '';
        if ($lastNsPos = strrpos($className, '\\')) {
            $namespace = substr($className, 0, $lastNsPos);
            $className = substr($className, $lastNsPos + 1);
            $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }
        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

        require $fileName;
    }
}

Мой код Load.php

<?php
namespace system\core;

class Load  {
    public function view()
    {
        echo "Method for loading view";
    }
}

Мой код welcome.php

<?php
class Welcome extends system\core\BaseController {
    public function index()
    {
        $obj_load = new Load();
        $obj_load->view();
    }
}

Мой код index.php

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

require_once "system/core/BaseController.php";
require_once "application/controller/welcome.php";
$welcome = new welcome();
echo $welcome->index();

Когда я выполняю этот код (index.php), я получаю следующую ошибку ...

Fatal error: Class 'Load' not found in /var/www/nut/test/application/controller/welcome.php on line 5

Но если я удалю пространство имен из Load.php, я не получаю никаких ошибок. Я не могу понять, почему это пространство имен (используемое в Load.php) создает ошибку.

Любая мысль ...

С Уважением


person Suresh    schedule 13.07.2014    source источник
comment
Имя вашего класса system\core\Load; вы пытаетесь загрузить 'system/core/'.$className . '.php';, который соответствует файлу с именем _3 _....   -  person Mark Baker    schedule 13.07.2014
comment
Ваш автозагрузчик должен преобразовывать разделители пространства имен в имени класса в разделители папок и использовать их, а не пытаться жестко их закодировать.   -  person Mark Baker    schedule 13.07.2014
comment
@MarkBaker Я удалил свой код автозагрузчика и теперь использую пример кода PHP-FIG, как показано в этой ссылке - ›php-fig.org/psr/psr-0 Но я все равно получаю ту же ошибку.   -  person Suresh    schedule 13.07.2014


Ответы (1)


Как заметил Марк, вы используете неправильный символ при попытке включить ваши файлы. Эта страница должна прояснить ситуацию.

Изменить: в вашем коде было довольно много ошибок. Вся суть пространств имен заключается в том, что вы должны ссылаться на них правильно (а также правильно объявлять их, вы не смогли сделать и то, и другое, поэтому код автозагрузки не работал) .Кроме того, у кода автозагрузки не было реальной возможности запустить, так как у вас было он спрятан внутри конструктора для класса, который никогда не загружается. Попробуй это:

index.php

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

require_once("system/core/AutoLoader.php");
$welcome = new \application\controller\welcome();
echo $welcome->index();

welcome.php (обратите внимание на имя класса в нижнем регистре и добавление пространства имен)

<?php

namespace application\controller;

class welcome extends \system\core\BaseController {
    public function index()
    {
        $obj_load = new \system\core\Load();
        return $obj_load->view();
    }
}

Load.php

<?php
namespace system\core;

class Load  {
    public function view()
    {
        return "Method for loading view";
    }
}

BaseController.php

<?php
namespace system\core;

class BaseController {
//  public function __construct() {
//      spl_autoload_register(array($this, 'loader'));
//  }
//
//  private function loader($className) {
//      $className = ltrim($className, '\\');
//      $fileName  = '';
//      $namespace = '';
//      if ($lastNsPos = strrpos($className, '\\')) {
//          $namespace = substr($className, 0, $lastNsPos);
//          $className = substr($className, $lastNsPos + 1);
//          $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
//      }
//      $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
//
//      require $fileName;
//  }
}

новый файл: system \ core \ AutoLoader.php

<?php

namespace system\core;

class AutoLoader {

    static public function loader($className) {
        $className = ltrim($className, '\\');
        $fileName  = '';
        $namespace = '';
        if ($lastNsPos = strrpos($className, '\\')) {
            $namespace = substr($className, 0, $lastNsPos);
            $className = substr($className, $lastNsPos + 1);
            $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }
        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

        require $fileName;
    }

}

spl_autoload_register(array('\system\core\AutoLoader', 'loader'));

Я также изменил код, чтобы вернуть строку вместо ее отображения, поскольку вы уже повторяете ее внутри index.php

person Greg K    schedule 13.07.2014
comment
Я удалил свой код автозагрузчика и теперь использую пример кода PHP-FIG, как показано в этой ссылке - ›php-fig.org/psr/psr-0 Но я все равно получаю ту же ошибку. - person Suresh; 13.07.2014
comment
Я понял. Получил какой-то урок. Спасибо за ваш быстрый ответ. - person Suresh; 13.07.2014