2011-09-05 23 views
10

Özellik adları değişkenlerde olduğunda neden isset() çalışmıyor?isset() dinamik özellik adları ile

object(stdClass)#39 (1) { 
    ["tst"]=> 
    array(2) { 
    ["one"]=> 
    int(1) 
    ["two"]=> 
    int(2) 
    } 
} 
bool(true) 
bool(false) // was expecting true here.. 

Düzenleme:: koduyla etrafında oynuyor devam etti ve

var_dump($Object->$tst['one']); 

Duyurusu çıkışı öğrendim:

$Object = new stdClass(); 
$Object->tst = array('one' => 1, 'two' => 2); 

$tst = 'tst'; $one = 'one'; 
var_dump($Object, isset($Object->tst['one']), isset($Object->$tst[ $one ])); 

aşağıdaki verir

E_NOTICE: Undefined property: stdClass::$t 

Yani, sorun şu ki, $tst[...] bölümünün 'dize modunda' değerlendirildiğini (dizedeki ilk karaktere göre değerlendirmek; bu durumda "t"), nesnenin nesneden alınmasına gitmeden önce;

var_dump($tst, $tst['one']); // string(3) "tst" string(1) "t" 

Çözüm:

var_dump($Object->{$tst}['one']); // int(1) yay! 
:
onun değeri ilk almak için tercümana anlatmak için, değişken adı ( $this->{$tst}) etrafında parantez koymak ve sonra [...] bölümünü değerlendirmektir
+2

Kötü 'isset() 'için böyle zalim şeyler yapıyor musunuz? Sana hiç ne yaptı? (Cidden olsa da, iyi bir soru, ben şaşırdım!) –

+0

'var_dump ($ Object -> $ tst)' ne gösteriyor? – CodeCaster

+3

Sorun, burada yalnızca operatör önceliğidir. özellik olarak değişkene bağlı olarak [] 'over' ->. – mario

cevap

9

Özellik adı etrafında parantez eklemeyi deneyin ...

isset($Object->{$tst}[ $one ]); 

CodePad.

+0

Çalışıyor! Sen bir kahramansın. Burada tam olarak neler olduğunu açıklamak ister misiniz? :) – Rijk

+0

@Rijk Sadece kendimi çözüyorum. Önsezim önceliğidir, ancak PHP [-] tanımlamamıştır (http://php.net/manual/en/language.operators.precedence.php) '->' için (array dizisini tanımlamasına rağmen) [operatör]. – alex

+0

'var_dump ($ Nesnesi -> $ tst ['one']);' çıktılar E_NOTICE: Tanımsız özellik: stdClass :: $ t' .. Belki de $ tst [...] bölümü 'olarak değerlendiriliyor' dize 'ilk? – Rijk

0

Kendi sorumu :)

koduyla etrafında oynuyor gitti Yanıtlanmış ve

var_dump($Object->$tst['one']); 

Duyurusu çıkışı öğrendim:

E_NOTICE: Undefined property: stdClass::$t 

yüzden sorun olduğunu düşünüyorum $ tst [...] parçasının, nesnenin nesneden getirilmesine gitmeden önce, 'dize modunda' (dizedeki ilk karaktere (bu durumda "t") değerlendirilmesi) değerlendirildiğini;

var_dump($tst, $tst['one']); // string(3) "tst" string(1) "t" 

çözüm öncelikle değerini almak için tercümana anlatmak ve sonra [...] bölümünü değerlendirmek için, değişken adı ($this->{$tst}) etrafında parantez koymaktır.

var_dump($Object->{$tst}['one']); 

Alex'in cevabını kabul edeceğim, bana doğru yönde işaret ettiğinden. Herkese teşekkürler!

+0

Ve şimdi PHP 7'de, bu davranışı nihayet değiştirmiş görünüyorlar. – Rijk

İlgili konular