У меня следующая структура
апи
общий
конфиг
документы
скрипты
продавец
Я поместил пользовательский автозагрузчик в общий / 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();
От этого:
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.
РЕДАКТИРОВАТЬ:
Что касается вашей проблемы в вашем обновленном вопросе — это может быть связано с чувствительностью к регистру. Попробуйте сделать так, чтобы имена ваших каталогов соответствовали пространству имен, включая регистр символов.
Других решений пока нет …