出于学习目的,是否有任何方法可以初始化对象,调用其方法并将对象分配给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)。
答案 0 :(得分:1)
你在这里说的是:
$dom = (new DOMDocument)->loadHTML('<html></html>');
DOMDocument
loadHTML
方法$dom
所以这一切都取决于方法返回的内容。该文档清楚地表明它返回一个布尔值(http://php.net/manual/en/domdocument.loadhtml.php),这就是存储在变量中的内容。
在您自己的代码中,我认为最好在方法结束时添加return $this
(除非他们需要显然返回其他内容)。如果在这里的情况,你的第一个代码示例将正常工作。现在你必须使用第二个样本......
答案 1 :(得分:1)
你不能以你想要的方式做到这一点。
您尝试做的事情(或者我认为)将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()