Есть ли способ правильно набрать элемент \SimpleXMLElement? Так что мне не нужно вводить все то, к чему он обращается, и aa\SimpleXMLElement?
Если я хочу, чтобы у меня был весь тип, я должен сделать это следующим образом:
/**
* @var \SimpleXMLElement $values (this is not! an array, yet it is traversable)
*/
$values = $response->params->param->value->array->data->value;
foreach ($values as $row) {
$row = $row->array->data->value;
/**
* @var \SimpleXMLElement $row
*/
$entry = $row[0];
/**
* @var \SimpleXMLElement $entry
*/
$xmlString = $entry->asXML();
}
Это кажется весьма многословным и излишним. Есть ли способ набрать элемент SimpleXMLElement, чтобы все то, что оно вернуло, также было введено с помощью coreclty typehinted?
Если вы нажмете Ctrl-клик на "определение" SimpleXMLElement в PHPStorm, вы увидите, что у него есть определение класса заглушки, которое оно использует для автоматического завершения и анализа кода.
Перегруженный ->
оператор представлен в этом заглушке следующим образом (взято из PHPStorm 9.0):
/**
* Provides access to element children
* @param $name child name
* @return SimpleXMLElement[]
*/
function __get($name) {}
Обратите внимание, что здесь тип возврата - SimpleXMLElement[]
, т. SimpleXMLElement
" SimpleXMLElement
объектов SimpleXMLElement
". Это позволяет правильно автозаполнять, если вы пишете что-то вроде $node->childName[0]->grandChild[0]->asXML()
, но не используете короткую форму $node->childName->grandChild->asXML()
Это может быть классифицировано как ошибка в среде IDE и хранится в общедоступном трекере как WI-15760. Вместо этого заглушка должна объявлять возвращаемый тип __get()
как SimpleXMLElement
а также объявлять implements ArrayAccess
с помощью offsetGet()
также возвращая SimpleXMLElement
. Тестирование с помощью моего собственного фиктивного класса предполагает, что это будет правильно автозаполнено как для явных [0]
и для коротких случаев.