代码之家  ›  专栏  ›  技术社区  ›  Paulo

如何让PHP类构造函数调用其父类的父级构造函数

  •  180
  • Paulo  · 技术社区  · 16 年前

    我需要在PHP中有一个类构造函数调用其父类的 亲本 (祖父母?)不调用父构造函数的构造函数。

    // main class that everything inherits
    class Grandpa 
    {
        public function __construct()
        {
    
        }
    
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            // call Grandpa's constructor
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
            // THIS IS WHERE I NEED TO CALL GRANDPA'S
            // CONSTRUCTOR AND NOT PAPA'S
        }
    }
    

    我知道这是一件很奇怪的事情,我正试图找到一种不臭的方法,但尽管如此,我很好奇这是否可行。

    编辑

    我想我应该公布所选答案的理由。原因是,它是对希望在保留所有值的同时调用“祖父母的”构造函数的问题的最优雅的解决方案。这当然不是最好的方法,也不友好,但这不是问题所在。

    对于以后遇到这个问题的人- 请找到另一个解决方案 . 我找到了一种更好的方法,它不会破坏课堂结构。你也应该这样。

    15 回复  |  直到 9 年前
        1
  •  129
  •   Corey Ballou    16 年前

    // main class that everything inherits
    class Grandpa 
    {
        public function __construct()
        {
    
        }
    
    }
    
    class Papa extends Grandpa
    {
        public function __construct($bypass = false)
        {
            // only perform actions inside if not bypassing
            if (!$bypass) {
    
            }
            // call Grandpa's constructor
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
            $bypassPapa = true;
            parent::__construct($bypassPapa);
        }
    }
    
        2
  •  69
  •   too much php    16 年前

    Grandpa::__construct() Papa __construct() Kiddo

        3
  •  49
  •   Alain57    14 年前
    class Grandpa 
    {
        public function __construct()
        {}
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            //call Grandpa's constructor
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
            //this is not a bug, it works that way in php
            Grandpa::__construct();
        }
    }
    
        4
  •  17
  •   j0k gauthamp    13 年前

        5
  •  16
  •   MitMaro    16 年前

    <?php
    // main class that everything inherits
    class Grandpa 
    {
        public function __construct(){
            $this->GrandpaSetup();
        }
    
        public function GrandpaSetup(){
            $this->prop1 = 'foo';
            $this->prop2 = 'bar';
        }
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            // call Grandpa's constructor
            parent::__construct();
            $this->prop1 = 'foobar';
        }
    
    }
    class Kiddo extends Papa
    {
        public function __construct()
        {
            $this->GrandpaSetup();
        }
    }
    
    $kid = new Kiddo();
    echo "{$kid->prop1}\n{$kid->prop2}\n";
    
        6
  •  14
  •   Aleksei Akireikin    11 年前

    Reflection

    <?php
    class Grandpa 
    {
        public function __construct()
        {
            echo "Grandpa's constructor called\n";
        }
    
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            echo "Papa's constructor called\n";
    
            // call Grandpa's constructor
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
            echo "Kiddo's constructor called\n";
    
            $reflectionMethod = new ReflectionMethod(get_parent_class(get_parent_class($this)), '__construct');
            $reflectionMethod->invoke($this);
        }
    }
    
    $kiddo = new Kiddo();
    $papa = new Papa();
    
        7
  •  9
  •   Fishdrowned Yajo    12 年前

    class Grandpa 
    {
        public function __construct()
        {
            echo 'Grandpa<br/>';
        }
    
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            echo 'Papa<br/>';
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
            // THIS IS WHERE I NEED TO CALL GRANDPA'S
            // CONSTRUCTOR AND NOT PAPA'S
            echo 'Kiddo<br/>';
            Grandpa::__construct();
        }
    }
    
    $instance = new Kiddo;
    

    https://bugs.php.net/bug.php?id=42016

    class Grandpa 
    {
        public function __construct()
        {
            echo 'Grandpa<br/>';
            Kiddo::hello();
        }
    
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            echo 'Papa<br/>';
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
            // THIS IS WHERE I NEED TO CALL GRANDPA'S
            // CONSTRUCTOR AND NOT PAPA'S
            echo 'Kiddo<br/>';
            Grandpa::__construct();
        }
    
        public function hello()
        {
            echo 'Hello<br/>';
        }
    }
    
    $instance = new Kiddo;
    

    $papa = new Papa;
    

    if ($this instanceof Kiddo) Kiddo::hello();
    
        8
  •  8
  •   mway    16 年前

    class Foo {
        var $f = 'bad (Foo)';
    
        function __construct() {
            $this->f = 'Good!';
        }
    }
    
    class Bar extends Foo {
        var $f = 'bad (Bar)';
    }
    
    class FooBar extends Bar {
        var $f = 'bad (FooBar)';
    
        function __construct() {
            # FooBar constructor logic here
            call_user_func(array(get_parent_class(get_parent_class($this)), '__construct'));
        }
    }
    
    $foo = new FooBar();
    echo $foo->f; #=> 'Good!'
    

        9
  •  7
  •   Xorax    13 年前

    officialy supported

    // main class that everything inherits
    class Grandpa 
    {
        public function __construct()
        {
            echo $this->one; // will print 1
            echo $this->two; // error cannot access protected property
        }
    
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            // call Grandpa's constructor
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public $one = 1;
        protected $two = 2;
        public function __construct()
        {
            Grandpa::__construct();
        }
    }
    
    new Kiddo();
    
        10
  •  3
  •   Hauke    10 年前

    error_reporting(E_ALL);
    
    class GrandPa
    {
        public function __construct()
        {
            print("construct grandpa<br/>");
            $this->grandPaFkt();
        }
    
        protected function grandPaFkt(){
            print(">>do Grandpa<br/>");
        }
    }
    
    class Pa extends GrandPa
    {
        public function __construct()
        {   parent::__construct();
            print("construct Pa <br/>");
        }
    
        public function paFkt(){
            print(">>do Pa <br>");
        }
    }
    
    class Child extends Pa
    {
        public function __construct()
        {
            GrandPa::__construct();
            Pa::paFkt();//allright
            //parent::__construct();//whatever you want
            print("construct Child<br/>");
        }
    
    }
    
    $test=new Child();
    $test::paFkt();//strict error 
    

    parent::paFkt(); 
    

    Pa::paFkt();
    

    $test::paFkt();
    

        11
  •  2
  •   lepe    12 年前

    protected function call2Granpa() {
         return parent::__construct();
    }
    

    parent::call2Granpa();

        12
  •  2
  •   Anand P    12 年前
    <?php
    
    class grand_pa
    {
        public function __construct()
        {
            echo "Hey I am Grand Pa <br>";
        }
    }
    
    class pa_pa extends grand_pa
    {
        // no need for construct here unless you want to do something specifically within this class as init stuff
        // the construct for this class will be inherited from the parent.
    }
    
    class kiddo extends pa_pa
    {
        public function __construct()
        {
            parent::__construct();
            echo "Hey I am a child <br>";
        }
    }
    
    new kiddo();
    ?>
    

        13
  •  1
  •   luchaninov pEteR    13 年前
    // main class that everything inherits
    class Grandpa 
    {
        public function __construct()
        {
            $this->___construct();
        }
    
        protected function ___construct()
        {
            // grandpa's logic
        }
    
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {
            // call Grandpa's constructor
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
            parent::___construct();
        }
    }
    

        14
  •  1
  •   Crazy Alien    10 年前
        class Grandpa 
    {
        public function __construct()
        {
            echo"Hello Kiddo";
        }    
    }
    
    class Papa extends Grandpa
    {
        public function __construct()
        {            
        }
        public function CallGranddad()
        {
            parent::__construct();
        }
    }
    
    class Kiddo extends Papa
    {
        public function __construct()
        {
    
        }
        public function needSomethingFromGrandDad
        {
           parent::CallGranddad();
        }
    }
    
        15
  •  -1
  •   lala977    9 年前

    parent::parent::__construct();