[英]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()
。
虽然 Java 将调用父 class 的无参数构造函数,如果您不具体调用一个,则 PHP 没有这样的功能。 这允许您在调用父构造函数之前做一些工作,尽管您显然不应该依赖父构造函数设置的任何属性。 ;)
顺便说一句,正如我在评论中所说,您使用self::
的大多数调用都应该使用$this->
。 仅使用self::
调用 static 方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.