CLASS_EXISTS返回不同的值

时间:2018-02-06 作者:Carsten Schmitt

在我的插件类中,我想检查这些类是否存在(可能是由另一个插件提供的),我的做法如下:

/**
* @author schmitt
*
* @file my_util_class.php
*
* @class my_util_class
*
* @brief small message
*
* big message
*/
if ( ! class_exists( \'my_util_class\' ) ) :

class my_util_class
{
   /**
    * @brief smalltest
    * bigtestmessage
    */
  public function test() {
       return "hallo";
   }

   //definition of other methods.
}

endif;
到目前为止,它运行良好。但是我想使用doxygen,但我有问题,因为doxygen没有看到if/endif构造中的类。

因此,我尝试了以下方法:

if (class_exists(\'my_util_class\')) {
    return;
}
class my_util_class {
    //...
}
但在这种情况下,“class\\u存在”,每次都给出“true”。

我检查了这些值,得到以下结果:

/*
 * Test 1
 */
$testValue = class_exists(\'my_util_class\'));; //gets true
class my_util_class {
    //...
}

/*
 * Test 2
 */
$testValue = class_exists(\'my_util_class\')); //gets false
if ( ! class_exists( \'my_util_class\' ) ) :
    class my_util_class {
        //...
    }
}
我不明白为什么。希望有人能帮助我,或者给我一个更好的方法来测试这个类是否存在?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

在PHP中,文件在执行之前会被解析,因此函数和类定义会被“提升”,以便在执行开始时定义,而不管它们是在哪里定义的。当有条件地定义条件时,不会发生这种情况,因为直到执行时才计算条件。

在PHP手册中,我只能找到这篇文档(但我可能在寻找错误的东西,“提升”是一个JS术语):

函数在引用之前无需定义,除非函数是有条件定义的,如下面两个示例所示。

以条件方式定义函数时,如所示的两个示例。必须在调用之前处理其定义。

http://php.net/manual/en/functions.user-defined.php

编辑:另一个解释,来自here.

有条件声明的类必须排在第一位。基本上,位于文件“顶层”的任何内容都由解析器在解析文件时直接处理,这是运行时环境执行代码之前的步骤(包括new Foo). 但是,如果类声明嵌套在如下语句中if, 这需要由运行时环境进行评估。即使该语句保证为true,解析器也无法计算if (true), 因此,类的实际声明被推迟到运行时。在运行时,如果您尝试运行new Foo 之前class Foo { }, 它将失败。

结束

相关推荐

初学者问题:通过管理Web界面访问Functions.php以导入自定义帖子类型?

是否可以访问这些功能。php文件仅仅使用管理web界面?我正在尝试访问以前创建的(手动编码的)自定义帖子类型,我不得不跳过很多障碍,因为我无法访问函数中的代码。php文件。我已经浏览了很多帮助页面,但建议的步骤似乎总是涉及到函数。php文件(我无法访问)或使用插件中的导入/导出工具,该插件首先创建了自定义帖子类型(据我所知,没有使用任何插件)。这似乎是一个非常基本的问题,但我一辈子都想不出来。任何帮助都将不胜感激!