作者gpmm (银色)
看板PHP
标题Re: [请益] 由::呼叫时自动产生建构式
时间Wed Apr 18 17:49:57 2012
※ 引述《JYHuang (夏天到了,冷不起来了说)》之铭言:
: Class Profile{
: private $db;
: private $pic_path;
: public $user_info;
: public $user_id;
: public function __construct($uid){
: $this->db = new db() // pdo;
: $this->user_id = $uid;
: $this->pic_path = path;
: self::user_info();
: }
: public user_info(){
: $sql = 'select * from user where uid='.$this->user_id';
: $this->user_info = $this->db->getrow($sql);
: }
: public get_pic($uid){
: $pic = $tihs->pic_path.$this->user_id.".jpg";
: if (!file_exitsts($pic)){
: if ($this->user_info->sex = 'male')
: return 'boy.jpg';
: else
: return 'girl.jpg';
: }
: }
: }
: 一都会先
: $user = new Profile($uid);
: echo "hello ".$user->user_info->name;
: echo "<img src='".$user->get_pic."'>";
: 来取得使用者本身的资讯和图片
: 後来想要取得其它使用者的图片时
: 想直接呼叫来取得
: echo "<img src='".Profile::get_pic($uid)."'>";
: 这样会有pic_path和user_info未被建构而无法取得的问题。
: 嗯..
: 这样的话是要怎麽去架构整个class会比较好呢?
: 把pic跟profile切开用继承的方式去写嘛?
: 还是在get_pic里做判断再做建构?
嗯…看来你想做的是 ORM,
有一个(还是该说两个)很 lightweight 的 ORM/AR 框架你可以参考一下,
http://j4mie.github.com/idiormandparis/
在你情况里,需要调整的可能不是「物件构造」去配合呼叫方法,
而是定型一个呼叫方法,然後统一物件构造。
一般实做 ORM 通常会单纯的物件呼叫或走工厂模式,
$user = new User ($uid);
$user = Factory::Model ('User')->find_one ($uid);
如果你希望在原型呼叫下直接取值当然是可以,但物件结构就开始变得 dirty,
因为太多功能目的了,每个取值 method 都必需要实做这项,不然怎麽分辨
Profile::get_pic ($uid) 可以用,而
Profile::get_xxx ($uid) 不能用的原因在哪,
而且实际上物件还是产生并且占用了资源,真正省到的仅仅是呼叫时少一行 code,
Profile::get_pic ($uid) // 内部物件初始化後丢值回来
$prof = new Profile ($uid); // 外部初始化後拿到值
$prof->get_pic ($uid)
与其这样,如果你目的是更快速/轻盈(省物件)去拿到使用者的某些特定资讯,
例如一堆使用者的 avatar list,还不如直接做 function 用 sql 来拉会比较好,
但缺点是 sql 会开始四散,维护上变得麻烦,
其实现在的物件资源占用在 PHP 版本升上去过程中已经优化很多,
除非已经是高主机压力覆载,要考虑整体优化作业,
不然不用太担心 1 个和 20 个小物件的差别,
想想那些知名的 framework 都是多少个物件交叠在奔驰的…
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.54.205
1F:推 JYHuang:嗯..其实我顾虑的也是你最後提到的~ 04/19 09:26
2F:→ JYHuang:还有一点是想把所有avatar相关的method都用同个来源 04/19 09:27
3F:→ JYHuang:这样维护比较不会漏掉 04/19 09:27