2012-12-18 16 views
7

Bir sınıf ad alanını otomatik olarak nasıl alabilirim?PHP sınıfı ad alanını dinamik olarak alın

Alt sınıflarda doğru tanımlanmadığı için sihirli var __NAMESPACE__ güvenilmezdir.

Örnek:

class Foo\bar\A ->__NAMESPACE__ === Foo \ çubuğu

class Ping\pong\B extends Foo\bar\A ->__NAMESPACE__ === Foo \ çubuğu

ps (o Ping \ pong olmalıdır): Fark ettim __CLASS__ kullanarak aynı yanlış davranış, ama ben get_called_class() kullanarak çözdüm ... get_called_class_namespace() gibi bir şey var mı? Bu işlevi nasıl uygulayabilirim?

GÜNCELLEME:
Ben çözüm ben get_called_class() döner tam nitelikli sınıf adını gerçekleştirilen beri, benim kendi soru olduğunu düşünüyorum ve bu nedenle ondan ad çıkarabilir: Daha etkili bir var Neyse eğer ... D yaklaşım bana bildirin;)

+0

Çözümün ben kişisel kodda yapmak zorunda kalmıştım şeydir. http://codepad.viper-7.com/EgObtf –

+0

Ne anlattığınız yanlış davranış değildir. Bu sabitlerin neler taşıdığını görün: http://php.net/language.constants.predefined - ve sorununuza bir çözüm bulduğunuzda kendi sorunuza cevap verebilirsiniz. – hakre

+0

Bunu kontrol edin. Bunun ne demek olduğunu düşünüyorum: http://stackoverflow.com/questions/2317343/get-child-class-namespace-from-superclass-in-php/20193599#20193599 – Chris

cevap

9

class Foo\Bar\A ad alanı Foo\Bar, yani __NAMESPACE__ çok iyi çalışıyor. Ne arıyorsun kolayca echo __NAMESPACE__ . '\\' . __CLASS__; katılarak alabilir muhtemelen alanlı sınıfadı olduğunu.

namespace Foo\Bar\FooBar; 

use Ping\Pong\HongKong; 

class A extends HongKong\B { 

    function __construct() { 
     echo __NAMESPACE__; 
    } 
} 

new A; 

çok doğrudur Foo\Bar\FooBar ...

çıktısını Will Ve sonra

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     new A; 
    } 
} 

yapmak bile o Foo\Bar\FooBar hangi tekrar yankılanacak:

sonraki örneği düşünün çok doğru ...

DÜZENLEME: Bunu iç içe olduğu ana iç içe geçmiş sınıfının ad almak gerekiyorsa, sadece kullanım:

PHP 5.5 yılında :: sınıf işler 10X kolaylaştırır hangi kullanılabilir
namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     $a = new A; 
     echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\')); 
    } 
} 
+3

Onlar kullandığınız \ _ \ _ NAMESPACE \ _ Ebeveyn sınıfında, ancak çocuk sınıfının ad alanını istiyorlar. –

+0

Ahaa, sorudan anlamadım ... – shadyyx

+0

@MaximilianRuta Peki, Düzenlemenin için teşekkürler, ama lütfen, gelecekte düzeltilmesi gereken sadece doğru. ** ** 'nin tüm oluşumları ** siz ** olarak değiştirdiniz mi? Bu benim yazım tarzım ve biraz nezaket göstermedir, eğer sakıncası yoksa, kendimi ifade etme tarzımı sürdürmeme izin verin. Teşekkürler! Ayrıca bu tür ** minor ** onaylamak için yorumcular için teşekkür ve çok ** doğru ** düzenleme isteği ... Aferin! – shadyyx

9

. Örneğin. A::class

+0

Örnek http://php.net/manual/en/language.oop5.constants.php#example-179 – Jekis