通过 parent class 定义调用的 class 属性
defining called class properties via parent class
我写了一个 parent class(使用后期静态绑定),我的数据库 classes 是从中继承的。我正在尝试编写一个构造函数来将每个 table 列分配为 child classes 的 public 属性。到目前为止,我可以在 child classes 中编写构造函数,它工作得很好,但我想把它放在 parent class 中,以便所有 child classes 属性是自动定义的。
这是我的 child class:
class Sale extends DatabaseObject {
protected static $table_name="invoices";
protected static $db_fields = array();
function __construct() {
global $database;
$query_cols = " SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE '" . self::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "' ORDER BY ORDINAL_POSITION ASC";
$cols = $database->query($query_cols);
while($col = $database->fetch_array($cols)) {
if(!property_exists($this,$col['COLUMN_NAME'])) {
$this->$col['COLUMN_NAME']=NULL;
array_push(self::$db_fields,$col['COLUMN_NAME']);
}
}
}
}
要在 parent 中使用此构造函数,我需要能够定义被调用的 class 属性.
function __construct() {
$class_name = get_called_class();
$query_cols = " SELECT COLUMN_NAME FROM information_schema WHERE TABLE_NAME LIKE '" . static::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "'";
$query_cols .= " ORDER BY ORDINAL_POSITION ASC";
$cols = $database->query($query_cols);
while($col = $database->fetch_array($cols)) {
if(!property_exists($class_name,$col['COLUMN_NAME'])) {
// the code to define called class public property?!
}
}
}
提前致谢。
通常,如果您要访问 class 的静态成员,您可以使用 static::$foo 而不是 self::$foo,但是您需要重新声明空的初始静态变量每个 child class,否则它将使用 parent 的静态成员。
我用于模型系统的另一种方法是使用 class 名称作为数组结构的一部分。
所以不用
array_push(self::$db_fields,$col['COLUMN_NAME']);
你会做
array_push(self::$db_fields[$class_name],$col['COLUMN_NAME']);
这样你基本上有一个 parent class 级别的数组,每个元素都是 child class 字段的数组,由它们的 class 名字.
我写了一个 parent class(使用后期静态绑定),我的数据库 classes 是从中继承的。我正在尝试编写一个构造函数来将每个 table 列分配为 child classes 的 public 属性。到目前为止,我可以在 child classes 中编写构造函数,它工作得很好,但我想把它放在 parent class 中,以便所有 child classes 属性是自动定义的。 这是我的 child class:
class Sale extends DatabaseObject {
protected static $table_name="invoices";
protected static $db_fields = array();
function __construct() {
global $database;
$query_cols = " SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE '" . self::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "' ORDER BY ORDINAL_POSITION ASC";
$cols = $database->query($query_cols);
while($col = $database->fetch_array($cols)) {
if(!property_exists($this,$col['COLUMN_NAME'])) {
$this->$col['COLUMN_NAME']=NULL;
array_push(self::$db_fields,$col['COLUMN_NAME']);
}
}
}
}
要在 parent 中使用此构造函数,我需要能够定义被调用的 class 属性.
function __construct() {
$class_name = get_called_class();
$query_cols = " SELECT COLUMN_NAME FROM information_schema WHERE TABLE_NAME LIKE '" . static::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "'";
$query_cols .= " ORDER BY ORDINAL_POSITION ASC";
$cols = $database->query($query_cols);
while($col = $database->fetch_array($cols)) {
if(!property_exists($class_name,$col['COLUMN_NAME'])) {
// the code to define called class public property?!
}
}
}
提前致谢。
通常,如果您要访问 class 的静态成员,您可以使用 static::$foo 而不是 self::$foo,但是您需要重新声明空的初始静态变量每个 child class,否则它将使用 parent 的静态成员。
我用于模型系统的另一种方法是使用 class 名称作为数组结构的一部分。
所以不用
array_push(self::$db_fields,$col['COLUMN_NAME']);
你会做
array_push(self::$db_fields[$class_name],$col['COLUMN_NAME']);
这样你基本上有一个 parent class 级别的数组,每个元素都是 child class 字段的数组,由它们的 class 名字.