первое примечание: обратите внимание, что это прямо здесь не проблема кодирования, это проблема, которую я имею с IDE PhpStorm
У меня есть класс Model в моем проекте, который имеет метод load
который в основном загружает что-то из базы данных. Затем у меня есть несколько классов (других моделей), которые расширяют модель, например,
User extends Model
Book extends Model
Теперь, в версии 5.4, добавленной для доступа к мембранам классов при создании экземпляра, у меня возникли некоторые проблемы с инспектором кода из phpstorm.
В пользовательском классе у меня есть метод «getUrl ()». Когда я это так называю
$user = new User();
$user->load(1);
$user->getUrl();
Я не получаю никаких предупреждений. Phpstorm знает, что $ user является объектом User и не выдает предупреждение.
Однако, когда я заявляю это так
$user = (new User())->load(1);
$user->getUrl();
Я получаю предупреждение Method 'getUrl()' not found in class Model
, Я мог бы легко это исправить, добавив getUrl
метод к модели, но есть только 3-4 класса (из 15), которые используют метод getUrl. Есть ли способ сказать ему, что $ user является объектом User, а не объектом Model?
Я знаю, что я мог бы просто добавить
/ ** @var Пользователь $ user * /
до кода, но я хочу, чтобы это было автоматически, а не то, что я должен регенерировать это все время.
Так что в основном проблема заключается в
В пользовательском классе есть метод getUrl
Вызов этого класса с доступом к члену класса в функции создания экземпляров выдает предупреждение, потому что PHPStorm считает, что это объект класса Model, а не пользователя
Это должно быть решено добавлением docblock к load()
метод.
Проблема в том, что в вашем втором примере $user
не является результатом new User()
, но результат ->load()
позвоните, и, похоже, PHPStorm не может сделать вывод, что load
фактически возвращает объект правильного класса
Это должно выглядеть так:
<?php
class Model
{
/**
* @param int $id
* @return static
*/
public function load($id)
{
// …
}
}
Других решений пока нет …