How do I get a PHP class constructor to call its parent's parent's constructor?

前端 未结 15 1256
滥情空心
滥情空心 2020-11-28 21:38

I need to have a class constructor in PHP call its parent\'s parent\'s (grandparent?) constructor without calling the parent constructor.

//         


        
相关标签:
15条回答
  • 2020-11-28 21:45

    from php 7 u can use

    parent::parent::__construct();

    0 讨论(0)
  • 2020-11-28 21:51

    Funny detail about php: extended classes can use non-static functions of a parent class in a static matter. Outside you will get a strict error.

    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 
    

    So inside a extended class (Child) you can use

    parent::paFkt(); 
    

    or

    Pa::paFkt();
    

    to access a parent (or grandPa's) (not private) function.

    Outside class def

    $test::paFkt();
    

    will trow strict error (non static function).

    0 讨论(0)
  • 2020-11-28 21:51
    <?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();
    ?>
    

    Of course this expects you do not need to do anything within the construct of the pa_pa. Running this will output :

    Hey I am Grand Pa Hey I am a child

    0 讨论(0)
  • 2020-11-28 21:52

    Beautiful solution using 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();
    
    0 讨论(0)
  • 2020-11-28 21:53

    Another option that doesn't use a flag and might work in your situation:

    <?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";
    
    0 讨论(0)
  • 2020-11-28 21:57

    The ugly workaround would be to pass a boolean param to Papa indicating that you do not wish to parse the code contained in it's constructor. i.e:

    // 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);
        }
    }
    
    0 讨论(0)
提交回复
热议问题