PhpStorm没有在父抽象类的后期静态绑定创建的对象中查找方法

时间:2017-07-04 18:12:53

标签: php phpstorm php-7.1 phpstorm-2017.1

在我的PHP应用程序中,我有一个所有数据库对象的基类,它由特定的模型类进一步扩展。它继续这样(简化):

bar

关键是,我在子类上使用int函数来获取所需的对象。但是,由于abstract class Model extends Collection { (...) function __construct(string $primary_key, string $value) { $data = MysqlDB::instance() -> select(static::TABLE, implode(',', static::COLUMNS), "$primary_key=\"$value\""); if (count($data) != 1) throw new ModelException('Select condition uncertain'); parent::__construct($data[0]); } public static function getById(string $id) : ?Model { try { return new static('id', $id); } catch (ModelException $e) { return NULL; } } (...) } 方法的返回类型为getById,因此PhpStorm无法确定对象具有哪些方法,并突出显示我用作错误的方法。因此,没有类型提示。

例如,假设getById和该类Model有方法final class User extends Model,这种代码:

User

sendNotification变黄,好像它不存在一样。

我知道这不是一个很大的问题,但是由于我不断被冗余警告分散注意力并且我不能在这种用例中使用类型提示,这真的很烦人。

2 个答案:

答案 0 :(得分:2)

尝试使用指定动态类型的getById()的实际PHPDoc(例如@return static@return $this)。

这是提供此类"此课程及其课程的最常见方式。儿童" typehint。

另一种可能的选择是相同的..但使用PHP 7.1功能(所以没有PHPDoc块)。

尝试使用self作为返回类型而不是Model。我的意思是:

public static function getById(string $id) : ?Model {

改为使用:

public static function getById(string $id) : ?self {

但是对于这个,您应该使用PhpStorm 2017.2 EAP版本,因为2017.1.x存在问题(请参阅https://stackoverflow.com/a/44806801/783119作为示例)。

答案 1 :(得分:1)

有三种方法可以实现这一点,它们都与PHPStorm没有任何关系。

首先使用正确的返回类型覆盖每个子节点中的方法:

/**
 * @return User
 */
public static function getById(string $id) : ?Model { return parent::getById($id); }

其次将所有可能的子节点添加到抽象类的返回标记中。

/**
 * @return Model|User|...
 */
public static function getById(string $id) : ?Model { /* ... */ }

第三个添加类型提示:

/** @var User $user */
$user = User::getById($id);
$user->sendNotification($param1, $param2, ...);

这些不好并且难以维护。但是PHPStorm没有“设置”。