48 votes

parent::parent en PHP

Je cherche un moyen d'accéder au parent, à la fonction parent d'une classe sans appeler le parent... Hmmm, cela semble une explication un peu bizarre alors je vais donner un exemple :

class myclass
{
  public function test() { return 'level 1'; }
}
class myclass2 extends myclass
{
  public function test() { return parent::test() . '-level 2'; }
}
class myclass3 extends myclass2
{
  public function test() { return parent::test() . '-level 3'; }
}
$example = new myclass3();
echo $example->test(); // should display "level 1-level 2-level 3"

Je voudrais afficher "niveau 1-niveau 3" puis faire quelque chose comme ça :

class myclass3 extends myclass2
{
  public function test() { return parent::parent::test() . '-level 3'; }
}

Avez-vous une idée de la façon dont je peux faire cela ? (Je ne suis pas autorisé à éditer myclass et myclass2, ils font partie d'un framework...)

69voto

PiTheNumber Points 8264

Une solution simple. Utilisez directement l'objet racine myclass :

class myclass3 extends myclass2
{
  public function test() { return myclass::test() . '-level 3'; }
}

Si vous avez besoin d'une approche plus générale, consultez le site suivant outis réponse .

23voto

outis Points 39377

Vous pouvez le faire en utilisant get_parent_class

function get_grandparent_class($thing) {
    if (is_object($thing)) {
        $thing = get_class($thing);
    }
    return get_parent_class(get_parent_class($thing));
}

class myclass3 extends myclass2 {
    public function test() {
      $grandparent = get_grandparent_class($this);
      return $grandparent::test() . '-level 3'; 
    }
}

Ou vous pouvez utiliser réflexion :

function get_grandparent_class($thing) {
    if (is_object($thing)) {
        $thing = get_class($thing);
    }
    $class = new ReflectionClass($thing);
    return $class->getParentClass()->getParentClass()->getName();
}

Cependant, ce n'est peut-être pas une bonne idée, selon ce que vous essayez d'obtenir.

4voto

Wesley van Opdorp Points 8536

Non, ce n'est pas possible. Malheureusement, il n'y a pas de possibilité de se référer directement à la classe d'origine, seulement à son self ou à son parent .

4voto

LostMohican Points 1069

Peut-être pouvez-vous ajouter myclass2 comme objet membre dans myclass3 et essayer de coder comme :

class myclass3{
myclass2 obj2;
public function test() { return $obj2->callParentTest() . '-level3';}
}

2voto

Eric Herlitz Points 6313

Vous ne pouvez pas enchaîner les parents, créez plutôt une sorte de méthode GetParent() dans vos classes parentes qui renvoie simplement $this ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X