Bir işleve geçirilen zaman bir sınıf adı geçen PHP bir dize olur

4 Cevap

İşte yapmak istediğim şey:

public function all($model) {
  $query = 'SELECT ' . implode(', ', $model::$fields) ....;
}

Bu böyle seslendi:

$thing->all(Account);

Ben bu hatayı alıyorum:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/mark/public_html/*/account.php on line 15

$model ile teftiş zaman var_dump onun bir dize çıkıyor. Ben $ sorgu satırında Account için $model değiştirirseniz ilk örnekte gayet iyi çalışıyor.

Nasıl bir dize alabilir ve geri bir sınıf haline çevirmek?

Edit: Güncelleme örnek ve sorunu yansıtmak için başlık self ile değildir.

Çözüm: Ben PHP5.3 kullanarak değilim beri, ben ne istediğini elde etmek için () eval kullanarak başvurmak zorunda kaldı. Herkes teşekkürler!

4 Cevap

Gibi onlar işlev argüman olarak iletilen, değişkenler saklanan olabilir, ya da bir işlevden dönen sınıfları, PHP birinci sınıf vatandaş değildir.

Ancak, PHP belirli durumlarda, sınıfın adını içeren bir dize kullanarak birinci sınıf vatandaş taklit izin verir:

$class = "Account";

$instance = new $class(); // You can create instances

call_user_func(array($class, 'frobnicate')); // You can call static functions

Yani PHP PHP 5.3 ile de yapabilirsiniz:

$class::frobnicate(); // cleanly call static functions

$fields = $class::$fields; // access static variables

Vikipedi bakın scope resolution operator. Özellikle PHP ve İbranice bölümüne bakın.

Sen self bu şekilde kullanamazsınız: sadece sınıfa işaret (yani statik bir yöntem içinde) statik bir bağlamda kullanılabilir - adını değil ve.

(Eğer gibi görünüyor) statik olmayan yöntemler ile çalışıyorsanız, bunun yerine self in, $this kullanmalısınız.


Actually, before PHP 5.3, you cannot use a static method/data with a "dynamic" (i.e contained in a variable) class name -- see the examples on the page Static Keyword : they only work with PHP 5.3, for that kind of manipulation.

Hangi bu gibi bir kod bölümünü ifade:

class ClassA {
    public static $data = 'glop';
}

$className = 'ClassA';
var_dump($className::$data);

PHP <çalışmayacak 5.3

'$ This' yerine kendini deneyin.

Kendini PHP bu şekilde çalışır. PHP onu bulamıyorum bilinmeyen bir sabit, karşılaşır, ve sonra onu 'kendini' içeren bir dize var varsayar düşünüyor.

Edit: Eğer nesne örneğini sınıfı ve kodu gönderebilir miyim?