PHP ve Sınıflar: Üst sınıf içinde ebeveynin kamu malına erişim

4 Cevap php

Burada benim kod gibi görünüyor ne

i iki formları var:

class Form_1 extends Form_Abstract {

    public $iId = 1;

}
class Form_2 extends Form_1 {

    public $iId = 2;

}

ben kodu bu gibi davranmaya bekliyoruz:

$oForm = new Form_2;
echo $oForm->getId(); // it returns '2'
echo $oForm->getParentId(); // i expect it returns '1'

burada benim Form_Abstract sınıftır:

class Form_Abstract {

    public $iId = 0;

    public function getId() {
        return $this->iId;
    }

/**
this method will be called from a child instance
*/
    public function getParentId() {
        return parent::$iId;
    }
}

ama bu bir ölümcül hata atar:

Fatal error: Cannot access parent:: when current class scope has no parent

yöntemi ile bana yardım edin getParentId()

PS: i çözüm için arıyorum, ne olur nedenini biliyorum.

4 Cevap

Sen Reflection Api üst sınıf 'özelliği varsayılan değer erişmek için kullanmak zorunda. Yedek getParentId, Form_Abstract olarak, bu ile, ve tüm çalışıyor:

public function getParentId() {
    $refclass = new ReflectionClass($this);
    $refparent = $refclass->getParentClass();
    $def_props = $refparent->getDefaultProperties();

    return $def_props['iId'];
}

Açıkçası kök sınıfında () getParentId aramak değil, bu nedenle bir üst sınıf varsa kontrol etmek daha iyidir.

UDATE:

Sen sınıfları / nesneleri fonksiyonları ile aynı yapabilirsiniz:

public function getParentId() {
    $def_values = get_class_vars(get_parent_class($this));
    return $def_values['iId'];
}

Eğer bir ebeveyne sahip olmayan bir sınıfın üst aradığınız çünkü hata (varolan sınıfını kapsamaz) 'dir.

Aslında çocuk sınıfta yeniden tanımlamak değil: sadece tanımlanmış olan değerini şans ben $iId in "üst" 'un versiyonuna ulaşmak bile mümkün olduğunu sanmıyorum ebeveynin sınıf.

To makes things very simple : when you declare the Form_2 class that extends Form_1, it takes all the properties and methods of Form_2, and put them in Form_1, overriding what was already existing there.
There is no longer "two distinct classes" : there is only one resulting object, that's both Form_1 and Form_2 at the same time.


And here's an example that kind of -- I hope -- will help understand what I mean :

class Form_Abstract {}
class Form_1 extends Form_Abstract {
    public $iId = 1;
    public function methodInParent() {
        var_dump($this);
    }
}
class Form_2 extends Form_1 {
    public $iId = 2;
    public function tryingToGetParentProperty() {
        var_dump(parent::$iId); 
    }
}

$form2 = new Form_2();
$form2->methodInParent();
$form2->tryingToGetParentProperty();


Using this portion of code, the call to $form2->methodInParent() will get you :

object(Form_2)#1 (1) {
  ["iId"]=>
  int(2)
}

yani bile ebeveynin sınıfında tanımlanmış bir yöntem yürütürken / çağırarak eğer, $iId özellik hala çocuk sınıfında tanımlanan değeri: bu özellik sadece bir sürüm var biridir, ve!


And the call to $form2->tryingToGetParentProperty() will get you :

Fatal error: Access to undeclared static property: Form_1::$iId

$iId denilen hiçbir static özelliği olduğu gibi Form_1.


I suppose a solution to avoid that situation would be to declare $iId as static -- but note that it would change the meaning of your code, and the way it behaves !

yani static değişken sınıfın tüm örnekleri genelinde ortak olacak - sen ^ ^ istediğini muhtemelen değil ki

ben bu tarafından iş yaptı:

public function getParentId() {
    $sClass = get_parent_class($this);
    $tmp = new $sClass;
    return $tmp->iId;
}

AMA o herhangi bir performance issue var, standart bir çözümdür?