Erişim dizi php bir işlev tarafından döndürülen

5 Cevap php

Ben bunu istiyorum nerede sitedeki kod ekler bir şablon motoru kullanıyorum.

Oldukça kolay bir şey sınamak için bir işlev yazdı:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Sorun $ this-> data özel olduğunu, ve ben her yerde erişemez, bu yüzden getData () kullanmak zorunda olduğunu; hangi benim sorunu neden olur.

$this->getData()['a']['b']

(tabii ki) çalışmaz ve bir if () bloğunda doğrudan kullanılabilir olacak çünkü ilk değer atama ya da yok etmez.

Herhangi bir fikir?

5 Cevap

PHP 5.4 beri tam olarak yapmak mümkündür:

getSomeArray()[2]

Referans: http://php.net/manual/en/language.types.array.php#example-88

Önce PHP 5.3, geçici bir değişken kullanmak gerekir.

Böyle bir şey kullanamazsınız:

$this->getData()['a']['b']

yani, dizi erişim sözdizimi bir işlev çağrı doğrudan mümkün değildir.

Youy bu gibi bazı temporary variable, kullanmak zorunda:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

Senin durumunda, bu muhtemelen böyle bir şey kullanmak demektir:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Sen var:

  • Önce, kendi getData() yöntemini çağırın ve bir geçici varibale onun dönüş değeri depolamak
  • Daha sonra, test için o geçici bir değişken kullanmak

Aslında, bu konuda fazla seçenek yok ...

Tamam ... görünüşe göre gerçekten daha iyi bir yolu değil, bu yüzden bir o kadar güzel bir çözüm ile kendimi cevaplamak için gidiyorum:

Ben fonksiyonu oluşturuldu:

arrayGet($array, $index) { return $array[$index]; }

Ve bu gibi kullanılmıştır:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Bu hoş değil ama çalışır.

Bu korunuyorsa $this ->data, always erişilebilir. $object ->data her yerde erişilebilir değil, böylece kod $this dönen konum ve bu gibi değerlendirilir, eğer ok olmalıdır.

Btw, bir hata kodunuzda var: tırnak kaçtı gerekir.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }

PHP sürüm 5.4 mümkündür.

If you don't want a temporary variable Bunun için and your PHP version is less, than 5.4, hala ilk veya son öğeyi almak için fonksiyonları inşa birkaç kullanabilirsiniz daha:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Edit: !!! Please note, that in later versions( 5.4+ ) PHP will throw a notice, because end only expects variables as parameter.