PHP çağrılacak üst sınıfta bir yöntem gerektirir

8 Cevap php

Başlık devletler gibi, ben gerekli bir üst sınıfta bir yöntem yapmaya çalışıyorum. Rağmen, herhangi bir sınıf olabilir varsayalım. Örneğin:

class Parent
   {
      function foo ()
        {
           // do stuff
        }
   }

  class Child extends Parent
    {
       function bar ()
        {
           // do stuff after foo() has ran
        }
    }

Temelde, çalıştırmak ya da Child sınıf çalışmaz gerekli ve bir hata verir ya da farklı bir sayfaya yönlendirir edilecek foo () istiyorum. Ben işlevini diyebiliriz, ancak üst sınıf uzanan zaman bir gereklilik yapabiliyorsa ben merak ediyorum.

8 Cevap

Soyut sınıflar ve yöntemler kaldıraç varsa, eksik yöntemleri uygulamak için alt sınıfları zorlayabilir.

abstract class ParentClass
{
  public function foo ()
  {
    // do stuff
    $this->bar();
  }

  abstract protected function bar();
}

class Child extends ParentClass
{
  protected function bar()
  {
    // does stuff
  }
}

Uygulamak gerekmez Altsınıflar bar() ölümcül bir hata üretecektir.

Ne muhtemelen yapmalıyım yüzdesel Veli :: foo () ve daha sonra bu yüzden gibi geçersiz kılınmış yöntemi ana yöntemini çağırır:

class Parent
{
  function foo ()
    {
       // do stuff
    }
}

class Child extends Parent
{
   function foo ()
    {
       if(!parent::foo()) {
            throw new Exception('Foo failed');
       }

       // do child class stuff
    }
}

Sadece bir bayrak gibi davranır function foo () bir boolean set neden. O çocuğun sınıf / fonksiyonları set olmuştur ve tüm hazırsınız olmadığını kontrol edin.

Çocuk konstruktunda ebeveynden işlevini çağırın var.

class Child extends Parent
{
   function bar ()
    {
       // do stuff after foo() has ran
    }
    function __construct(){
         parent::foo();
    }
}

Zaten belirtildiği gibi foo() geçersiz kılmak için alt sınıfları zorlayarak soyut olmak istiyorum gibi, bu sesler.

PHP soyut bir sınıf içeren herhangi bir sınıf da soyut olması için ana sınıfı gerektirir. Bu sadece alt sınıflandırılır / türetilmiş, (inşa) örneği olamaz anlamına gelir. Soyut bir sınıf örneğini çalışırsanız derleyici bir ölümcül hata verecektir.

http://php.net/manual/en/language.oop5.abstract.php

Peter Bailey cevap kod bakın.

Aslında üst sınıf içinde herhangi bir kod başlatılıyor değilseniz bir nesne arayüzü kullanmalısınız. Arayüz yöntemleri uygulanacak veya komut bir fetal hatası atar var.

Onlara daha fazla bilgi bulabilirsiniz: http://us3.php.net/interface.

Ben bir inşa çözüm olduğunu sanmıyorum bu gibi işlevleri uygulama tek yolu olabileceğini düşünüyorum.

class Parent
{
    public $foo_accessed = FALSE;
    function foo ()
    {
       $this->foo_accessed=TRUE;
       // do stuff
    }
}

class Child extends Parent
{
   function bar ()
    {
       if($this->foo_accessed==TRUE) {
           // do stuff after foo() has ran
       } else {
           // throw an error
       }
    }
}

Diğer yöntemlere bağlı etmeyin. Onlar koştu ettik emin olun.

class Parent
{
    function foo()
   {
       // do stuff
   }
}

class Child extends Parent
{
    private function bar()
   {
       // do child class stuff
   }

   public function doFooBar()
   {
    parent::foo();
    $this->bar();
   }

}