Первое примечание: обратите внимание, что это прямо здесь не проблема кодирования, это проблема, с которой я сталкиваюсь с IDE PhpStorm
У меня есть класс Model в моем проекте, который имеет load
метода, которая в основном загружает что-то из базы данных. Тогда у меня есть несколько классов (другие модели), которые расширяют модель, например
User extends Model
Book extends Model
Теперь, с добавленной функцией 5.4 для доступа к классам membes при создании, у меня есть некоторые проблемы с Code Inspector от 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, а не пользователем
Это необходимо решить, добавив док-блок в метод load()
.
Проблема заключается в том, что в вашем втором примере $user
не является результатом new User()
, а является результатом вызова ->load()
и похоже, что PHPStorm не может вывести, что load
фактически возвращает объект правильного класса
Он должен выглядеть так:
<?php
class Model
{
/**
* @param int $id
* @return static
*/
public function load($id)
{
// …
}
}
@return static
должно сделать свое дело