Php (sabit) gibi bir dize olarak sınıfa nesne öğesi değil Passing?

3 Cevap php

Nasıl dinamik olarak sınıf işlevi için "öğeleri" geçebilir?

Örneğin burada ben $ b gibi nesne (öğelerin) bir eleman ilan, bazı sınıf ve onun işlevinin bir parçasıdır:

//..........
     public function __add2SomeObj($b) {    

        $namespc = $this -> __someObj();  // __someObj() returns object
        $namespc -> cats = $b;

            }
//...................

Can I pass any other name instead cats dynamically so it won't be declared as a string? i.e. something like:

    //..........
         public function __add2SomeObj($a,$b) { 

            $namespc = $this -> __someObj();  // __someObj() returns object
            $namespc -> $a = $b;

                }
    //...................
} //end of class started above

$t=new aboveClass()
$t->__add2SomeObj("cats", array(1=>"PussyCat",2=>"Scratchy"));
$t->__add2SomeObj("dogs", array(1=>"Waffy",2=>"Sharik")); // once again but dogs...

Should I define a constant or what to make this or should i declare this protected varibale as object like (object) $vaaar? Sorry I'm a little bit infamiliar with PHP OOP...

3 Cevap

Evet bunu yapabilirsiniz. Hakkında okuyun variable variables:

Sınıf özellikleri de değişken özellik adlarını kullanarak erişilebilir olabilir. Değişken özellik adı çağrısı yapıldığı kapsamında çözülecektir. Böyle $foo->$bar gibi bir ifade varsa Örneğin, daha sonra yerel kapsam $bar için muayene edilecek ve değeri {[(2 özelliğinin adı olarak kullanılır )]}. $bar bir dizi erişim ise, bu da doğrudur.


Diziler ile uğraşırken Ancak carful olmalıdır:

$namespc->$a[0]

$namespc->$a tarafından döndürülen alır diziden ilk elemanı alacak.

Oysa

$namespc->{$a[0]}

İlk çözeceğini $a[0], yani dizinin $a ilk değerini almak ve özellik adı olarak kullanabilirsiniz.

Ne soruyorsun hangi özellik ikinci liste sizin gibi iç __add2SomeObj değiştirmek için zamanında karar olup olmadığıdır. Yapabilirsin, ve yaptığın doğru.

Ancak, özellikleri dizeleri __add2SomeObj olmalı, o yüzden otomatik bir dizeye dönüştürülür ($a parametresi bir dize olduğundan emin olmanız gerekir, ancak bu beklenmeyen sonuçlar verebilir eğer {[ (1)]}, bir nesne veya bir dizi).

İkinci olarak, arayan çok keyfi bir özelliğini değiştirmek izin veriyorsun. Bu, ya da sınıf __someObj döner ve __add2SomeObj sınıfına bağlı olarak sınıf kapsüllenmesini ihlal olmayabilir. Ayrıca nesne üzerinde dinamik bir özellik yaratacak $namespce (yani, o sınıfın tüm nesneleri yok bir) istediğiniz olmayabilir.

Son olarak, ve daha önce noktasının bir sonucu vardır, __add2SomeObj ölümcül bir hata oluşturabilir. Yani daha iyi izin özellik adları bir dizi karşı $a ve parametreleri doğrulamak derdim.

Sen sözdizimi doğru:

$obj->cats = $b;

ve

$a = 'cats';
$obj->$a = $b;

aynı şeyi yapacağız.

"cats" sabit yapmak için olsun veya olmasın gelince, o size kalmış. Ben hata raporlama koyarak öneririm:

error_reporting(E_ALL | E_STRICT);

That way if you accidentally put in "cast" ve that's not a valid member you'll get an error thrown.

Lastly, PHP is a dynamic language. I get the feeling your background might be with more static languages. This is just something you need to get comfortable with ve you need to find a balance between readability ve verbosity. But whatever you do, don't try ve recreate non-PHP idioms in PHP, which is a common mistake for people coming from one language to another.