【问题标题】:PHP Autoloading With class_exists confusionPHP 自动加载与 class_exists 混淆
【发布时间】:2019-10-16 05:31:20
【问题描述】:

我正在开发一个应用程序,其中有很多 PHP 类,我编写如下所示的类

<?php

if(!class_exists('AClass1')){
  class AClass1{
  }
}

?>

同样我有大约 400 个类,而且我使用 php 自动加载器脚本 https://github.com/varunsridharan/php-autoloader 连同一个类图生成器 https://github.com/varunsridharan/php-classmap-generator

所以当我写下如下条件时会发生什么

if(class_exists('AClass1')){
  // Some Code To RUN
}

在上面的代码中,如果 AClass1 类不存在,那么它会通过 class_exists 函数自动加载,这对我有好处

但是当我在一个名为 aclass1.php

的文件中编写这样的代码时
<?php

if(!class_exists('AClass1')){
  class AClass1{
  }
}

?>

如果该文件是通过上面的 if 条件加载的,那么在加载文件后它仍然循环到自动加载器而不是它应该注册类

那么有什么好方法可以避免循环进入自动加载器,即使文件在类源中

  1. 注册课程时切勿使用class_exists
  2. 使用class_exists('CLASSNAME',false) 避免自动加载器内部循环

【问题讨论】:

  • 您为什么不简单地为您的文件添加一个唯一的命名空间,而不是放入一堆class_exists()?然后你可以拥有多少个你想要的同名的类,只要它们有不同的命名空间。
  • @MagnusEriksson 我用命名空间创建了我的项目。但唯一的问题是它是一个 wordpress 框架github.com/wponion/wponion
  • 你为什么要检查你要定义的类是否存在?我的意思是您可以使用带有 false 的 class_exists 作为第二个参数。但这对我来说毫无意义,除非你正在创建某种“polyfill”。但是,如果您试图防止多次包含文件时出错,那么就不要多次包含该文件。就这么简单...
  • 如果它是一个 wordpress 框架,为什么重要?它仍然是 PHP。如果您将它们放在名称空间中,那么class_exists() 首先有什么意义?您实际上想通过使用它们来解决什么问题?
  • @slepic 对不起,我很困惑,:-( 你介意解释一下吗

标签: php


【解决方案1】:

我写了一个简单的测试看看是否存在包含循环:

test.php

<?php

// The simpliest autoloader
spl_autoload_register(function ($class) {
  include __DIR__ . '/Hello.php';
});

if (class_exists('Hello')) {
  $hello = new Hello();
  exit('class exists');
} else {
  exit('class does not exists');
}

你好.php

<?php

if (!class_exists('Hello')) {
  class Hello {
  }
}

我将这两个文件放在同一个文件夹中。然后我运行:

php test.php

没有错误或循环。它只是打印:

class exists

但坦率地说,如果您使用自动加载器,则根本不需要 class_exists 签入您的类文件。仅当当前环境中不存在该类时才会调用自动加载器。所以除非你手动include一个类文件它被自动加载,你会没事的。

如果出于某种奇怪的原因,您可能会遇到这种情况,请使用 include_once 而不是 include

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多