PHP:OOP构造函数签名

时间:2018-03-16 12:01:11

标签: oop constructor php-7

我的班级名为Books

  class Books {
      /* Member variables */
      var $price;
      var $title;

        function __construct( $title, $price ) {
           $this->title = $title;
           $this->price = $price;
        }

      /* Member functions */
      function getPrice(){
         echo $this->price ."<br/>";
      }


      function getTitle(){
         echo $this->title ." <br/>";
      }
   }

然后我添加了另一个继承我的Book类的类

class Novel extends Books {
   var $publisher;


   function getPublisher(){
      echo $this->publisher. "<br />";
   }
  function __construct( $publisher ) {
    $this->publisher = $publisher;
  }
}

现在我想通过构造函数调用Novel类并设置它的所有属性,例如title,price和publisher,所以如果我这样做

$physics = new Books("Physics for High School",1);
$testNovel = new Novel("Test Publisher"); 

它设置了$ testNovel对象的发布者值,效果很好 那么如何在创建它的对象时设置Title和price的值?

即使我尝试

$testNovel = new Novel("Test Title",4,"Test Pubisher"); 

这里&#34;测试标题&#34;被设置为发布者而不是&#34; Test Publisher&#34;。而且,如果我在签名中添加更多值,就像这样

$testNovel = new Novel("Test Title",4,"New Pub","","Whatever","","Why it allow"); 

它没有抛出任何错误为什么??

1 个答案:

答案 0 :(得分:1)

当您扩展定义构造函数的类时,使用定义它自己的构造函数的类,您需要自己调用父构造函数来提供所需的参数。 E.g:

class Novel extends Books
{
    // ...

    function __construct($title, $price, $publisher)
    {
        $this->publisher = $publisher;

        parent::__construct($title, $price);
    }
}

来自manual

  

注意:如果子类,则不会隐式调用父构造函数   定义构造函数。为了运行父构造函数,调用   子构造函数中的 parent :: __ construct()是必需的。如果   child没有定义构造函数,那么它可能会继承自   父类就像普通的类方法(如果它没有声明   作为私人)。