我正在试验一些从数据库中检索数据的方法。 我创建了一个抽象类(ppdao),在这个类中,我有一个函数来根据表名构建选择查询并将结果转换为对象。
对于每个表我都会创建一个小文件,如下所示:
class user extends ppdao{
public $table = 'user';
public function __set ( $name, $value ){
$this->$name = $value;
}
public function __get ( $name ){
return $this->$name;
}
让我说我想要一个数组中的所有用户对象,我使用我的ppdao类中的以下函数:
public static function get_ar_obj( $arWhere = array() , $arWhereWay = array(), $order = null ){
$class = get_called_class();
$obj = new $class();
$sql = "SELECT * FROM ".$obj->table. $obj->arWheretoString($arWhere);
$res = mysqli_conn::getinstance()->query($sql)->all_assoc();
return $obj->createObjects($res);
}
这很好用,它让我得到了希望的结果。
现在我将__get函数改为:
public function __get ( $name ){
switch ($name){
case 'oAlbums':
return $this->oAlbums = albums::get_ar_obj($arWhere = array('user_id' => $this->id) );
break;
default:
return $this->$name;
break;
}
我以为我想要获得用户拥有的所有专辑,在专辑表中有一个名为user_id的字段,所以我想我会像这样将m链接在一起。
现在我打电话给这样的专辑类:
$userobject->oAlbums
get_called_class()仍然使用用户类名而不是被调用的专辑类,从而创建了一个类似
的查询SELECT * FROM user WHERE user_id = 63
And it should be SELECT * FROM album WHERE user_id = 63
任何人都知道如何才能让它发挥作用?
对不起人们,它没有使用get_called_class创建查询,它使用public $ table。现在通过将其更改为get_called_class变量
来实现它结果如下:
$arUser = user::get_ar_obj( $arWhere = array('id' => 1));
$oUser = $arUser[0];
echo '<pre>';
print_r($oUser->oAlbums);
echo '</pre>';
输出:
Array
(
[0] => album Object
(
[table] => album
[data:ppdao:private] =>
[className:ppdao:private] => album
[id] => 2
[name] => My new album 1
[slug] => my-new-album-1
[user_id] => 1
[views] => 0
[datecreated] => 2013/03/23 16:00:43
[location] => Muaha
)
答案 0 :(得分:0)
您是否查看了static
关键字?它适用于PHP5&gt; = 5.3
public static function get_ar_obj( $arWhere = array() , $arWhereWay = array(), $order = null ){
$obj = new static();
$sql = "SELECT * FROM ".$obj->table. $obj->arWheretoString($arWhere);
$res = mysqli_conn::getinstance()->query($sql)->all_assoc();
return $obj->createObjects($res);
}