有没有办法动态更改自动加载的类的名称?

发布于 2024-11-04 15:18:51 字数 682 浏览 0 评论 0 原文

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

$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);
    }
}

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

For instance, say I have the following code.

$foo = new bar();

And an autoloader like this.

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

But the class I really want to load is in the folder 'foo/bar.php', and the real class name is actually foo_bar. Is there a way to dynamically change the name of the class being autoloaded? For instance, something like this?

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);
    }
}

I know if something like this is possible, it is not exactly best practice, but I would still like to know if it is.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

辞取 2024-11-11 15:18:51

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

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

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

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

No. You could load a different file. You could load no file. You could load several files. But after autoloading, PHP expects the class to exist like it was called.

If you call a class X, you can't magically give PHP class Y.

Maybe it's enough to set up the filesystem like that, but still keep literal class names?

PS
I've wanted this for a while too. When I didn't have access to namespaces yet. Now that I do, all my problems are solved =) If you do have access to namespaces, you should 'study' PSR-0.

寂寞清仓 2024-11-11 15:18:51

也许你可以使用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);
    }
}

希望它可以帮助您。

Maybe you can use class_alias, this way:

  • PHP requires class X
  • You want load class Y instead.
  • You create an alias X for class Y, so X will behave like Y.

E.g.:

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);
    }
}

Hope it can help you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文