3

例如,假设我有以下代码。

$foo = new bar();

还有像这样的自动装载机。

function autoload($class_name) {
    $class_file_name = str_replace('_', '/', $class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
    }
}

但是我真正要加载的类是在文件夹'foo/bar.php'中,而真正的类名实际上是foo_bar。有没有办法动态更改正在自动加载的类的名称?例如,像这样的东西?

function autoload(&$class_name) {
    $class_name = 'foo_' . $class_name;
    $class_file_name = str_replace('_', '/', $class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
    }
}

我知道这样的事情是否可行,这并不是最佳实践,但我仍然想知道是否可行。

4

2 回答 2

3

不,您可以加载不同的文件。你不能加载任何文件。您可以加载多个文件。但是在自动加载之后,PHP 期望类像被调用一样存在。

如果你调用一个类 X,你不能神奇地给 PHP 类 Y。

也许像这样设置文件系统就足够了,但仍然保留文字类名?

PS
我也想要这个有一段时间了。当我还没有访问命名空间的时候。现在我这样做了,我所有的问题都解决了 =) 如果您确实可以访问命名空间,那么您应该“学习” PSR-0

于 2011-05-02T20:10:12.620 回答
0

也许您可以这样使用class_alias

  • PHP 需要 X 类
  • 您想要加载 Y 类。
  • 您为类 Y 创建了一个别名 X,因此 X 的行为类似于 Y。

例如:

function autoload($class_name) {
    $real_class_name = 'foo_' . $class_name;
    $class_file_name = str_replace('_', '/', $real_class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
        class_alias($real_class_name, $class_name);
    }
}

希望它可以帮助你。

于 2011-05-02T20:29:08.070 回答