【问题标题】:Why aren't parent constructors being called?为什么不调用父构造函数?
【发布时间】:2011-09-07 10:18:53
【问题描述】:

我将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')");
    }
  }

【问题讨论】:

  • table::__construct() 应该使用$this->protect() 而不是self::protect(),因为protect() 不是静态的。 bookmark 类中几乎所有的调用都是一样的。
  • 不要忘记$this 中的美元符号。 :)

标签: php class object hierarchy


【解决方案1】:

书签不应该也从它的每个父类创建对象

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

正如 PHP 手册所言:

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

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

【讨论】:

    【解决方案2】:

    如果你不专门调用父类的无参数构造函数,Java 会调用它,而 PHP 没有这样的特性。这允许您在调用父构造函数之前做一些工作,尽管您显然不应该依赖父构造函数设置的任何属性。 ;)

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

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 1970-01-01
      • 2015-04-24
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2014-01-14
      相关资源
      最近更新 更多