Создать и использовать анонимный объект в PHP - PullRequest
2 голосов
/ 04 апреля 2011

Скажем, у меня есть простой класс, и я создаю его и вызываю функцию следующим образом:

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 ]

3 голосов
/ 04 апреля 2011

Вы не можете делать то, что вы хотите точно, но есть обходные пути, не делая вещи статичными.

Вы можете создать функцию, которая возвращает новый объект

function tst( $s ) {
    return new tst( $s );
}

echo tst( "again" )->show();
3 голосов
/ 04 апреля 2011

Чтобы ответить на ваш вопрос:

public static function create( $s )
{
    return new tst($s);
}

public function show()
{
    return $this->s;
}

Вышеуказанное позволит вам сделать tst::create("again")->show(). Вы можете переименовать create как хотите.

1 голос
/ 04 апреля 2011

Agile Toolkit использует этот подход везде.Он использует обертку метода add (), которая определена для предка глобального объекта.Вот некоторый реальный код:

$page
    ->add('CRUD')
    ->setModel('User')
    ->setMasterField('admin',false);

Этот код создает представление 'CRUD', помещает его на страницу, создает и связывает с экземпляром класса Model_User, который получает дополнительное условие и значение по умолчанию для логического значения 'admin'field.

На странице будет отображаться элемент управления 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

Я думаю, что это удивительный и очень практичный подход.

ps Я должен отметить новый синтаксис исключений:

throw $this->exception('Something went bad');

с использованием $ this связывает исключение с объектом, который виноват, который также может установить класс по умолчанию для исключения.

...