Fonksiyonu sonucu dereferencing PHP sözdizimi [çoğaltmak]

22 Cevap php

Bu soru burada zaten bir cevabı var:

22 Cevap

Bu, özellikle PHP5.3 şu anda desteklenmeyen dizi çözümleyecek, ama sonraki sürümde, 5.4 mümkün olmalıdır. Çözümleyecek nesne mevcut php sürümlerde diğer taraftan mümkündür. Ben de bu işlevi arıyorum!

PHP işlevi dizi sonuçları erişemez. Bazı insanlar bu bir sorun diyoruz, bazıları sadece dil nasıl tasarlandığına olarak kabul ediyor. Yani PHP sadece ihtiyacınız veri ayıklamak için önemsiz değişkenleri oluşturmak yapar.

Yani yapmanız gereken.

$var = foobar();
print($var[0]);

Peki, sen duruma bağlı olarak, aşağıdaki çözümlerden birini kullanabilirsiniz:

function foo() {
    return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"

Yoksa kullanarak döndürülen diziden belirli değerleri kapmak list() yapabilirsiniz:

list($foo, $bar) = foo();
echo($foo); // prints "foo"
echo($bar); // print "bar"

Edit: each() daha önce verdi için örnek kod yanlış oldu. each() bir anahtar-değer çiftini verir. Bu yüzden kullanımı kolay olması foreach() olabilir:

foreach(foo() as $key=>$val) {
    echo($val);
}

Array Dereferencing is possible as of PHP 5.4:

Example (source):

function foo() {
    return array(1, 2, 3);
}
echo foo()[2]; // prints 3

PHP 5.3 olsun istiyorum ile

Parse error: syntax error, unexpected '[', expecting ',' or ';' 

Original Answer:

Bu olmuştur been asked already before. Cevabı hayır. Bu mümkün değildir.

Için quote Andi Gutmans Bu konu hakkında:

This is a well known feature request but won't be supported in PHP 5.0. I can't tell you if it'll ever be supported. It requires some research and a lot of thought.

Ayrıca PHP BugTracker bu request a number of times bulabilirsiniz. Teknik detaylar için, sana official RFC denetlemek ve / veya PHP Internals sorabilirsiniz öneririz.

Çoğu diğer programlama dilleri olmasına rağmen, ne yazık ki yapmak için bir yolu yoktur.

Eğer gerçekten bir liner yapmak istedim, bir () adında bir işlevi yapmak ve bir şey gibi yapabilirdi

$test = a(func(), 1); // second parameter is the key.

Ama bunun dışında, işlev () [1] PHP desteklenmiyor.

Sadece dizideki ilk öğe dönmek istiyorsanız, akım () işlevini kullanın.

return current($foo->getBarArray());

http://php.net/manual/en/function.current.php

Aynı başaracağımıza sarıcı fonksiyon yazın. Çünkü PHP'nin kolay tipi döküm, bu oldukça açık uçlu olabilir:

function array_value ($array, $key) {
return $array[$key];
}

Diğerleri de söylediğim gibi, bu mümkün değildir. PHP'nin sözdizimi buna izin vermez. Ancak, diğer yönden sorunu saldırır bir önerim var.

Eğer getBarArray yönteminde kontrol konum ve PHP Standart Kütüphanesi (çok PHP 5.2.x host yüklü ve PHP 5.3 ile birlikte varsayılan olarak yüklenir) erişiminiz varsa, bir {[(1 dönen düşünmelisiniz )]} instead of a native PHP array/collection. ArrayObjects gibi offetGet herhangi bir dizine almak için kullanılabilecek yöntem, böylece kodunuzu görünebilir bir şey var

<?php
class Example {
	function getBarArray() {
		$array = new ArrayObject();
		$array[] = 'uno';
		$array->append('dos');
		$array->append('tres');
		return $array;
	}
}

$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);

Hiç bir yerli dizi / koleksiyon gerekir ve eğer, her zaman sonuçları çevirebilirsiniz.

//if you need 
$array = (array) $foo->getBarArray();

Aslında, böyle bir davranışa izin kütüphane yazdık:

http://code.google.com/p/php-preparser/

Işlevleri, yöntemleri: her şeyi ile çalışır. Önbellek, bu nedenle gibi hızlı PHP'nin kendisi gibi olmak :)

Daha fazla araştırma sonra ben cevap hayır, böyle bir geçici değişken gerçekten işlevinden döndürülen bir dizi ile başa çıkmak için kurallı yolu olduğuna inanıyorum.

benim her zamanki geçici çözüm, bu gibi genel bir fonksiyonu var olmaktır

 function e($a, $key, $def = null) { return isset($a[$key]) ? $a[$key] : $def; }

ve daha sonra

  echo e(someFunc(), 'key');

Eğer gerekmez zaman bir bonus olarak, bu aynı zamanda 'tanımsız index' uyarısı önler.

