为什么不调用父构造函数? [英] Why aren't parent constructors being called?
问题描述
我在 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.
这篇关于为什么不调用父构造函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!