如何初始化一个对象,调用它的方法并在一个语句中赋值给变量?

时间:2015-02-22 00:09:40

标签: php variable-assignment

出于学习目的,是否有任何方法可以初始化对象,调用其方法并将对象分配给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)。

2 个答案:

答案 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()