为什么不调用父构造函数? [英] Why aren't parent constructors being called?

查看:149
本文介绍了为什么不调用父构造函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 parent :: __ construct(); 中添加了表和书签的构造函数,以使此代码正常工作。为什么不自动调用它们?

I added in parent::__construct(); to the constructors of table and bookmark in order to get this code to work. Why are they not called automatically?

如果我创建一个类型为bookmark的对象 $ obj_ref_bo = new bookmark(); 从它的每个父类(除了抽象类)。

If I create an object of type bookmark $obj_ref_bo = new bookmark(); should not bookmark also create objects from each of its parent classes (besides abstract classes).

调用链是

bookmark-> table-> database(abstract) - > single_connect

bookmark->table->database(abstract)->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')");
    }
  }


推荐答案


不应该添加书签也从每个父类创建对象

should not bookmark also create objects from each of its parent classes

这是完全可以选择的,

That's entirely your choice to make, there is no requirement in the language to call the parent methods.

由于PHP手册简明扼要地提出:

As the PHP manual concisely puts it:


注意:如果子类定义了构造函数,父构造函数不会被隐式调用。为了运行父构造函数,需要在子构造函数中调用 parent :: __ construct()

Note: Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required.

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

这篇关于为什么不调用父构造函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