我有4个类,每个类都有自己的数据库表:
GlobalObject有3个属性
图像,项目和页面有许多不同的字段,但它们都有以下内容:
目前,我的类结构将Images,Projects和Pages作为GlobalObject类的子类,这允许3个子类访问它们所需的变量,datetime_added等。
我应该如何使用PHP和MySQL设置属性?目前,所有字段(包括global_object表中的字段)都在每个部分的表中(除了没有新表的情况下不能存在的global_object_id除外 - 这就是我需要这样做的原因),所以我从Image请求数据例如,表包含父类中的所有属性,并使用parent :: set_by_row($ database_args)和$ this-> set_by_row($ database_args);
设置目前,我执行以下操作(以图像为例):
class Image extends GlobalObject
{
$id;
$title;
function set_by_id($id)
{
// Select Q from Image table
$this->set_by_row($db_result);
}
function set_by_row($args)
{
parent::set_by_row($args);
// Set class properties
}
}
重申:我希望能够做到以下几点:
$image = new Image()
$image->set_by_global_object_id(23);
设置图像,包括父类中的所有内容(存储在单独的表中)
如果有任何不清楚的地方,请询问。
答案 0 :(得分:0)
这些“魔术方法”提供了一种非常方便的方法,例如__get和__set。以下示例提供对数据的只读访问权限,但可以使用__set方法轻松扩展。
abstract class GlobalObject {
protected $_data = array();
/* Magic Method: Enable read access via $this->name */
public function __get($key) {
if (isset($this->_data[$key])) {
return $this->_data[$key];
}
throw new Exception('Property "'. $key .'" not found.');
}
protected function _setFromArray(array $data) {
// .. do whatever needs to be done with the data ..
$this->_data = $data;
}
}
现在只需扩展此类:
class Image extends GlobalObject {
public function setByGlobalId($id) {
$result = mysql_query('SELECT i.*, g.* FROM images AS i
LEFT JOIN global_objects AS g
ON g.global_object_id = i.global_object_id
WHERE i.global_object_id = '. intval($id) .' LIMIT 1');
// @todo check if result is empty
$data = mysql_fetch_assoc($result);
$this->_setFromArray($data);
}
}
一个简单的例子:
$image = new Image();
$image->SetByGlobalId(42);
echo $image->added_by;