Синтаксис PHP для вызова методов на временных объектах - PullRequest
4 голосов
/ 07 февраля 2010

Есть ли способ вызвать метод для временно объявленного объекта без принудительного присвоения 1-го объекта переменной?

См. Ниже:

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}   
}

$temp = new Test();
echo $temp->get(); //ok

echo new Test()->get(); //invalid syntax
echo {new Test()}->get(); //invalid syntax
echo ${new Test()}->get(); //invalid syntax

Ответы [ 9 ]

7 голосов
/ 07 февраля 2010

Я использую следующий обходной путь, когда хочу иметь такое поведение.

Я объявляю эту функцию (в глобальной области видимости):

function take($that) { return $that; }

Тогда я использую это так:

echo take(new Test())->get();
7 голосов
/ 07 февраля 2010

Что вы можете сделать, это

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}

   public static function getNew() { return new self(); }
}

echo Test::getNew()->get();
4 голосов
/ 07 февраля 2010

Почему бы просто не сделать это:

class Test
{
   private static $i = 7;      
   public static function get() {return self::$i;}   
}

$value = Test::get();
3 голосов
/ 07 февраля 2010

Нет. Это ограничение в парсере PHP.

3 голосов
/ 07 февраля 2010

К сожалению, вы не можете этого сделать. Боюсь, это так и есть PHP.

1 голос
/ 04 августа 2016

Это старый вопрос: я просто даю обновленный ответ.

Во всех поддерживаемых версиях PHP (начиная с 5.4.0, в 2012 году) вы можете сделать это:

(new Test())->get();

См. https://secure.php.net/manual/en/migration54.new-features.php («Доступ к элементу класса при создании экземпляра»).

1 голос
/ 07 февраля 2010

я часто использую эту удобную маленькую функцию

 function make($klass) {
    $_ = func_get_args();
    if(count($_) < 2)
        return new $klass;
    $c = new ReflectionClass($klass);
    return $c->newInstanceArgs(array_slice($_, 1));
 }

использование

make('SomeCLass')->method();

или

make('SomeClass', arg1, arg2)->foobar();
1 голос
/ 07 февраля 2010

Невозможно, а зачем вообще создавать объект таким образом?

Смысл объекта в том, чтобы инкапсулировать уникальное состояние. В приведенном вами примере $i всегда будет равно 7, поэтому нет смысла создавать объект, затем получать из него $i и затем терять объект в сборщик мусора, поскольку после * нет ссылки на объект 1005 * было возвращено. Статический класс, как показано в другом месте, имеет гораздо больше смысла для этой цели. Или закрытие.

Тема по теме:

0 голосов
/ 07 февраля 2010

Это появилось совсем недавно на php-internals, и, к сожалению, некоторые влиятельные люди (например, снайпер), занимающиеся разработкой PHP , выступают против функции . Напишите письмо на php-internals@lists.php.net, дайте им знать, что вы взрослый программист.

...