免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6699 | 回复: 7
打印 上一主题 下一主题

php OO問題 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-02 10:54 |只看该作者 |倒序浏览
假如我有Announcement,Attachment,User,Shop.....等約數十個Class.
每一個也涉及到Database,而我自己就把PDO extend成一個新class名叫Database,

請問各位會把Database object pass進所有class內還是每一次在所有class內重新建立一個database object呢?

方法1.
$db=new Database();

$ann=new Announcement($db,xxx,xxx);
$user=new User($db,xxx,xxx);
$shop=new Shop($db,xxx,xxx);

方法2.

class Announcement{
public function __construct($db,xxx){
$this->db=new Database();
}
}

方法1顯得很重覆...但方法2每一次也建立一個新connection會浪費資源
還是有其他寫法?

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-01-02 13:16 |只看该作者
不知道PHP里有没有连接池的说法。

论坛徽章:
0
3 [报告]
发表于 2010-01-03 16:44 |只看该作者
用静态属性/函数   static

论坛徽章:
0
4 [报告]
发表于 2010-01-04 10:44 |只看该作者
我看到很多講解OO deisgn pattern的書也是說database是用Singleton的方法
但我有兩個疑問

1.使用Class的原因就是希望可以不斷重用Class的file而什麼也不用修改


class Announcement{
    protected $db;

    public function __construct($db,$debug){
        $this->db=new Database($GLOBALS['DB']['project1']);
    }
}

class Shop{
    protected $db;

    public function __construct($db,$debug){
        $this->db=new Database($GLOBALS['DB']['project1']);
    }
}

class User{
    protected $db;

    public function __construct($db,$debug){
        $this->db=new Database($GLOBALS['DB']['project1']);
    }
}

等等數十個class file



每一次我其他project也要使用的時候,不是要把project1取代成project2,3,4嗎?
這樣我覺得好像有違OO可以重覆使用的意思?

2.假如某個project需要與多於一個Database建立connection,那麼Singleton Pattern不就是有缺憾嗎?

论坛徽章:
0
5 [报告]
发表于 2010-01-04 11:43 |只看该作者
连接 做单例模式就可以了

论坛徽章:
0
6 [报告]
发表于 2010-01-04 16:46 |只看该作者
LZ自己的方法1是标准做法,如果你非要用方法2貌似以下例子





方法a:
function Database()
{
static $db;
if($db==null)
{
$db=new Database();
}
return $db;
}





方法b:

  1. <?php
  2. abstract class t1{
  3.         static $db;
  4.         function get(){
  5.                 if(self::$db==null)
  6.                 {
  7.                         self::$db=new Database();
  8.                 }
  9.                 return self::$db;
  10.         }
  11. }




  12. class go extends t1{
  13.         function run(){
  14.                 echo $this->get().'<br>';
  15.         }
  16. }

  17. class go2 extends t1{
  18.         function run(){
  19.                 echo $this->get().'<br>';
  20.         }
  21. }

  22. $go=new go();
  23. $go->run();


  24. $go2=new go2();
  25. $go2->run();
  26. ?>
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-01-06 10:37 |只看该作者
利害利害...

第二個方法的確是不錯.... 可惜不是標準....所以我應該不會使用吧

這天看了一篇文章......看了後相信我自己的疑問也不是無中生有的
http://www.stubbles.org/exit.php?url_id=431&entry_id=70

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
8 [报告]
发表于 2010-01-24 17:11 |只看该作者
PHP从5版本开始已经是完全面向对象了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP