在PHP中创建和使用匿名对象

时间:2011-04-04 15:33:18

标签: php object anonymous

假设我有一个简单的类,我创建它并像这样调用函数:

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

我不想将我的函数声明为静态,因为我想在上面的两个例子中使用它们。

3 个答案:

答案 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链接异常到对象,这是有错的,也可以为异常设置默认类。