как использовать Symfony Class Loader

У меня следующая структура

апи

общий

конфиг

документы

скрипты

продавец

Я поместил пользовательский автозагрузчик в общий / php / autoload.php, который содержит

<?php
require_once BASE_DIR . 'vendor/autoload.php';
require_once BASE_DIR . 'vendor/symfony/class-loader/ClassLoader.php';

use Symfony\ClassLoader\ClassLoader;

$loader = new \ClassLoader();

// to enable searching the include path (eg. for PEAR packages)
$loader->setUseIncludePath(true);

// ... register namespaces and prefixes here - see below

$loader->register();

// register a single namespaces
$loader->addPrefix('CCP', BASE_DIR . 'common/ccp/');// cache files locations
require_once BASE_DIR . 'vendor/symfony/class-loader/ApcClassLoader.php';

// sha1(__FILE__) generates an APC namespace prefix
$cachedLoader = new ApcClassLoader(sha1(__FILE__), $loader);

// register the cached class loader
$cachedLoader->register();

// deactivate the original, non-cached loader if it was registered previously
$loader->unregister();

Как вы знаете, композитор помещает все в папку ROOTDIR / vendor.

Error I get is Fatal error: Uncaught Error: Class 'ClassLoader' not found in ROOTDIR/common/php/autoload.php:7

ОБНОВИТЬ

Когда я пытаюсь загрузить свой пользовательский класс в common / ccp, он не загружается.

Fatal error: Uncaught Error: Class 'CCP\Notification' not found in ROOTDIR/scripts/cli-test-email.php:12

содержание класса

<?php
namespace CCP

class Notification{
...
}

ОБНОВЛЕНИЕ 2

Мои сценарии находятся под script папка. Если я добавлю use это не ошибка, но ничего не происходит с точки зрения эха или каких-либо ошибок. Если я удалю use это не находит класс Notification,

#!/opt/SP/php-7.0.10/bin/php -q
<?php
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(E_ALL|E_STRICT);
echo "before use";
use CCP/Notification;
echo "after use";

$notification = new Notification();

print_r($notification);
$notification->emailTest();

2

Решение

От этого:

use Symfony\ClassLoader\ClassLoader;

$loader = new \ClassLoader();

Вы должны сделать либо:

$loader = new Symfony\ClassLoader\ClassLoader();

или же:

use Symfony\ClassLoader\ClassLoader;

$loader = new ClassLoader(); //no backslash at the begining

Когда вы ставите обратную косую черту перед именем класса, это означает корневое пространство имен, поэтому не имеет значения, что вы ставите use раньше, потому что он здесь не используется.

В качестве примера давайте предположим, что у вас есть два класса с одинаковым именем SomeClass, Один из них находится под корневым пространством имен, а другой — под Some/Namespace/SomeClass

Сейчас:

use Some/Namespace/SomeClass;

$object1 = new SomeClass(); //this is Some/Namespace/SomeClass instace
$object2 = new \SomeClass(); //this is SomeClass from root namespace.

РЕДАКТИРОВАТЬ:

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

1

Другие решения

Других решений пока нет …