A sınıfı (Sınıf A genişleten) Sınıf B Statik Yöntemini Çağırmak

5 Cevap php

Ben cevabını anlamadı bir uygulama testi ilginç bir soru vardı. Aşağıdaki kodun çıktısı nedir:

<?php
class Foo {
    public $name = 'Andrew';

    public function getName() {
    	echo $this->name;
    }
}

class Bar extends Foo {
    public $name = 'John';

    public function getName() {
    	Foo::getName();
    }
}

$a = new Bar;
$a->getName();
?>

Başlangıçta, ben statik yöntemleri (en az PHP5'ta) $ bu başvuru yapamazsınız, çünkü bu bir hata üretmek olduğunu düşündüm. Ben kendimi bu test ve aslında John çıktılar.

Ben Foo :: getName () eklendi; yazısının sonunda ve ben hata bekliyordum aldın. Sizden aradığınız sınıfını genişleten bir sınıf içinde bir statik yöntemini çağırdığınızda Peki, ne değişir?

Herkes burada oluyor tam olarak ne ayrıntılı olarak açıklayan misin?

5 Cevap

Kimin bağlam yöntemi denirdi nesnesine $ this. Yani: $ bu $ a-> getName () $ a olmasıdır. $ FooInstance-> getName bu $ () $ fooInstance olacaktır. $ Durumda bu (bir nesne $ a'nın yöntem çağrısı) ayarlanır ve biz statik bir yöntem çağrı olduğunu, bu $ $ a atanan kalır.

Karışıklık oldukça çok bu özelliği kullanarak dışarı gelebilir gibi görünüyor. :)

Foo :: getName () scope resolution operator geçersiz kılınmış bir yöntemi denir izin vermek için eski bir PHP4 stili kullanıyor.

PHP5'ta kullanmak istiyorsunuz parent :: getName () yerine

Eğer uzatmak isterseniz tamamen örneğin, taban sınıfın davranışını geçersiz yerine, yararlı Bu daha anlaşılır hale olabilir

class Bar extends Foo {
    public $name = 'John';

    public function getName() {
        echo "My name is ";
        parent::getName();
    }
}

Eğer başka bir nesneye bağlı statik yöntemini çağırırsanız, yöntem geçerli nesne bağlamında yürütülür. Hangi $ this-nesne erişim sağlar.

Alt sınıfı içindeki üst sınıf-yöntemini çağırmak için daha iyi bir yol olacaktır:

parent::getName();

Eğer $a->getName() Eğer sınıf olan $a, belirli bir nesneyi baþvurduðunuzu Bar ve böylece döner "John" diyoruz.

Belirli bir nesne olmadığından Foo::getName() fonksiyonu dışında geçerli değildir.

Ben PHP çalışıyor emin değilim, ama olduğu gibi üst sınıftan sizi cast object (Foo)$a->getName() o zaman sonuç olarak "Andrew" olsun istiyorum eğer. Hala belirli bir nesneye ($a) fakat tarzda bu durumda Foo hakkında konuşuyor olurduk. (Note you wouldn't generally want to do this)

Bazen programcılar İngilizce daha kodunda şeyleri anlatmak daha iyidir!

Burada devam ilk şey yüklenme kavramdır. Eğer Bar örneğini zaman, () yöntemi Foo aynı adı yöntemini overloads adAl bulunuyor.

Aşırı yükleme OOD güçlü ve önemli bir parçasıdır.

Ancak, Ana sınıfı (Foo) var olan bir yöntemi sürümünü çağırmak edebilmek için genellikle yararlıdır.

İşte bir örnek:

class Dog
{
   public function getTag()
   {
      return "I'm a dog.";
   }
}

class Skip extends dog
{
   public function getTag()
   {
      return Dog::getTag() . " My name is Skip.";
      // I'm using Dog:: because it matches your example. However, you should use parent:: instead.
   }
}

$o = new Skip();
echo $o->getTag(); // Echo's: "I'm a dog. My name is Skip."

Açıkçası bu çok dar bir örnek ama bir noktayı gösterir.

Sizin temel sınıf bir Tip en genel uygulamasıdır. Bu durumda, "köpek" demek. Bunu Tip tüm örnekleri için ortak olan bu temel sınıf bilgilerini koymak istiyorum. Bu ("geçiş" gibi) Türetilmiş sınıfların her birinde tekrarını önler.

Script belki yanlışlıkla, bu özellikten faydalanıyor.