繁体   English   中英

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

[英]Why aren't parent constructors being called?

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

如果我创建一个书签$obj_ref_bo = new 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')");
    }
  }

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

这完全是您的选择,语言中不需要调用父方法。

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

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

http://php.net/oop5.decon

虽然 Java 将调用父 class 的无参数构造函数,如果您不具体调用一个,则 PHP 没有这样的功能。 这允许您在调用父构造函数之前做一些工作,尽管您显然不应该依赖父构造函数设置的任何属性。 ;)

顺便说一句,正如我在评论中所说,您使用self::的大多数调用都应该使用$this-> 仅使用self::调用 static 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM