在php中实例化对象时传递parent :: __ constructor()函数的参数

时间:2015-11-12 06:44:54

标签: php oop

大家好,我对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

调用parentClass的方法和属性
    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的construcotr函数的参数。我希望getFullName1方法返回带地址的数据。 如果我写:

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

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

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

1 个答案:

答案 0 :(得分:2)

首先对遗产的含义进行一点解释。这里的事实是childClassparentClass的一个实例。 那是什么意思呢?这意味着只要访问修饰符为childClassparentClasspublic就可以使用protected的所有变量和方法。 您选择了创建公共变量,这意味着您可以使用parentClasschildClass中定义的变量。 这意味着这将完美无缺:

$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