什么时候PHP需要在创建之前看到一个类?

Ale*_*eal 11 php

PHP不需要前向声明.

$core = new Core();
class Core {
Run Code Online (Sandbox Code Playgroud)

工作良好

$test = new ParamSet(new IntParam(1));
echo($test->asString());

interface ParamType {
    /*snipped*/
}

class IntParam implements ParamType {
    /*snipped*/
}

class ParamSet implements ParamType {
    /*snipped*/
}
Run Code Online (Sandbox Code Playgroud)

没有,我得到:

Fatal error: Class 'ParamSet' not found in
Run Code Online (Sandbox Code Playgroud)

不知道为什么,我已经包含了层次结构,因为它很重要.将$ test移动到定义之下使其工作.

Alm*_* Do 7

被视为一个错误(发送此帖子时是错误,但后来标记为不是错误 - 顺便说一句,感谢这个问题.那个"错误"被关闭了).

事情是 - 甚至class_exists()(即标准指标功能)将显示它实际上不存在:

//false, true
var_dump(class_exists('ParamSet'), class_exists('IntParam'));

interface ParamType {
    /*snipped*/
}

class IntParam  {
    /*snipped*/
}

class ParamSet implements ParamType {
    /*snipped*/
}
Run Code Online (Sandbox Code Playgroud)

解决方案 - 是的,在接口定义之后创建类实例- 并且 - 在类定义之后 - 甚至 - .

重要更新

实际上,虽然bugs.php.net说这是一个bug,但在与PHP内部聊天之后 - 我意识到它不是一个bug(好吧,绝对不是"bug").这是一种预期的行为.

实际的原因是:实现一个接口将类声明转换为条件声明.因此,将在运行时而不是在解释阶段进行评估.这就是为什么class_exists()和其他东西在这种情况下不会确定类定义的原因.因此,虽然解决方案将保持相同(即声明实例化) - 重要的是更新我对这种行为的所有原因不正确.