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移动到定义之下使其工作.
它被视为一个错误(发送此帖子时是错误,但后来标记为不是错误 - 顺便说一句,感谢这个问题.那个"错误"被关闭了).
事情是 - 甚至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()和其他东西在这种情况下不会确定类定义的原因.因此,虽然解决方案将保持相同(即声明后实例化) - 重要的是更新我对这种行为的所有原因不正确.
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |