#php #phpstorm
#php #phpstorm
Вопрос:
У меня есть отдельный класс, который устанавливает PDO-соединение:
class Core {
public $dbh; // handle of the db connection
private static $instance;
private function __construct() {
// building data source name from config
$dsn = 'mysql:host=' . Config::read('db.host') . ';dbname=' . Config::read('db.basename') . ';port=' . Config::read('db.port') .';charset=' . Config::read('db.charset') . ';connect_timeout=15';
//echo '$dsn is '.$dsn;
// getting DB user from config
$user = Config::read('db.user');
// getting DB password from config
$password = Config::read('db.password');
$this->dbh = new PDO($dsn, $user, $password);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->dbh->exec("set names utf8mb4");
}
public static function getInstance() {
if (!isset(self::$instance)) {
$object = __CLASS__;
self::$instance = new $object;
}
return self::$instance;
}
/** @method PDO */
public function getPdo() {
$core = $this->getInstance();
$pdo = $core->dbh;
return $pdo;
}
}
Теперь, каждый раз, когда я читаю из другого класса или записываю в базу данных в другом классе (например, $compared_text = Core::getInstance()->getPdo()->query($query_text)->fetchColumn();
), хотя все работает, PhpStorm сообщает о методе «Метод, на который ссылается, не найден в классе subject» getPdo()
.
Я погуглил и наткнулся на некоторые ответы здесь, в Stackoverflow, в которых предлагалось использовать PhpDocs, и, как вы можете видеть, я добавил комментарий /** @method PDO */
перед функцией getPdo()
, но она по-прежнему выдает это предупреждение. В чем проблема?
UPD
Предупреждение исчезнет, если я напишу $compared_text = Core::getInstance()->Core::getPdo()->query($query_text)->fetchColumn();
.
Итак, теперь мой вопрос заключается в следующем:
Могу ли я удалить предупреждение без явной записи Core::
перед вызовом каждого метода из него? Если нет, я просто проигнорирую предупреждение (хотя и не хочу его отключать).
Комментарии:
1. Возможно, аннотировать getInstance() с типом возвращаемого значения.
2. Это сработало, хотите опубликовать это в качестве ответа?
Ответ №1:
Аннотируйте возвращаемый тип getInstance()
метода следующим образом
/**
* @return Core
*/
public static function getInstance() {
if (!isset(self::$instance)) {
$object = __CLASS__;
self::$instance = new $object;
}
return self::$instance;
}
IDE прочитает эту аннотацию.
Комментарии:
1. Еще лучше использовать подсказку типа
public static function getInstance() : Core {