【问题标题】:require_once() and autoloader - How to load flat php?require_once() 和 autoloader - 如何加载平面 php?
【发布时间】:2012-09-12 14:42:15
【问题描述】:

我有一个文件(一个用于 PHP 的 xmlrpc 库),我想将它用于 Symfony2 类(所以在 Symfony2 项目中)。

我不能使用自动加载器,因为写在here

它能够[自动加载器]从文件中加载类 执行以下约定之一:

1) The technical interoperability standards for PHP 5.3 namespaces and 
   class names;
2) The PEAR naming convention for classes.

如果您的项目使用的类和第三方库 遵循这些标准,Symfony2 自动加载器是唯一的自动加载器 您将永远需要。

我要使用的类不满足其中一项要求。

因此,如果我无法自动加载该文件,因为不可能(据我了解,但我可能会出错)将require_once(或简单的require)与namespace 一起使用,解决方案是什么这个问题?

【问题讨论】:

  • 我问了一个类似的问题,并得到了很好的建议。见stackoverflow.com/questions/11903432/…
  • @CarlosGranados 我的文件包含多个类...这个解决方案适合我的具体情况吗?此外,我使用 MapClassLoader 注册了我的“旧”php 文件:然后我是否可以像注册到自动加载器一样使用它(所以使用src/to/my/file/folder/path)?
  • 我认为应该可以。作曲家所做的是注册类的地图以及他们“居住”的地方。然后,您只需为这些类添加“使用”语句。如果他们不使用命名空间,只需添加使用类名。如果他们使用命名空间添加使用 FQN

标签: php symfony


【解决方案1】:

假设您有一个名为xmlrpc.lib.php 的文件,其内容如下:

<?php 
class XMLRPC_Server {
    // ...
}

class XMLRPC_Request {
    // ...
}

class XMLRPC_Response {
    // ...
}

您可以创建MapClassLoader 的实例来处理它的自动加载:

// Create map autoloader
$mapLoader = new MapClassLoader(array(
    'XMLRPC_Server' => __DIR__.'/../library/xmlrpc.lib.php',
    'XMLRPC_Request' => __DIR__.'/../library/xmlrpc.lib.php',
    'XMLRPC_Response' => __DIR__.'/../library/xmlrpc.lib.php',
));

// Register autoloader
$mapLoader->register();

当这些类之一将被自动加载时,其他类也将被自动加载,因为它们共享同一个 PHP 文件。

【讨论】:

  • 这是一个很好的方法。我们使用了另一个比你更糟糕的“技巧”:创建一个使用require_once() 的“包装”类,因此将包含该文件和所有这些类。然后我们在该文件上使用 MapClassLoader 并且它可以工作......不是你的解决方案,但它可以工作;-)
猜你喜欢
  • 2013-01-10
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多