在php中实例化对象时为parent::__constructor()函数传递参数


Passing parameter for parent::__constructor() function while instantiating an object in php

大家好,我是php中面向对象编程的新手。所以有时候我在学习PHP OOP时需要帮助。这是一个名为parentClass的类,我有一些方法和属性,比如:

    class parentClass 
    {
    public $fname;
    public $lname;
     public $age;
    function __construct($title, $firstName, $lastName, $age,$address)  
      {
        $this->title    = $title;
        $this->fname    = $firstName;
        $this->lname   = $lastName;
        $this->age      = $age;
        $this->address = $address;
      }

     public function getFullName()
    {
        return $this->fname . " " . $this->lname. " ". $this->address;
     }
    }

我还有一个名为childClass的子类,它用其他一些属性和方法扩展了parentClass,其中还有另一个_constructor函数。然后我用parent::__construct 调用了parentCClass的方法和属性

    class childClass extends parentClass
    {
    function __construct($title1, $firstName1, $mainName1, $age1)   
    {
     parent::__construct($title, $firstName, $lastName, $age, $address)
        $this->title1   = $title1;
        $this->fname1   = $firstName1;
        $this->lname1   = $mainName1;
        $this->age1     = $age1;
     }
    function getFullName1()
    {
        return $this->fname1 . " " . $this->lname1 . " ". $this->address;
     }
    }

所以现在我必须将参数传递给parentClass的constructor函数的参数。我希望getFullName1方法返回带有地址的数据。如果我写:

         $obj = new childClass("title", "Rohim", "Uddin", 50);

在这里,我只能在childClass的__constructor函数参数中传递参数。

我的问题是在哪里传递parentClass的constructor函数的参数?更具体的$address参数;提前谢谢。我对任何错误感到抱歉。

首先对继承的含义进行一点解释。这里的事实是childClassparentClass的一个实例。那这意味着什么呢?这意味着只要访问修饰符是publicprotectedchildClass就可以使用parentClass的所有变量和方法。您选择了创建公共变量,这意味着您可以在childClass中使用parentClass中定义的变量。这意味着这将运行良好:

$instance = new childClass("Title","Firstname","Lastname",etc.);
echo $instance->fname; //echo's "Firstname" (according to the code below)   

如果使用继承,则子构造函数需要接收要通过父构造函数传递的参数。

你快到了,我在下面的代码中发表了一些评论:

class parentClass 
{
    //Create the title variable if you want to use it here
    public $title;
    public $fname;
    public $lname;
    public $age;
    //Create the address variable if you want to use it here
    public $address;
    function __construct($title, $firstName, $lastName, $age,$address)  
    {
        $this->title    = $title;
        $this->fname    = $firstName;
        $this->lname    = $lastName;
        $this->age      = $age;
        $this->address  = $address;
    }
    public function getFullName()
    {
        return $this->fname . " " . $this->lname. " ". $this->address;
    }
}
class childClass extends parentClass
{
    //It's not necessary to add an `1` or something else to this parameters. Just give them clean names.
    //If you want to pass the `$address` variable through the constructor you should add this parameter to this constructor. Since it's the constructor the variable won't be filled elsewhere.
    function __construct($title, $firstName, $lastName, $age, $address)   
    {
        parent::__construct($title, $firstName, $lastName, $age, $address)
        //This code is too much. In the line above you already passed the variables to the parent constructor. There they are handled by the parents constructor. 
        //As i explained above you can access these variables, thus it makes no sence to create new variables here or to override the just-setted variables.
        /*$this->title1   = $title1;
        $this->fname1   = $firstName1;
        $this->lname1   = $mainName1;
        $this->age1     = $age1;*/
    }
    //Why you write this function here? Because `childClass` inherits from `parentClass` you can just use the methods of `parentClass`. If you call `childClass->getFullName()` the `getFullName` function in `parentClass` will be executed.
    //It will return the same values as you are returning here. Just leave this function. Only create this function if you want to override the default `parentClass->getFullName` behaviour. Then leave the 1 so it will be `getFullName` instead of `getFullName1`
    /*function getFullName1()
    {
        return $this->fname1 . " " . $this->lname1 . " ". $this->address;
    }*/
}

最后发生了什么?

$instance = new childClass("My Title", "Stefan", "Pols", 25, "My Adress 1");
//`childClass` constructor is called here.
//The first line (`parent::__construct`) will pass the variables to the parentClass. There they are set to the right variables.
echo $instance->getFullName();
//Compiler tries to find the method `getFullName()` in `childClass`. It doesn't exist.
//Compiler sees it inherits from `parentClass` so it's going to search the method `getFullName()` in `parentClass`
//It does exist. Since we setted the variables during the creation of the `$instance` object (through the constructor) this function will return the right values.
Output: `$this->fname . " " . $this->lname. " ". $this->address;`  > Stefan Pols My Adress 1