PHP 不需要前向声明。
$core = new Core();
class Core {
工作正常
$test = new ParamSet(new IntParam(1));
echo($test->asString());
interface ParamType {
/*snipped*/
}
class IntParam implements ParamType {
/*snipped*/
}
class ParamSet implements ParamType {
/*snipped*/
}
没有,我得到:
Fatal error: Class 'ParamSet' not found in
不知道为什么,我已经包含了层次结构,以防它很重要。将 $test 移到定义下方使其工作。
最佳答案
它被视为 bug (发送此帖子时是错误,但后来标记为不是错误 - 顺便说一下,感谢这个问题。那个“错误”已关闭)。
事情是 - 甚至 class_exists()
(即标准指标功能)将显示它实际上不存在:
//false, true
var_dump(class_exists('ParamSet'), class_exists('IntParam'));
interface ParamType {
/*snipped*/
}
class IntParam {
/*snipped*/
}
class ParamSet implements ParamType {
/*snipped*/
}
解决方案 - 是的,在接口(interface)上定义之后 创建类实例 - 甚至 - 在类定义之后。
重要更新
实际上,虽然 bugs.php.net
说这是一个错误,但在与 PHP 内部人员交谈后 - 我意识到这不是一个错误(嗯,绝对不是“漏洞”)。这是一种有意的行为。
真正的原因是:实现接口(interface)将类声明变成了条件声明。所以这将在运行时而不是在解释阶段进行评估。这就是为什么 class_exists()
和其他东西在这种情况下不会确定类定义。
因此,虽然此解决方案将保持不变(即实例化 after 声明)- 重要的是要更新我对此类行为的所有原因都不正确。
关于php - PHP 什么时候需要在创建类之前查看类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23055172/