【问题标题】:How to initialize an object, call its method and assign to variable in one statement?如何在一个语句中初始化对象、调用其方法并分配给变量?
【发布时间】:2015-02-22 00:09:39
【问题描述】:

为了学习,有没有什么方法可以初始化一个对象,调用它的方法,然后在PHP的一个语句中把对象赋值给变量?

我尝试过类似的方法:

$dom = (new DOMDocument)->loadHTML('<html></html>');
echo gettype($dom); // Result: boolean

但它返回的是布尔值而不是对象,所以我不能用它做任何事情。

我期望成为一个对象,所以我可以调用:$dom-&gt;saveHTML();,但它却抛出了错误:

致命错误:在非对象上调用成员函数 saveHTML()

有什么解决方法吗?或者这些是语言的限制。

以下代码可以正常工作:

$dom = new DOMDocument;
$dom->loadHTML('<html></html>');
echo gettype($dom); // Result: object

我正在使用 PHP 5.5.3 (cli)。

【问题讨论】:

  • 你运行的是什么版本的 PHP ?它应该工作
  • @TomToms 我正在使用 PHP 5.5.3 (cli) 进行测试。
  • 由于您实际上希望 $dom 成为 (new DOMDocument) 而不是 loadHTML 的返回值,因此您无法做您想做的事情。可能有一种非常老套的方法来做到这一点,但这无论如何都会破坏单行代码的所有好处。你想要的东西基本上是 $boolval = ($dom = (new DOMDocument))-&gt;loadHTML(),但 PHP 不允许这样做。如果我觉得无聊,我可能会在以后分享一个 hacky-solution。

标签: php variable-assignment


【解决方案1】:

你在这里说的是:

$dom = (new DOMDocument)->loadHTML('<html></html>');
  • 创建一个新的DOMDocument
  • 在上面调用loadHTML方法
  • 将该方法的结果存储在变量$dom

所以这一切都取决于方法返回的内容。文档清楚地说它返回一个布尔值 (http://php.net/manual/en/domdocument.loadhtml.php),所以这就是存储在变量中的内容。

在您自己的代码中,我认为在您的方法末尾添加return $this 是一种很好的做法(除非它们显然需要返回其他内容)。如果这里是这种情况,那么您的第一个代码示例将可以正常工作。不过,现在您必须使用第二个示例...

【讨论】:

  • 所以基本上不可能,可惜;/
  • 只是多了 4 个字符......如果你坚持,你可以像这样单行:$dom = new DOMDocument;$dom-&gt;loadHTML('&lt;html&gt;&lt;/html&gt;'); ;-)
【解决方案2】:

你不能以你想要的方式去做。

您想要做的(或者我相信)是将new DOMDocument 分配给$dom 变量并在一行中调用loadHTML('&lt;html&gt;&lt;/html&gt;'),例如:

//$boolval is just there for readability
$boolval = ($dom = (new DOMDocument))->loadHTML('<html></html>')

这会给你一个T_OBJECT_OPERATOR 语法错误。

没有办法像你想要的那样将上述语句写在一行中(除了测试和经验,我没有证据)。

此外,单行代码并不总是一件好事。最初编写代码时通常很好,但如果以后有任何错误,可能会导致严重的头痛。此外,如果你想更新你的代码,因为没有 cmets 的东西的单行版本很难理解,这也可能变得更加困难。

如果你想稍微修改一下(浪费资源和可读性),那么你可以创建一个函数,通过引用传递一个变量(将设置为对象)、对象和你想要的函数与参数数组一起调用。

函数类似于:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多