PhpStorm PDO语句警告

PhpStorm PDO语句警告,php,pdo,phpstorm,Php,Pdo,Phpstorm,考虑以下类别: class output_Home { public $app; public $forums; function __construct ($app) { // main app class containing db, settings, etc $this->app = $app; // populate class property arrays for use in template

考虑以下类别:

class output_Home {
    public $app;
    public $forums;

    function __construct ($app) {
        // main app class containing db, settings, etc
        $this->app = $app;

        // populate class property arrays for use in template
        $this->setForums();
    }

    function setForums () {
        /*
         * select all forum data, dump into $this->forums array
         * fields:
         *      id, name, slug, description, order,
         *      total_threads, total_posts,
         *      last_post_id, last_post_date, last_poster_id, last_poster_username, last_poster_avatar
         */
        $sql = "select f.*,
                p.id as last_post_id, p.date_created as last_post_date,
                u.id as last_poster_id, u.username as last_poster_username, u.avatar as last_poster_avatar,
                (select count(*) from `threads` where `id_forum`=f.id) as total_threads,
                (select count(*) from `posts` where `id_forum`=f.id) as total_posts
                from `forums` as f
                left join `posts` as p on (p.id = (select `id` from `posts` where `id_forum`=f.id order by `date_created` desc limit 1))
                left join `users` as u on (u.id = p.id_user)
                order by f.order asc";
        $stm = $this->app->db->prepare($sql);
        $stm->execute();
        $this->forums = $this->app->sanitizer->action('sanitize', $stm->fetchAll());
    }
}
这是我的
对象应用程序
类:

class object_App {
    public $db;

    function __construct () {
        // create database "db" connection
        $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    }
}
$app = new object_App();
$home = new output_Home($app);
下面是如何将
$this->app
传递到
输出\u Home
类:

class object_App {
    public $db;

    function __construct () {
        // create database "db" connection
        $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    }
}
$app = new object_App();
$home = new output_Home($app);
$app
属性包含一个名为
db
的属性,它是一个PDO对象。请特别注意这里的
$stm
变量

我的问题是,我从PhpStorm收到警告,声称类中找不到诸如
$stm->execute()
之类的方法。当然不是,因为它们是
pdo语句

我只是想知道是否有一种方法可以正确地消除警告,而不必在我制作的每一个
$stm
上面使用
PHPDocs
,因为我将在几个不同的类方法中制作很多,我不希望代码中的任何地方都使用
PHPDocs


任何帮助都将不胜感激。

除非PHPStorm知道方法返回的对象类型,否则它无法知道该对象可以使用哪些方法

您有3种选择:

1) 如您所述,使用快速phpdoc告诉phpstorm它是什么(您只需要在代码块中执行一次:

/** @var SomeObject $stm */
$stm = $this->app->db->prepare($sql);
2) 完全消除警告

查找:

设置>编辑器>检查

然后在PHP>undefined下取消选中
undefined方法

3) 如果您可以控制正在调用的方法:

确保在方法的phpdoc中包含返回类型,PHPStorm将使用该返回类型确定它需要什么

/**
* @return SomeObject
*/
public function someFunction() {
   // some stuff
}

除非PHPStorm知道方法返回的对象类型,否则它无法知道该对象可以使用哪些方法

您有3种选择:

1) 如您所述,使用快速phpdoc告诉phpstorm它是什么(您只需要在代码块中执行一次:

/** @var SomeObject $stm */
$stm = $this->app->db->prepare($sql);
2) 完全消除警告

查找:

设置>编辑器>检查

然后在PHP>undefined下取消选中
undefined方法

3) 如果您可以控制正在调用的方法:

确保在方法的phpdoc中包含返回类型,PHPStorm将使用该返回类型确定它需要什么

/**
* @return SomeObject
*/
public function someFunction() {
   // some stuff
}

1。
$db
提供正确的类型提示。在你的特殊情况下,这可能不是100%必要的,但最好有它(这是一次性工作)

一般来说,IDE可以知道什么是
$db
,因为您有
$this->db=newPDO(…)\uu construct()
(两个重要因素)。。但最好是在适当的类型提示下更安全。如果将这样的行放在某个普通方法(例如,
createDBConnection()
或其他什么方法)中,IDE将不会提供这种昂贵的额外智能

2.最重要的是——为
$app
提供类型提示。传递此参数的方式不会为IDE提供提示

可以这样做(IDE应该解决剩下的问题):

或者以与#1中相同的方式更好:

或者更好——将它们结合在一起:

class output_Home {
    /** @var object_App */
    public $app;

    function __construct (object_App $app) {
    ...

1。
$db
提供适当的类型提示。在您的特定情况下,这可能不是100%必要的,但最好有它(这是一次性工作)

一般来说,IDE可以找出
$db
是什么,因为您有
$this->db=new PDO(…);
并且它位于
u construct()
(2个重要因素)…但是最好使用适当的类型提示,以更安全的方式。如果这样的行放在一些普通方法中(例如
createDBConnection())
或者其他类似的东西,IDE不会提供昂贵的额外智能

2.最重要的是——为
$app
提供类型提示。传递此参数的方式不会为IDE提供提示

可以这样做(IDE应该解决剩下的问题):

或者以与#1中相同的方式更好:

或者更好——将它们结合在一起:

class output_Home {
    /** @var object_App */
    public $app;

    function __construct (object_App $app) {
    ...

我想。我不想取消选中未定义的方法警告,因为它们非常有用。我可能只会选择PHPDoc路线。选项一是您应该做的,这称为“类型提示”.
/**var$stm PDOStatement*/
是我所使用的,我只是不想在我的代码中到处都使用它。我想。我不想取消选中未定义的方法警告,因为它们非常有用。我可能只会选择PHPDoc路线。选项一是你应该做的,这叫做“类型提示”.
/**var$stm PDOStatement*/
是我使用的,我只是不想让它在我的代码中到处都是。你的
应用程序->数据库是如何定义的?到目前为止,它看起来不像是PDO(当然,在PhpStorm的眼中)。显示定义。还显示PhpStorm对它的看法--在
$this->app->db
中的
db
上放置插入符号,然后调用Ctrl+Q(查看快速文档)并显示它的屏幕截图。如果您的
db
有正确的文档记录,那么您应该不会看到此错误(对于像
$stm
这样的内联变量,不需要使用PHPDoc)。我编辑了OP,显示了$this->app->db是如何定义的,以及$this->app是如何传递给类的。太好了-现在显示“查看快速文档”向您显示的内容(当您在
输出主类中时;正如我上面的评论所示).$stm Source:…/classes/output/Home.phpI询问的是
$db
,而不是
$smt
…在任何情况下——请看我的答案。你的
应用程序->db
是如何定义的?到目前为止,它看起来不像是PDO(当然在PhpStorm的眼里)。显示定义。还显示PhpStorm对它的看法--在
$this->app->db
中的
db
上放置插入符号,然后调用Ctrl+Q(查看快速文档)并显示它的屏幕截图。如果您的
db
有正确的文档记录,那么您应该不会看到此错误(对于像
$stm
这样的内联变量,不需要使用PHPDoc)