如何使用Symfony类加载器

时间:2017-04-18 08:44:43

标签: php symfony classloader

我有以下结构

API

通用

配置

文档

脚本

供应商

我将自定义自动加载器放在包含

的common / 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();

1 个答案:

答案 0 :(得分:1)

不言而喻:

use Symfony\ClassLoader\ClassLoader;

$loader = new \ClassLoader();

你应该这样做:

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

或:

use Symfony\ClassLoader\ClassLoader;

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

当你在classname前放一个反斜杠时,它意味着根命名空间,所以你之前放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.

修改

至于您在更新后的问题中的问题 - 可能与区分大小写有关。尝试使您的目录名称与名称空间匹配,包括区分大小写。