2010-11-22 8 views
1

Açıklamada belirtildiği gibi, bir diziyi ve bir nesneyi argüman olarak alan bir işleve sahibim ve nesnenin türüne bağlı olarak tüm nesne alanlarını dizideki ilgili değerlerine atar. Nesnelerin hepsinin farklı alanları vardır, ancak bunların hepsinin, hangi alanların atanacağını belirlemek için kullandığı bir tür özniteliği vardır. nesnenin alanlarınHer iki işleve de geçerken PHP sınıf alanlarının dizi değerlerine atanması alanları ayarlamaz, neden?

kod geçirilen nesne için doğru şube girer ama hiçbiri:

function unload($arr,&$obj){ <-- //&$obj not $obj 
    if($obj->type == 'A'){ 
    echo 'Setting field for A'; 
    $obj->a = $arr['a_value']; 
    //some more assignments.. 
    } 
    elseif($obj->type == 'B'){ 
    $obj->b = $arr['b_value']; 
    echo 'Setting field for B'; 
    //some more assignments... 
    } 
    //some more elseifs 
    //return an error if 
    //object's type doesn't 
    //match 
    else{ 
    echo 'Error: Object type '.$obj->type.' not recognized.'; 
    } 

} 

$arr['a_value'] = 'SomeValue'; 
$arr['b_value'] = 'SomeOtherValue'; 
$obj = new A(); //A's type set to 'A' upon initialization 
unload($arr,$obj); 
echo 'A->a set to: '.$obj->a; 

Çıktı: A-> kümesi için

Böyle bir şey çalışır atandı Neyi yanlış yapıyorum?

Sunucu, PHP 4.4.7 çalıştırıyor, bunun nedenini hala bilmiyorum.

Düzenleme: sınıf içinde sınıf alan adlarını başvururken

Ben $this kelime gerekliydi fark etmedi: Ben nihayet anladım, bu 2 şeylerin bir arada oldu. Değişkenlerin global kapsamı olduğunu varsaydım, bu yüzden $this Java'da olduğu gibi isteğe bağlıydı. Bu yüzden sadece işlev bildirimini değiştirmek sorunu çözmedi. Şimdi her şey iyi çalışıyor!

+0

Nesnede 'private' var mı? – alex

+0

herhangi bir abanoz hatası göremiyor ... basit bir test vakası oluşturabilir ve sorunuza dahil edebilir misiniz? 'Instanceof' işlevini kullanabileceğiniz bir -> tip işlevinden ziyade (örneğin,' '($ obj instanceof SomeClass) {...' – Hamish

+0

@Hamish Evet, bu işe yarayacaktır, ancak 'type' özelliği * bir şey olabilir. hangi sınıfın alakasız olduğu – alex

cevap

2

Hangi PHP versiyonundasınız?

Çünkü PHP4'te açıkça referans olarak nesneyi geçmesi gerekiyor: Çift sen PHP5 üzerinde aksi takdirde

function unload($arr,&$obj){ 

, sizin $arr içeriğini kontrol edin. Eğer sana sınıf adını döndürür get_class() kullanmak öneririm sınıf adını almak istiyorsanız Ve içinde ve fonksiyonu dışında bazı print_r ...

+0

Çalışmadı. Değerlerin depolandığından emin olmak için diziyi ekliyorum ve bunlar (bu sadece bir test sayfasıdır, bu yüzden her şeyi manuel olarak ayarlıyorum). – primehunter326

+0

Sadece diziyi print_r ile işlev içinden yazdırmayı denediniz, her şey doğru şekilde iletildi. Hiçbir şey doğru olarak atanamazsa. – primehunter326

0
  • yapmak.
  • Niçin $obj->a yerine A->a kullanıyorsunuz? Yanlış görünüyor.
  • Ve bu durumda switch'un ihtiyaçlarınızı en iyi şekilde karşılayabildiğini fark edin.

DÜZENLEME Nihayet anladım: Eğer

$arr['a_value'] = 'SomeValue'; 
$arr['b_value'] = 'SomeOtherValue'; 

veya başka ile

$arr['a'] = 'SomeValue'; 
$arr['b'] = 'SomeOtherValue'; 

değiştirmek zorunda $obj->b = $arr['a']; için $obj->b = $arr['a_value']; kurmak ve b değeri ile aynı şeyi. Bunun anlamı, dizi anahtarlarının aynı olması gerektiğidir.

+0

Yazım hatası düzeltildi ve yukarıdaki yazdırma ifadelerine eklendim (bunları zaten kodumda yazdım). Error_reporting ayarı hiçbir şeyi değiştirmez. Bunu bir anahtar olarak yapabildiğimi biliyorum, sadece C/Java için kullanıyorum, sadece ilkellerde – primehunter326

+0

durum anahtarı yapabilirsiniz. Ayar hatası raporlaması değişecektir! $ Obj-> a değişkeninin doğru ayarlanmamış olması durumunda bir Bildirim hatası basacaktır. Şimdi çıkış nedir? – Shoe

+0

Düzenlendi ve test edildi, çalışıyor. – Shoe