首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhpStorm PDOStatement警告

PhpStorm PDOStatement警告
EN

Stack Overflow用户
提问于 2016-04-12 12:51:16
回答 2查看 850关注 0票数 0

请考虑以下课程:

代码语言:javascript
复制
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());
    }
}

这是我的object_App课程:

代码语言:javascript
复制
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);
    }
}

下面是如何将$this->app传递给output_Home类:

代码语言:javascript
复制
$app = new object_App();
$home = new output_Home($app);

$app属性包含一个名为db的属性,它是一个PDO对象。请特别注意这里的$stm变量。

我的问题是,我收到了来自PhpStorm的警告,声称类中找不到像$stm->execute()这样的方法。他们当然不是,因为他们是PDOStatements

我只想知道是否有一种方法可以正确地消除警告,而不必在我所做的每一个$stm之上使用$stm,因为我将在几个不同的类方法中创建相当多的方法,并且我不希望代码中的每个地方都有PHPDocs

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-12 13:14:06

1.$db提供了适当的类型提示。在您的特殊情况下,这可能不是百分之百的必要,但最好是拥有它(这是一次工作)

代码语言:javascript
复制
class object_App {
    /** @var \PDO */
    public $db;
    ...

一般来说,IDE可以找出$db是什么,因为您有$this->db = new PDO(...);,它位于__construct()中(两个重要因素)。但最好是在安全的一边,适当的类型提示。如果这条线被放置在一些普通的方法中(例如createDBConnection()或其他什么的话),那么IDE就不会有那么昂贵的额外智能。

2.最重要的是--为您的$app提供类型提示。传递此参数的方式没有为IDE提供任何提示。

可以这样做( IDE应该找出其余的):

代码语言:javascript
复制
function __construct (object_App $app) {

或者更好的方式,就像在#1:

代码语言:javascript
复制
class output_Home {
    /** @var object_App */
    public $app;

或者更好--把它们结合在一起:

代码语言:javascript
复制
class output_Home {
    /** @var object_App */
    public $app;

    function __construct (object_App $app) {
    ...
票数 2
EN

Stack Overflow用户

发布于 2016-04-12 12:58:04

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

你有三个选择:

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

代码语言:javascript
复制
/** @var SomeObject $stm */
$stm = $this->app->db->prepare($sql);

2)完全压制警告。

查找:

设置>编辑器>检查

然后在undefined method > undefined下取消勾选。

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

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

代码语言:javascript
复制
/**
* @return SomeObject
*/
public function someFunction() {
   // some stuff
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36573859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档