在我的插件类中,我想检查这些类是否存在(可能是由另一个插件提供的),我的做法如下:
/**
* @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 {
//...
}
}
我不明白为什么。希望有人能帮助我,或者给我一个更好的方法来测试这个类是否存在?
最合适的回答,由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 { }
, 它将失败。