Statik yöntemlerde hedef sınıfını algılamak için herhangi bir yolu var mı?

5 Cevap php

Aşağıda bir örnek sınıf hiyerarşisi ve kodudur. Ne arıyorum 'ChildClass1' veya 'ChildClass2' her çocuk sınıfta yeniden uygulanması olmadan statik yöntem) buna denir WhoAmI (olsaydı belirlemek için bir yoldur.

<?php

abstract class ParentClass {

    public static function whoAmI () {

        // NOT correct, always gives 'ParentClass'
        $class = __CLASS__;

        // NOT correct, always gives 'ParentClass'. 
        // Also very round-about and likely slow.
        $trace = debug_backtrace();
        $class = $trace[0]['class'];

        return $class;
    }
}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ParentClass'
// Want to show 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ParentClass'
// Want to show 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";

5 Cevap

Şimdi PHP 5.3 doğada yaygın olarak mevcut olduğunu, ben yeni bulunan teknikler yansıtmak için bu soruya bir cevap özeti araya koymak istedim.

Diğer yanıtlar belirtildiği gibi, PHP 5.3 yeni bir static keyword. As well, a new get_called_class() fonksiyonu ile Late Static Binding tanıttı sadece bir içinde kullanılabilir da mevcuttur sınıf yöntemi (örneği veya statik).

Bu, söz konusu istendi olarak sınıf belirlemek amacıyla, get_called_class() fonksiyonu uygun olacaktır:

<?php

abstract class ParentClass {

    public static function whoAmI () {
        return get_called_class();
    }

}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";

user contributed notes for get_called_class() include a few sample implementations that should work in PHP 5.2 as well by making use of debug_backtrace().

Ben ne atıfta konum bilinen bir php hata olduğuna inanıyorum. Php 5.3 yeni Geç Statik bağlama özelliği ile bu sorunu gidermek için hedefliyor.

http://www.colder.ch/news/08-24-2007/28/late-static-bindings-expl.html

Sınıf tanımlama genellikle iyi anlaşılmış değildir Polimorfizminin bir belirtisidir.

ChildClass1 ve ChildClass2 ve müşterileri onlardan ayırt etmek gerekmez.

Herhangi bir sınıf someObject.whoAmI() sormalıdır yer yok.

Eğer if someObject.whoAmI() == 'ChildClass1' { do X(someObject) } Gerçekten çeşitli ChildClasses çeşitli uygulamaları ile EbeveynSınıf için X() yöntemini eklemek gerekir yazmak için dürtü var her zaman.

"Çalışma zamanı tür kimlik" Bu tür hemen hemen her zaman düzgün polimorfik sınıf tasarımları ile değiştirilebilir.

PHP 5.3 gibi static keyword kullanımı ile mümkün olacak, ama şimdi mümkün değildir.

No PHP 5.3 için bekleyin.