В целях обучения, есть ли способ инициализации объекта, вызова его метода и присвоения объекта переменной в одном выражении в PHP?
Я пробовал что-то вроде:
$dom = (new DOMDocument)->loadHTML('<html></html>');
echo gettype($dom); // Result: boolean
но он возвращает логическое значение вместо объекта, поэтому я ничего не могу с этим поделать.
Я ожидаю быть объектом, поэтому я могу позвонить: $dom->saveHTML();
, но вместо этого он выдает ошибку:
Неустранимая ошибка: вызов функции-члена saveHTML () для необъекта
Есть ли обходной путь? Или это ограничения языка.
Следующий код работает правильно:
$dom = new DOMDocument;
$dom->loadHTML('<html></html>');
echo gettype($dom); // Result: object
Я использую PHP 5.5.3 (cli).
То, что вы говорите здесь:
$dom = (new DOMDocument)->loadHTML('<html></html>');
DOMDocument
loadHTML
метод на это$dom
Так что все зависит от того, что метод возвращает. Док четко говорит, что возвращает логическое значение (http://php.net/manual/en/domdocument.loadhtml.php), так это то, что хранится в вашей переменной.
Я полагаю, что в вашем собственном коде стоит добавить return $this
в конце ваших методов (если они не должны явно возвращать что-то еще). Если это так, то ваш первый пример кода будет работать нормально. Теперь вам придется пойти со вторым образцом, хотя …
Вы не можете сделать это так, как вам кажется.
То, что вы пытаетесь сделать (или я так верю), это назначить new DOMDocument
к $dom
вызов переменной И loadHTML('<html></html>')
в одну строку вроде:
//$boolval is just there for readability
$boolval = ($dom = (new DOMDocument))->loadHTML('<html></html>')
который даст вам T_OBJECT_OPERATOR
ошибка синтаксиса.
Невозможно написать вышеприведенное утверждение в одну строку, как вы хотите (у меня нет других доказательств, кроме тестирования и опыта).
Кроме того, выравнивание кода не всегда полезно. Это часто приятно, когда вы пишете код на начальном этапе, но может привести к значительным головным болям позже, если у вас есть какие-либо ошибки. Также, если вы хотите обновить свой код, так как однострочная версия материала менее понятна без комментариев, это также может стать более трудным.
Если вы хотите немного взломать его (напрасно тратить ресурсы и читабельность), то вы можете создать функцию, в которой вы передаете по ссылке переменную (которая будет установлена для объекта), объект и функцию, которую вы хотите вызывать вместе. с массивом параметров.
Функция будет выглядеть примерно так:
function callAndSet(&$var,$object,$funcName,$argsArray=array()){
//instead of $argsArray, you could use a vararg ( use func_get_args()/array_slice() )
$var = $object;
call_user_func_array(array($object,$funcName),
$argsArray
);
}
затем использовать его:
callAndSet($dom,new DOMDocument(),'loadHTML',array('<html></html>'));
$dom->saveHTML()