sınıf ve arayüz php arasında otomatik yük difernece

Sahip olduğum şu sorunu araştırıyorum. Projemizin sınıf dosya isimleri logon.class.php olarak adlandırılmıştır. Ancak bu sınıfın arabirim dosyası logon.interface.php olarak adlandırılır.

Benim sorunum, autoload yöntemi çalıştığında, bir sınıf araması mı yoksa bir arayüz araması mı olduğunu tespit edebilmem gerekir.

<?php 
function __autoload($name){
    if($name === is_class){
        include_once($name.'class.php');
    }elseif ($name === is_interface){
         include_once($name.'interface.php');
    }
}
?>
2
Aynı adı taşıyan bir sınıfı ve bir arayüzü nasıl tanımlayabilir ve her ikisini de kullanmayı umuyorsunuz? Bunu çalıştırmayı deneyin: class x {} arayüz x {}
katma yazar Explosion Pills, kaynak
Stoosh'un da yaptığı şeyi yapıyorum. Arabirim için IClassName, soyut sınıflar için AClassName ve sınıflar için CClassname var.
katma yazar F21, kaynak
@Tandu'nun söylediklerine ek olarak, ciddi bir şekilde PSR-0 . Ciddi anlamda.
katma yazar igorw, kaynak
Genelde dosya adının ve arayüz adının başına I eklerim
katma yazar Stoosh, kaynak
Geçmişte ben de arayüzden önce bu öneki kullanılır. Ama şimdi ad alanı kullanımıyla, arayüz için özel bir ad alanım var
katma yazar Jan Van Looveren, kaynak

3 cevap

Sınıfın bir arabirim olup olmadığını belirlemek için ReflectionClass :: isInterface kullanabilirsiniz. .

$reflection = new ReflectionClass($name);

if ($reflection->isInterface()){
  //Is an interface
}else{
  //Not an interface
}

Sizin durumunuzda, $ name.interface.php ve $ name.class.php adresinde ilk önce file_exist 'i kullanmanız gerekecektir. Onlar var, var olanı gerektirir, sonra bir arayüz olup olmadığını kontrol edin.

Ancak, benim görüşüme göre bu, yolun aşağısında sorunlara neden olabilir. MyClass.class.php ve MyClass.interface.php 'iniz varsa ne olur?

3
katma
Bu, sınıfın bir örneğini gerektirir.
katma yazar Explosion Pills, kaynak
Haklısın, ama bunu zaten var olan sınıflar için yapabilirsin.
katma yazar Explosion Pills, kaynak
@tandu, ReflectionClass 'contructor gerekli değildir bir örnek gerektirir. Sınıf adının bir dizesini iletebilirsiniz.
katma yazar F21, kaynak
@xdazz: Lütfen detaylandırın :)
katma yazar F21, kaynak
Otomatik yüklemede yansımayı kullanmak çok kötü bir fikir.
katma yazar xdazz, kaynak

Sınıf adı çatışmalarını önlemek için ad alanlarını kullanabilirsiniz. PSR-0 özelliklerini kontrol edin.

Ayrıca bu gönderi bölümünü de kontrol edin. . Dosyanın içeriğini eklemeden önce okursanız, dosyayı/arabirimi yüklemeden, dosyayı bir Arabirim veya bir sınıf içeriyorsa, belirtebilir ve belirtebilirsiniz. Arabirimlerin ve sınıfların aynı ada sahip olamayacağını unutmayın.

Not: Bu yöntemi kullanarak, çalışma zamanında arayüzün adını değiştirebilirsiniz (çok iyi bir uygulama gibi görünse de, sınıfı yüklemeden önce)

0
katma

Sınıflarınız ve arayüzleriniz için bazı adlandırma kurallarına sahip olmalısınız. sınıf adınız logon ve arayüz adı logon_interface , sonra ikisi arasında kolayca ayırt edebilirsiniz. Örneğin, alt çizgiye göre $ name 'ı patlatın ve son öğenin interface olup olmadığını kontrol edin.

0
katma