Soyut sınıf yöntemi soyut sınıf dönersek alt sınıfı

2 Cevap php

Ben çocuklara veritabanından öğeleri almak için bir fonksiyona sahip bir sınıf var. Aşağıdaki kod ben mümkün olduğunca kolay tutmak istiyorum oldukça sözde sebep olacaktır.

abstract class SomeHostObject extends SomeObject {

   function getChild($identifier) {
      global $database;
      $id = $database->select('Some MySQL Query');
      // that is the problem
      return ?new? ???($id);
   }

}

Gördüğünüz gibi, sınıf SomeHostObject soyut ve genişletilmelidir.

Şey getChild() bir SomeHostObject örneği (sadece o bile örneği olamaz çünkü) ama {[(1) uzanan sınıfının yeni bir örneğini döndürür gerektiğidir }].

SomeHostObject genişleten bir sınıf PageObject olsaydı Örneğin, fonksiyon getChild(), yeni kimliği ile yeni bir PageObject örneğini döndürmesi gerekir .

Ben 'ileri' ya da bu soruyu aramak için mi bilmiyorum ama benim için büyük bir sorun var.

2 Cevap

Alt nesne GetChild çağıran nesne olarak aynı sınıf olacak eğer, bu kadar basit bir şey ile bunu başarmak olabilir ():

$class = get_class($this)

return new $class($id);

Bu iyi bir yazılım tasarımı ya da başka bir tartışma ise, hm, miras daha sonra 2 seviyeleri biraz imho kokusu. Sen ziyade devralmayı bileşimi kullanarak düşünmek gerekir. Fakat sorunun teknik kısmına odaklanmak, ben geçerli örneğinin sınıf adını almak ve böylece gibi yeni bir tane oluşturmak için get_class kullanabilirsiniz:

  <?php

  class SomeObject
  {}

  abstract class SomeHostObject extends SomeObject {
     function getChild($identifier) {
        $className = get_class($this);
        return new $className($identifier);
     }
  }

  class PageObject extends SomeHostObject
  {
    private $identifier;

    public function __construct($identifier = 0)
    {
      $this->identifier = $identifier;
    }
  }

  $instance = new PageObject();
  $child = $instance->getChild(10);

  print_r($child);

Bu gibi benim makine bir şey yazdırır

PageObject Object ( [identifier:private] => 10 )