2016-04-12 14 views
0

では、以下のクラスを考えてみましょう。PhpStorm PDOStatementに警告

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クラスである:ここでは

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->appoutput_Homeクラスに渡す方法です:

$app = new object_App(); 
$home = new output_Home($app); 

$appプロパティにはというプロパティが含まれています、これはPDOオブジェクトです。ここで特に$stm変数に注目してください。

私の問題は、PhpStormから、$stm->execute()などのメソッドがクラスに見つからないと主張しているということです。もちろん、彼らはPDOStatementsであるので、そうではありません。

警告を正しく取り除く方法があるかどうかだけを知りたいのですが、$stmの上にPHPDocsを使用せずに、私はいくつかの異なるクラスメソッドでかなりの数を作っています。コード内のどこでもPHPDocsが必要です。

ご協力いただければ幸いです。

+0

あなたの 'app-> db'はどのように定義されていますか?これまでのところ、PDOのようには見えません(もちろん、PhpStormの目では)。定義を表示します。また、PhpStormが考えていることを示してください - '$ this-> app-> db'に' db'をキャレットとして置き、Ctrl + Q(View | Quick Documentation)を呼び出し、そのスクリーンショットを表示してください。あなたの 'db'が適切に文書化されていれば、このエラーは表示されません(PHPDocを' $ stm'のようなインライン変数に使う必要はありません)。 – LazyOne

+0

$ this-> app-> dbがどのように定義されているか、$ this-> appがどのようにクラスに渡されているかを示すOPを編集しました。 – kjdion84

+0

これはすばらしいことですが、 "View | Quick Documentation"に表示される内容が表示されます(あなたの 'output_Home'クラスの中にあるとき、上記の私のコメントと同じように)。 – LazyOne

答えて

2

1.$dbのための適切なタイプのヒントを提供します。あなたの特定のケースでは、この100%必要になることが、より良い、それを持っていないかもしれません(それは1時間の仕事です)一般的なIDEに

class object_App { 
    /** @var \PDO */ 
    public $db; 
    ... 

は、あなたが$this->db = new PDO(...);を持っており、それが__construct()(2重要に位置しているため$dbが何であるかを把握することができますファクタ)。しかし、適切なタイプのヒントでより安全な側にいる方が良いです。そのような行が通常の方法(例えば、createDBConnection()など)に置かれる場合、IDEはその高価な余分なインテリジェンスを実行しません。

2.最も重要なのは、$appのタイプヒントを提供することです。この引数をどのように渡しているかは、IDEには何のヒントも与えません。

それはこのように行うことができる(とIDEは残りを把握する必要があり):#1と同様に

function __construct (object_App $app) { 

またはそれ以上:

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

またはより良いです -

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

    function __construct (object_App $app) { 
    ... 
0

PHPStormは、メソッドが返すオブジェクトのタイプを認識していない限り、そのオブジェクトがどのメソッドを使用できるかを知る方法がありません。

あなたは3つのオプションがあります:あなたが述べたように

1)を、それが何であるかphpstormを伝えるために迅速にはphpdocを使用します(あなたは一度だけのコードブロックでこれを実行する必要があります。

/** @var SomeObject $stm */ 
$stm = $this->app->db->prepare($sql); 

2 )は警告を完全

検索SUPRESS:

設定>エディタ>点検を

その後、PHPの下のundefined methodの値をundefinedにします。

3)あなたがメソッドのコントロールを持っている場合は、呼び出されている:

、PHPStormはそれが必要かを決定するためにそれを使用するあなたがメソッドのphpdocの中に戻り値の型が含まれていることを確認してください。

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

私は考えました。私は非常に便利なので、未定義のメソッドの警告をチェックしたくない。おそらくPHPDocのルートに行きます。 – kjdion84

+0

オプション1を実行する必要があります。これは「タイプヒント」と呼ばれます。 – Egg

+0

'/ ** var $ stm PDOStatement * /'は私が使っていたものです。 – kjdion84