使用 Symfony 1.4 的自动加载器加载命名空间类?

Posted

技术标签:

【中文标题】使用 Symfony 1.4 的自动加载器加载命名空间类?【英文标题】:Loading namespaced classes with Symfony 1.4's autoloader? 【发布时间】:2011-09-09 09:26:24 【问题描述】:

如何在 Symfony 1.4 中为自动加载器类功能(如 Symfony 2.0)注册命名空间(使用 php 5.3)?

【问题讨论】:

你最终能否让 Symfony 1.4 自动加载与命名空间一起工作?如果是这样,你能告诉我怎么做吗? 【参考方案1】:

您可以使用Composer,这非常简单。只需将它安装在你的机器上(你可能已经在 2015 年了)并在你的项目文件夹中运行:

composer init 

然后,您可以使用 composer 安装所有您想要的软件包,并在您的 ProjectConfiguration.class.php 中仅包含这一行:

require_once __DIR__.'/../vendor/autoload.php';

请注意,如果您更改了默认 Symfony1.4 目录结构,路径可能会有所不同。

【讨论】:

Symfony 1.4 不知道如何在命名空间中加载类,你必须实现这个特性。 Composer 只是一个包/库管理器。 Composer 也提供了一个 ClassLoader,当您安装(使用 Composer 俚语“require”)包时,您所要做的就是包含上面的 vendor/autoload.php 脚本。 Composer 负责映射已安装包中的命名空间,所有这些。你试过了吗?我这样做了,效果很好。 感谢您为我提供的解决方案。您需要指定 vendor-dir: "lib/vendor" 以在 sf 1.4 的原始供应商目录中拥有库;将它用于 amp-library,它工作正常。【参考方案2】:

您可以在 Symfony 1.4 框架中使用来自 Symfony2 的 Autoloader。

1.将 Symfony2 类加载器复制到 Symfony 1.4 沙盒项目的供应商目录:

SF_ROOT_DIR/lib/vendor/Symfony2/src/Symfony/Component/ClassLoader/UniversalClassLoader.php

SF_ROOT_DIR/lib/vendor/Symfony2/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php

2.修改你的 SF_ROOT_DIR/config/ProjectConfiguration.class.php 文件如下:

require_once dirname(__FILE__) . '/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
require_once dirname(__FILE__) . '/../lib/autoload/sfClassLoader.class.php';
sfCoreAutoload::register();

class ProjectConfiguration extends sfProjectConfiguration 

    public function setup() 
        $this->namespacesClassLoader();
        $this->enablePlugins('sfDoctrinePlugin');
    

    public function namespacesClassLoader() 
       if (extension_loaded('apc')) 
           $loader = new ApcUniversalClassLoader('S2A');
        else 
           $loader = new UniversalClassLoader();
       
       $loader->registerNamespaces(array(
          'Pohon' => __DIR__ . '/../lib/vendor/Pohon/src'));
       $loader->register();
    


3. 注册所需的命名空间: 例如。我要加载类:

Pohon\Tools\String\Utils\Slugify。

文件名必须是:

SF_ROOT_DIR/lib/vendor/Pohon/src/Pohon/Tools/String/Utils/Slugify.php

并注册命名空间如下:

Pohon => SF_ROOT_DIR/lib/vendor/Pohon/src

【讨论】:

Autoloader 项目可以在这里找到:github.com/Symfony-Plugins/sfClassLoaderPlugin. 漂亮,谢谢!我必须在 ProjectConfiguraration.class.php 文件中的导入之后添加use Symfony\Component\ClassLoader\UniversalClassLoader; use Symfony\Component\ClassLoader\ApcUniversalClassLoader;。此外,这里是 ClassLoader 包的链接(在这些类被弃用之前):github.com/symfony/ClassLoader/tree/2.6【参考方案3】:

Symfony 使用 spl_autoload_register() 函数来注册它自己的自动加载器 (sfAutoload)。

您可以在项目/应用程序/插件的initialize() 函数中注册自己的处理程序。 (以适用者为准)。

这也是Swift_Mailer 插件的作用:它在需要时注册自己的自动加载器。

【讨论】:

以上是关于使用 Symfony 1.4 的自动加载器加载命名空间类?的主要内容,如果未能解决你的问题,请参考以下文章

PHP使用来自作曲家的自动加载器添加自定义命名空间

作曲家自动加载器 psr-0 命名空间

symfony2:试图从命名空间加载类“Memcache”

使用命名空间和自动加载器找不到类

Symfony4加载类自定义文件夹时出错“预计找到类...但是找不到它”

Zend Framework 1.11:如何自动加载使用命名空间的类