foo()[x] çalışmıyor nedeni olarak, cevabı oldukça kaba ve burada yayınlanacaktır gitmiyor. ;)

Bunlar sorunu yaklaşım için bazı yolları vardır.

Eğer koleksiyon parçası değildir ama ayrı bir anlam var her değişkenleri dizi dönerseniz ilk doğrudan değişkenleri isim kullanabilirsiniz.

Diğer iki yolu değerler topluluğudur sonucu dönen içindir.

function test() {
  return array(1, 2);
}   
list($a, $b) = test();
echo "This should be 2: $b\n";

function test2() {
   return new ArrayObject(array('a' => 1, 'b' => 2), ArrayObject::ARRAY_AS_PROPS);
}
$tmp2 = test2();
echo "This should be 2: $tmp2->b\n";

function test3() {
   return (object) array('a' => 1, 'b' => 2);
}
$tmp3 = test3();
echo "This should be 2: $tmp3->b\n";

Bu da zoraki, ama sen gerçekten İHTİYACINIZ eğer tek bir satırda olmak:


return index0( $foo->getBarArray() );

/* ... */

function index0( $some_array )
{
  return $some_array[0];
}

return array_shift($foo->getBarArray());

http://php.net/array_shift

Bu birkaç kez sordum oldu, aynı zamanda bir yineleniyor.

Sen, elbette, bir dizi yerine bir nesne döndürür ve bu şekilde erişebilir:

echo "This should be 2: " . test()->b ."\n";

Ama bir dizi ile bunu yapmak için bir olanak bulamadık: (

Sadece estetik ise bir nesneyi döndürmek, sonra Nesne notasyonu çalışacaktır. Bildiğim kadarıyla bellek yönetimi gider gibi, hiçbir geçici kopyalama, referans sadece bir değişiklik yapılmış ise.

PHP böyle zincir ifadeler olamaz, bu yüzden bir değişkene array_test() sonucunu kaydetmek gerekir.

Bu deneyin:

function array_test() {
  return array(0, 1, 2);
}

$array = array_test();
echo $array[0];

Son derece getto, ancak, sadece PHP kullanarak yapılabilir. Bu (PHP 5.3 tanıtıldı) bir lambda fonksiyonu kullanır. Görmek ve (ahem, dehşet ve) hayret:

function foo() {
    return array(
        'bar' => 'baz',
        'foo' => 'bar',
}

// prints 'baz'
echo call_user_func_array(function($a,$k) { 
    return $a[$k]; 
}, array(foo(),'bar'));

Uzunlukları biz çoğu diğer dillerde de çok güzel şeyler yapmak için geçmek zorunda.

Kayıt için, ben Nolte ne benzer bir şey yapmak. Üzgünüm kimsenin gözleri kanaması yaptıysanız.

Bu çalışır mı?

 return ($foo->getBarArray())[0];

Aksi takdirde, getBarArray () fonksiyonu gönderebilir miyim? Bu şimdiye kadar yayınlanan ne işe yaramayacağını neden görmüyorum.

Sen başvuruları kullanabilirsiniz:

$ref =& myFunc();
echo $ref['foo'];

Bu şekilde, gerçekten döndürülen dizinin bir kopyasını yaratmak değil.

Aynı şeyi yapmak için üç yolu vardır:

1. yol:

Chacha102 dediği gibi, endeks değeri döndürmek için işlevini kullanın:

function get($from, $id){
    return $from[$id];
}

Sonra, kullanabilirsiniz

get($foo->getBarArray(),0);

böylece birinci elemanı ve elde edildi.

2. yol:

Mevcut ve array_slice kullanan bir tembel yolu:

$first = current(array_slice($foo->getBarArray(),0,1));
$second = current(array_slice($foo->getBarArray(),1,1));

3. yol:

, Dizi ve değerini hem döndürmek için aynı işlevi kullanarak:

class FooClass {
    function getBarArray($id = NULL) {
        $array = array();

        // Do something to get $array contents

        if(is_null($id))
            return $array;
        else
            return $array[$id];
        }
}

Sonra tüm dizi ve tek bir dizi öğesi elde edebilirsiniz.

$ Dizi = $ foo-> getBarArray ();

veya

$ FIRST_ITEM = $ foo-> getBarArray (0);

Short Answer:

Evet. O kadar uzun fonksiyon sonucu olarak, PHP bir işlevin dönüş değeri çalıştırmak mümkün ve PHP sizin özel versiyonu bunu destekleyecek.

Example2 başvurma:

//  can php say "homer"?      
//  print zoobar()->fname;     //  homer <-- yup

Cases:

  • Fonksiyon sonuç bir dizidir ve PHP version son yeterli
  • Fonksiyon sonuç bir nesne ve istediğiniz nesne üye ulaşılabilir