【问题标题】:PhpStorm undefined object if class is included in conditional statement如果条件语句中包含类,则 PhpStorm 未定义对象
【发布时间】:2017-03-16 15:09:06
【问题描述】:

如果变量包含在条件语句中,JetBrains PhpStorm 不会将变量检测为类的对象。例如,这是我的文件:

config.php:

if( in_array('DATABASE', $include) ){
        require_once( 'database/Database.class.php' );
        $db = new Database();
}

index.php

$include = ['DATABASE'];
require_once('config.php');
$db...  //<< Here $db is undefined

如果我在config.php 文件中包含数据库类而不检查条件,那没关系,我可以使用$db 作为数据库类的实例。

我还尝试在检查器中取消选中Ignore 'include' and 'require' statements.,但它只是忽略了未定义的变量,顺便说一下,$db 未被检测为对象,所以我看不到它的方法和属性。

我应该如何解决这个问题?

【问题讨论】:

    标签: php phpstorm


    【解决方案1】:

    不确定$db 究竟是什么因为它是在 if 语句中定义的。直到运行时它才会知道 DATABASE 是否在 $include 数组中,所以 $db 可能会也可能不会被定义。

    您可以通过使用 PHPDoc cmets 来提示类型来解决此问题。在 index.php 的顶部添加如下内容:

    <?
    /**
     * @var Database $dba
     */
    

    【讨论】:

    • 它很棒,而且效果很好,但是有没有办法在 config.php 中实现提示,所以我不需要在所有文件中输入它? (特别是因为其他对象有这个问题,就像$db一样)。
    • @var level cmets 我相信只适用于页面范围。另一种解决方法是将 config.php 代码包装在一个类中,并指定 $db 作为该类的属性,在该属性的 PHPDoc 注释中使用类似的类型提示。它将在其他页面上使用该类型提示。 lmk 如果这令人困惑,我会用一个例子来编辑我的问题。
    • @asDca21 尝试使用@global 而不是@var 并在config.php 文件中执行此操作——理论上应该可以。
    【解决方案2】:

    您确定在声明 $include = ['DATABASE']; 后包含 config.php ?好像没有。

    【讨论】:

    • 是的。我编辑了问题并添加了我忘记的行。
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2017-12-28
    • 2014-07-26
    • 2017-07-12
    • 2023-04-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多