php - PHP 什么时候需要在创建类之前查看类?

标签 php

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/

相关文章:

php - 在 Laravel 中加入 select

php - API -> JSON -> MySQL

php - 在数组中设置嵌套项

php - 是否有用于 PHP 集成的 ALIPAY API?

PHP 防止创建未在类中定义的属性

php - 如何在laravel中添加新的碳功能以与碳日期一起使用?

php - 加载时显示页面

php ftp_put 不创建文件

php - 使用 jquery 删除只读属性

php - 用 mink 操纵标签