Я часто даю объектам статические методы и свойства, которые не требуют инициализации объекта. Например:
class SomeObject {
public function __construct($object_id) {
$this->loadProperties($object_id);
}
public static function getSomeStaticString() {
return "some static string";
}
}
Теперь мы создаем подклассы этих объектов и имеем некоторый контроллер, который возвращает строку класса объекта при определенных обстоятельствах, когда объект еще не должен быть инициализирован. Например:
class SomeObjectController {
public function getSomeObjectWithTheseProperties(array $properties) {
if($properties[0] === "somevalue") {
if($properties[1] === "someothervalue") {
return SomeSubclassObject::class;
}
return SomeObject::class;
}
return NULL;
}
}
Иногда я мог бы хотеть вызвать статическую функцию SomeObject::getSomeStaticString()
без фактической инициализации объекта (потому что это потребовало бы ненужной выборки из базы данных). Например:
$controller = new SomeObjectController;
$properties = array("somevalue", "someothervalue");
$object_class = $controller->getSomeObjectWithTheseProperties($properties);
echo $object_class::getSomeStaticString();
Вопрос: могу ли я как-то сказать PhpStorm, желательно через phpDoc, что $object_class
является строкой класса подкласса SomeObject
?
Если я скажу своей IDE, что это строка, она сообщит мне getSomeStaticString()
неверный метод С другой стороны, если я сообщаю своей IDE, что это экземпляр SomeObject, он думает, что я могу получить доступ к обычным нестатическим методам и свойствам, чего я не могу.
/** @var SomeObject $object_class */
$object_class = $controller->getSomeObjectWithTheseProperties($properties);
Извините, нет другого способа сказать, что это случай SomeObject
,
… если я скажу своей IDE, что это экземпляр SomeObject, он подумает, что я могу получить доступ к обычным нестатическим методам и свойствам, чего я не могу.
Так? Только не получайте доступ к нестатическим методам и свойствам.
Других решений пока нет …