假设我有一个简单的类,我创建它并像这样调用函数:
class tst
{
private $s = "";
public function __construct( $s )
{
$this->s = $s;
}
public function show()
{
return $this->s;
}
}
$t = new tst( "hello world" );
echo "showing " . $t->show() . "\n";
是否有任何语法或解决方法可以让我实例化tst的实例并调用show()函数而不将对象赋值给变量?我想做点什么:
echo new tst( "again" )->show();
我不想将我的函数声明为静态,因为我想在上面的两个例子中使用它们。
答案 0 :(得分:3)
回答你的问题:
public static function create( $s )
{
return new tst($s);
}
public function show()
{
return $this->s;
}
以上将允许您tst::create("again")->show()
。您可以根据需要重命名create
。
答案 1 :(得分:3)
你无法完全按照自己的意愿行事,但有一些解决方法可以让事情变得不稳定。
您可以创建一个返回新对象的函数
function tst( $s ) {
return new tst( $s );
}
echo tst( "again" )->show();
答案 2 :(得分:1)
Agile Toolkit到处都使用这种方法。它使用为全局对象祖先定义的add()方法包装器。这是一些现实生活中的代码:
$page
->add('CRUD')
->setModel('User')
->setMasterField('admin',false);
此代码创建'CRUD'视图,将其放在页面上,创建并链接Model_User类实例,该实例接收布尔'admin'字段的附加条件和默认值。
它将在页面上显示一个带有添加/编辑/删除功能的CRUD控件,允许编辑除管理员以外的所有用户。
以下是描述概念的代码:
class AbstractObject {
public $owner;
function add($class){
$c=new $class;
$c->owner=$this;
return $c;
}
}
class Form extends AbstractObject {
function dosomething(){
return $this;
}
}
class OtherForm extends Form {}
$object->add('Form')->dosomething()->owner
->add('OtherForm'); // etc
我认为这是非常实用的方法。
P.S。我必须注意异常的新语法:
throw $this->exception('Something went bad');
使用$ this链接异常到对象,这是有错的,也可以为异常设置默认类。