Где ошибка? Namespaces

dredder

Кэп
Всем привет! Решил посмотреть про Namespaces в PHP. Создал проект, начал делать так, как написано в этой статье https://habrahabr.ru/post/212773/

Создал проект с такой структурой:

Файл another.php содержит такой код:

Код:
class Eddard{
    public function hello(){
        echo "Hello world 2 !";
    }
}
А файл routes.php такой:
Код:
$eddard = new Stark\Eddard();
Т.е. по идеи класс должен был запуститься, но он не работает, пишет, что класс Eddard не найден! Скажите, пожалуйста почему.
Работаю в phpStorm, php 7.1
 

dredder

Кэп
Я не дописал содержание another.php. Там вот такой код:
Код:
namespace Stark;

class Eddard{
    public function hello(){
        echo "Hello world 2 !";
    }
}
 

AnrDaemon

Продвинутый новичок
Я тут одну фигнюшку написал…
PHP:
<?php
/** Universal stackable classloader.
*
* @version SVN: $Id: classloader.php 610 2016-07-30 18:41:52Z anrdaemon $
*/

namespace AnrDaemon;

use SplFileInfo;

spl_autoload_register(function($className)
{
  $nl = strlen(__NAMESPACE__);
  if(strncasecmp($className, __NAMESPACE__ . '\\', $nl + 1) !== 0)
    return;

  $file = new SplFileInfo(__DIR__ . strtr(substr("$className.php", $nl), '\\', '/'));
  $path = $file->getRealPath();
  if(!empty($path))
  {
    include_once $path;
  }
});
 

fixxxer

К.О.
Партнер клуба
@AnrDaemon, stream_resolve_include_path не?

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

AnrDaemon

Продвинутый новичок
Не, спасибо, чего мне не надо, так это include_path. При том, что /lib там вообще нету.
Компосер хорошо, но не для нового кода. А я эту заглушку пихаю во все новые проекты, и она легко стакается и с компосером и с другими загрузчиками, и не конфликтует с моими же либами, грузящимися из основного /lib.
Что оччень, знаешь ли, полезно, когда надо какой-то класс переписать, и не убить в процессе работающие приложения.
 

dredder

Кэп
Я тут одну фигнюшку написал…
PHP:
<?php
/** Universal stackable classloader.
*
* @version SVN: $Id: classloader.php 610 2016-07-30 18:41:52Z anrdaemon $
*/

namespace AnrDaemon;

use SplFileInfo;

spl_autoload_register(function($className)
{
  $nl = strlen(__NAMESPACE__);
  if(strncasecmp($className, __NAMESPACE__ . '\\', $nl + 1) !== 0)
    return;

  $file = new SplFileInfo(__DIR__ . strtr(substr("$className.php", $nl), '\\', '/'));
  $path = $file->getRealPath();
  if(!empty($path))
  {
    include_once $path;
  }
});
Не могли бы вы хотя бы примерно описать как работает ваш код либо дать ссылку по этой тематике?
Какие значения подставляются в $className? Как мне подключить файлы с интересующими меня классами? А если мне вообще все классы из проекта нужно подрубить? Мне придётся в каждом файле проекта вызывать такую функцию?
 

dredder

Кэп
Подскажите правильно ли я понял как работает функция?
PHP:
spl_autoload_register( $fun(arg) );
Она собирает имена всех классов в текущем файле и подставляет их очереди в первый аргумент arg функции $fun?
 

fixxxer

К.О.
Партнер клуба
Никто ничего не собирает, функция вызывается если класс не определен в момент первого к нему обращения.
 

dredder

Кэп
Никто ничего не собирает, функция вызывается если класс не определен в момент первого к нему обращения.
И после вызова подставляет имя этого класса так?

Т.е. вот так:
PHP:
$newObj = new SuperClass();
// SuperClass не определился, поэтому подставляется в функцию:
spl_autoload_register( $autoloader('SuperClass") );
 

AnrDaemon

Продвинутый новичок
Это даже смешнее, чем я думал.
Нет, если SuperClass не определён, вызывается клозурка, зарегистрированная раньше на стеке.
Вернее, вызывается каждая зарегистрированная функция со стека по очереди и после каждого вызова проверяется, а нашёлся ли класс.

Т.е. грубо:
PHP:
spl_autoload_register(function($classname){ ... });

$xz = new \SuperVasya\SuperClass();
/*
  $className = 'SuperVasya\SuperClass';
  foreach(spl_autoload_functions() as $function)
  {
    if(is_callable($function))
    {
      $function($className);
      if(class_exists($className, false))
      {
        break;
      }
    }
    else
    {
      throw new \UnexpectedValueException('The function provided for autoload is not callable.');
    }
  }
*/
Если где накосячил, старшие товарищи поправят.
 
Сверху