Geçici nesneler yöntemlerini çağırmak için PHP sözdizimi

9 Cevap php

Bir değişkene 1 nesne atamak zorunda olmadan temporary declared object bir yöntemi çağırmak için bir yolu var mı?

Aşağıya bakın:

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 Cevap

Ben bu davranışı olmasını istediğimde aşağıdaki geçici çözümü kullanın.

Ben (küresel kapsamında) bu işlevi beyan:

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

Sonra bu şekilde kullanın:

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

ben sık sık bu kullanışlı küçük işlevi kullanmak

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

kullanım

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

veya

make('SomeClass', arg1, arg2)->foobar();

Bu php-internals çok yakın geldi ve PHP gelişiminde ne yazık ki bazı nüfuzlu insanlar (örneğin sniper) active oppose the feature. Php-internals@lists.php.net bir e-posta bırakın, onları bir yetişkin programcı olduğunu bileyim.

İmkansız ve neden bir nesne tüm bu şekilde oluşturmak istiyorsunuz?

Bir nesnenin noktası eşsiz durumu kapsüllemek olmaktadır. Verdiğiniz örnekte, $i zaman 7 olacak, bu yüzden hiçbir nokta ardından $i ondan sonra Çöp toplayıcı nesneyi kaybetme çünkü orada alıyorum, nesneyi oluştururken var $i döndürdü sonra nesne için hiçbir referanstır. Bir static sınıf, başka yerde gösterildiği gibi, bu amaç için çok daha mantıklı. Ya da bir kapak.

İlgili konu:

Muhtemelen manual page for the static keyword ilgi duyarım.

Ne yapabilirim

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

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

echo Test::getNew()->get();

Neden sadece bunu değil:

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

$value = Test::get();

Ne yazık ki, bunu yapamam. Korkarım, sadece PHP yoludur.

No Bu PHP'nin ayrıştırıcı bir kısıtlamadır.