为什么不调用父构造函数?

3 php class object hierarchy

我添加parent::__construct();到表和书签的构造函数中,以使此代码工作.为什么不自动调用它们?

如果我创建一个类型为bookmark的对象,$obj_ref_bo = new bookmark();则不应该为其每个父类(除了抽象类)创建对象.

呼叫链是

bookmark->表 - >数据库(摘要) - > single_connect

    /*single_connect*/

class single_connect
  {
  protected static $_db_pointer = NULL;
  private function __construct()
    {
    $this->_db_pointer = mysql_connect(DB_HOST, DB_USER, DB_PASS);
    mysql_select_db(DB_DATABASE);
    }
  public static function get_connection()
    {
    if(self::$_db_pointer == NULL)
      {
      return new self();
      } 
    else
      {
      echo "Error:only one connection";
      }
    }
  }

/*database*/

abstract class database
  {
  protected function __construct()
    {
    single_connect::get_connection();
    }
  static protected function query($query)
    {
    $result = mysql_query($query) or die(mysql_error());
    return $result;
    }
  }

/*table*/

class table extends database
  {
  public $_protected_arr=array();
  protected function __construct()
    {
    parent::__construct();
    $this->protect();
    }
  protected function protect()
    {
    foreach($_POST as $key => $value)
      {
      $this->_protected_arr[$key] = mysql_real_escape_string($value);
      }
    }
  }

/*bookmark*/

class bookmark extends table 
  {
  function __construct()
    {
    parent::__construct();
    $this->start();
    }   
  function start()
    {
    if(this->test())
      {
      this->insert();
      }
    else
      {
      return 1;
      }
    }
  function test()
    {
    if(this->test_empty())
      {
      return 1;
      }
    else
      {
      return 0;
      }
    }
  function test_empty()
    {
    if(text::test_empty($this->_protected_arr)) 
      {
      return 1;
      }
    else
      {
      return 0;
      }
    }
  function insert()
    {
    $url =  $this->_protected_arr['url'];
    $title =  $this->_protected_arr['title'];
    $email = $_SESSION['email'];
    database::query("INSERT INTO bo VALUES ('$title', '$url', '$email')");
    }
  }
Run Code Online (Sandbox Code Playgroud)

sal*_*the 8

不应该书签也可以从每个父类创建对象

这完全是您的选择,语言中没有要求调用父方法.

正如PHP手册简明扼要地说:

注意:如果子类定义构造函数,则不会隐式调用父构造函数.为了运行父构造函数,需要parent::__construct()在子构造函数内调用.

- http://php.net/oop5.decon