PhpStorm PDOStatement 警告
PhpStorm PDOStatement Warnings
考虑以下 class:
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:
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
的方式 class:
$app = new object_App();
$home = new output_Home($app);
$app
属性 包含一个名为 db
的 属性,它是一个 PDO 对象。请特别注意此处的 $stm
变量。
我的问题是我收到来自 PhpStorm 的警告,声称在 class 中找不到 $stm->execute()
等方法。当然他们不是,因为他们是 PDOStatements
.
我只是想知道是否有一种方法可以正确地消除警告,而无需在我制作的每个 $stm
上方使用 PHPDocs
,因为我会制作很多在几种不同的 class 方法中,我不希望代码中到处都是 PHPDocs
。
如有任何帮助,我们将不胜感激。
除非 PHPStorm 知道方法 return 是什么类型的对象,否则它无法知道该对象可以使用什么方法。
你有 3 个选项:
1) 如您所述,使用快速 phpdoc 告诉 phpstorm 它是什么(您只需要在代码块中执行一次:
/** @var SomeObject $stm */
$stm = $this->app->db->prepare($sql);
2) 完全抑制警告
查找:
设置 > 编辑器 > 检查
然后取消勾选 PHP > 未定义下的 undefined method
。
3) 如果您可以控制被调用的方法:
确保在方法的 phpdoc 中包含 return 类型,PHPStorm 将使用它来确定它需要什么。
/**
* @return SomeObject
*/
public function someFunction() {
// some stuff
}
1. 为 $db
提供正确的类型提示。在您的特定情况下,这可能不是 100% 必要的,但最好有它(这是一次性工作)
class object_App {
/** @var \PDO */
public $db;
...
一般来说 IDE 可以弄清楚 $db
是什么,因为你有 $this->db = new PDO(...);
并且它位于 __construct()
(2 个重要因素)..但最好是使用正确的类型提示更安全。如果这样的行将被放置在一些普通的方法中(例如 createDBConnection()
或其他东西,IDE 将不会做那些昂贵的额外智能。
2. 最重要的是——为您的 $app
提供类型提示。您传递此参数的方式没有给出 IDE.
的提示
可以这样做(IDE 应该想出剩下的):
function __construct (object_App $app) {
或者以与#1 相同的方式更好:
class output_Home {
/** @var object_App */
public $app;
甚至更好——将它们组合在一起:
class output_Home {
/** @var object_App */
public $app;
function __construct (object_App $app) {
...
考虑以下 class:
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:
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
的方式 class:
$app = new object_App();
$home = new output_Home($app);
$app
属性 包含一个名为 db
的 属性,它是一个 PDO 对象。请特别注意此处的 $stm
变量。
我的问题是我收到来自 PhpStorm 的警告,声称在 class 中找不到 $stm->execute()
等方法。当然他们不是,因为他们是 PDOStatements
.
我只是想知道是否有一种方法可以正确地消除警告,而无需在我制作的每个 $stm
上方使用 PHPDocs
,因为我会制作很多在几种不同的 class 方法中,我不希望代码中到处都是 PHPDocs
。
如有任何帮助,我们将不胜感激。
除非 PHPStorm 知道方法 return 是什么类型的对象,否则它无法知道该对象可以使用什么方法。
你有 3 个选项:
1) 如您所述,使用快速 phpdoc 告诉 phpstorm 它是什么(您只需要在代码块中执行一次:
/** @var SomeObject $stm */
$stm = $this->app->db->prepare($sql);
2) 完全抑制警告
查找:
设置 > 编辑器 > 检查
然后取消勾选 PHP > 未定义下的 undefined method
。
3) 如果您可以控制被调用的方法:
确保在方法的 phpdoc 中包含 return 类型,PHPStorm 将使用它来确定它需要什么。
/**
* @return SomeObject
*/
public function someFunction() {
// some stuff
}
1. 为 $db
提供正确的类型提示。在您的特定情况下,这可能不是 100% 必要的,但最好有它(这是一次性工作)
class object_App {
/** @var \PDO */
public $db;
...
一般来说 IDE 可以弄清楚 $db
是什么,因为你有 $this->db = new PDO(...);
并且它位于 __construct()
(2 个重要因素)..但最好是使用正确的类型提示更安全。如果这样的行将被放置在一些普通的方法中(例如 createDBConnection()
或其他东西,IDE 将不会做那些昂贵的额外智能。
2. 最重要的是——为您的 $app
提供类型提示。您传递此参数的方式没有给出 IDE.
可以这样做(IDE 应该想出剩下的):
function __construct (object_App $app) {
或者以与#1 相同的方式更好:
class output_Home {
/** @var object_App */
public $app;
甚至更好——将它们组合在一起:
class output_Home {
/** @var object_App */
public $app;
function __construct (object_App $app) {
...