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

时间:2011-06-02 21:56:49

标签: 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')");
    }
  }

2 个答案:

答案 0 :(得分:8)

  

不应该为其每个父类创建对象

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

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

  

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

     

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

答案 1 :(得分:1)

如果您没有专门调用父类,那么Java将调用父类的no-arg构造函数,而PHP没有这样的功能。这允许您在调用父构造函数之前做一些工作,尽管您显然不应该依赖父构造函数设置的任何属性。 ;)

是的,正如我在评论中所说,使用self::的大多数来电都应该使用$this->。仅使用self::调用静态方法。