当前位置:  开发笔记 > 编程语言 > 正文

PHP中的"内联"类实例化?(为了方便链接)

如何解决《PHP中的"内联"类实例化?(为了方便链接)》经验,为你挑选了4个好方法。

在Python和Ruby等OO语言中常用的习惯用法是实例化一个对象和链接方法,这些方法返回对象本身的引用,例如:

s = User.new.login.get_db_data.get_session_data

在PHP中,可以像这样复制此行为:

$u = new User();
$s = $u->login()->get_db_data()->get_session_data();

尝试以下结果syntax error, unexpected T_OBJECT_OPERATOR:

$s = new User()->login()->get_db_data()->get_session_data();

看起来这可以使用静态方法完成,这可能是我最终要做的,但我想检查一下lazyweb:实际上有一种干净,简单的方法来实例化"内联"PHP类(如图所示)上面的片段)为此目的?

如果我决定使用静态方法,那么让一个类的静态方法返回类本身的实例化是否过于愚蠢?(有效地编写我自己的构造函数 - 那不是构造函数吗?)感觉有点脏,但如果没有太多可怕的副作用,我可能会这样做.

我想我也可以使用get_user()方法预先实例化一个UserFactory,但我很好奇我上面提到的解决方案.



1> Toby Hede..:

所有这些提出的解决方案都会使您的代码变得复杂,以便弯曲PHP以完成一些语法准确性.希望PHP成为一种不那么好的东西(好的)就是通向疯狂的道路.

我会用:

$u = new User();
$s = $u->login()->get_db_data()->get_session_data();

它清晰,相对简洁,不涉及可能引入错误的黑魔法.

当然,你总是可以转向Ruby或Python.它会改变你的生活.

是的,我对PHP很苛刻.我每天都使用它.多年来一直在使用它.现实情况是,它已经增加,而不是被设计并显示出来.



2> 小智..:
 "world");
        }
    }

    function Create($name)
    {
        return new $name();
    }

    $s = Create("User")->Login()->GetDbData()->GetSession();

    var_dump($s);
?>

这是一个可能的解决方案:)当然,你应该为函数选择一个更好的名称......

或者,如果你不介意一点开销:

newInstanceArgs(array_slice(func_get_args(), 1));
    }

    $s = CreateArgs("User", "hi")->Login()->GetDbData()->GetSession();

    var_dump($s);
?>



3> 小智..:

没有理由将hack(解决语法问题)和对象创建代码本身粘在一起.

由于new-expression不能用作对象运算符的左边成员,而是函数调用表达式,因此只需要在调用返回其自身参数的函数时包装对象:

function hack($obj) { return $obj; }

$mail = hack(new Zend_Mail())
  -> setBodyText('This is the text of the mail.')
  -> setFrom('somebody@example.com', 'Some Sender')
  -> addTo('somebody_else@example.com', 'Some Recipient')
  -> setSubject('TestSubject');



4> igaster..:

一个简单的捷径

$Obj = new ClassName();
$result = $Obj->memberFunction();

$result = (new ClassName())->memberFunction();

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有