PHP: nasıl bir sınıf, kendi adını başvuruda bulunabilir?

4 Cevap

PHP, nasıl bir sınıf, kendi adını başvuruda bulunabilir?

Örneğin, yöntem, bunu yapmak için ne gibi bakmak istiyorsunuz?

Dog::sayOwnClassName();
//echos "Dog";

Update

Herkesin söylediğini görüyoruz get_class($this). Ama bu doğru değil. Ben bir instance Köpek yaratmak olsaydı bu işe olur. Ben Köpek sınıfının kendisi bir yöntemini çağıran soruyorum. Dog taşarsa Mammal, sonra da get_class($this) Dog sınıf içinde bir çağrı 'Memeli.' Dönecektir.

Başka bir deyişle:

  • Ben cevap, hangi ", Köpek sınıfın sınıf ne" demiyorum "Köpek sınıfı Memeli sınıfının bir üyesidir."
  • Ben de cevap olduğu için, "ne onun sınıf?, Köpek bir örneği (Rover denir) köpek sınıfı verilen" demiyorum "Köpek."
  • Ne soruyorum "Köpek sınıf kendisi bana söyleyebilir 'benim adım Köpek nedir?'", Bir

Örneğin:

class Mammal {    
  public function find_by_id($id){
    $query = "SELECT * FROM " . $myclass . " WHERE `id` = " . $id;
    //(etc)
    return $matching_object;
  }
}

class Dog extends Mammal {
//find_by_id method should know to do a SELECT from Dog table     
}

Update 2

Bir Yacoby önerisi get_called_class() doğru idi. Burada verdiğim örnekte nasıl çalışır.

class Mammal {    
      public function find_by_id($id){
        $myclass = get_called_class();
        $query = "SELECT * FROM " . $myclass . " WHERE `id` = " . $id;
        //(etc)
        return $matching_object;
      }
    }

    class Dog extends Mammal {
    //find_by_id knows to do a SELECT from Dog table
    //and will return the correct dog object     
    }

4 Cevap

Üç seçenek, get_called_class() , get_class() or the magic constant __CLASS__

Unfortuantly en azından 5.3.0, PHP sürümü bir şartı var, ancak bu üç get_called_class() , statik bir işlevi kullanarak uğraşırken istediğiniz biridir


get_called_class()

Eğer sınıfı self, yerleştirilmiş olduğu sınıf ismi çözümlenir gibi biraz farklı türetilmiş olabilir statik bir işlevi sınıf almak gerekiyorsa (bak Limitations of self::). Bu soruna geçici bir çözüm için, PHP 5.3.0 'dan işlevini kullanmanız gerekir get_called_class() .

PHP 5.3.0 veya daha kullanamıyorsanız, size fonksiyon statik yapmak ve hala istediğiniz sonuçları elde olamaz bulabilirsiniz.


get_class()

get_class() bakılmaksızın işlev çağrı nerede, nesne gerçek sınıf adını döndürür.

class Animal{
     public function sayOwnClassName(){
         echo get_class($this);
     }
}

class Dog extends Animal{
}


$d = new Dog();
$d->sayOwnClassName(); //echos Dog

$a = new Animal();
$a->sayOwnClassName(); //echos Animal

(Geçmesine gerek yoktur olarak $this) get_class, ilk bakışta, statik fonksiyonları ile olur belirtmek için gibi olan bir parametre, olmadan da kullanılabilir, ancak kullanıldıklarında parametre __CLASS__ ile aynı şekilde çalışır

class Animal{
     public static function sayOwnClassName(){
         echo get_class();
     }
}

class Dog extends Animal{
}


Dog::sayOwnClassName(); //echos Animal
Animal::sayOwnClassName(); //echos Animal

__CLASS__

__CLASS__ hep miras dikkate alındığında bile __CLASS__, çözüldü sınıfın adına genişletir.

class Animal{
     public function sayOwnClassName(){
         echo __CLASS__; //will always expand to Animal
     }
}

class Dog extends Animal{
}

$d = new Dog();
$d->sayOwnClassName(); //echos Animal

$a = new Animal();
$a->sayOwnClassName(); //echos Animal

Peki, get_class ($ Object) var

Bir sınıf içinde kullanılan Sonra __ CLASS__ var

Yoksa __ CLASS__ dönmek bir yöntemi yapabiliriz

Sihirli sabitini kullanın __CLASS__

public function sayClassName()
{
    echo get_class($this);
}

get_class() php docs