作者rickysu (Ricky)
看板PHP
标题Re: [请益] function OR class
时间Thu Nov 7 10:05:27 2013
※ 引述《coldollsheep (加油加油^^)》之铭言:
: 各位先进好
: 我大概会被炮...
: 我对function 式开发有满深的着迷
: 而且我看wordpress phpmyadmin也大量的使用这样的设计
: 但是我现在这家公司用了大量的class
: 这不是对错问题~
: 但是我对程式之间继承来继承去觉得" 没那麽好 "
: 大家有没有甚麽可以讨论一下呢?
把一堆 function 封装成 Class 不代表这样就是 OO 了。
OO 也不是只有继承而已。
以下就举个简单的例子,为什麽要 OO。
假设我们把资料库连线相关的东西封装起来。
<?php
class Database
{
/**
* 初始化
*/
public function __construct()
{
}
/**
* 连线
*/
public function connect($host, $user, $password, $database)
{
// ...
}
/**
* 中断连线
*/
public function disconnect()
{
// ...
}
}
所以使用时就会像这样
<?php
$connection = new Database();
$connection->connect('localhost', 'dbuser', 'dbpassword', 'mydatabase');
//结束连线时
$connection->disconnect();
问题来了,每次程式结束时都得呼叫 disconnect,这太不人性化了。
因此我们把程式再封装一次。
<?php
class AutoDisconnectDatabase extends Database
{
function __destruct()
{
$this->disconnect();
}
}
<?php
$connection = new AutoDisconnectDatabase();
$connection->connect('localhost', 'dbuser', 'dbpassword', 'mydatabase');
好了这样一来我们就不用到处呼叫 disconnect。
只要程式一结束,就会自动呼叫 disconnect。
但是每次都得输入帐号密码,如果哪天要改帐号密码,
或是修改了参数的项目。那不就得改到死。
所以我们再封装一次
<?php
class DatabaseWithSimpleFactory extends AutoDisconnectDatabase
{
public static function factory()
{
return new static('localhost', 'dbuser', 'dbpassword', 'mydatabase');
}
}
使用
<?php
$connection = DatabaseWithSimpleFactory::factory();
这样一来程式就更清爽了,帐号密码以及初始化统统集中了。
可是这样还是有个问题。
如果有人手贱,到处呼叫 DatabaseWithSimpleFactory::factory()
那不就制造出一堆连线出来,虽然会自动 disconnect 但还是会浪费资源。
因此就得动用另一个方式。
<?php
class DatabaseWithSingleton extends DatabaseWithSimpleFactory
{
protected static $connection = null;
public static function getInstance()
{
if(self::$connection === null){
self::$connection = static::factory();
}
return self::$connection;
}
}
使用
<?php
$connection = DatabaseWithSingletone::getInstance();
透过这个方式取得的连线只会有一个,不会有重复连线的问题。
上面的范例中其实使用了 Simple Factory 以及 Singleton
这两个常见的 pattern 。
希望能让大家对於为什麽要 OO 有不一样的想法。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.136.115
※ 编辑: rickysu 来自: 220.130.136.115 (11/07 10:07)
1F:推 LaPass:大概就是这篇讲的这样~ 11/07 10:18
2F:推 gname:学东西就是要这样一步一步推上来才对,否则根本不会了解一些 11/07 12:22
3F:→ gname:本质之类的东西,然後就乱用一通...想当年我开始学着刻 11/07 12:24
4F:→ gname:framework 时也是这样一步一步走上来,但总有人会问为什麽不 11/07 12:25
5F:→ gname:用现成的? 因为我只是想杀鸡,为什麽一定得拿牛刀来用... 11/07 12:25
6F:→ chrisQQ:找错字 XD => DatabaseWithSingleton"e"::getInstance 11/07 12:36
7F:→ rickysu:疑... for($i=0;$i<10;$i++) echo "singleton"; 罚写10次 11/07 14:21
8F:→ chrisQQ:其实看过很多包成 class 都只是当 namespace 用 XD 11/07 16:54
9F:→ chrisQQ:虽然 5.3 之後提供 namespace,不过 prefix 用 \ 真是有点 11/07 16:55
10F:→ chrisQQ:不太习惯 XD 11/07 16:55
11F:→ dlikeayu:这篇用到了OO最基本精神;多用合成少用继承 11/07 17:03
12F:→ dlikeayu:再下去就是定义Model ,static method CRUD时去call连线 11/07 17:05
13F:→ dlikeayu:每次new Model或get Model完 ->save() 就做完一堆事 11/07 17:05
14F:→ gname:php 的 namespace 真的是越看越无言...= = 11/07 17:55
15F:推 Elfiend:好文推一个。请问"多用合成少用继承"这部分有更详细解说吗 11/07 17:57
16F:→ Elfiend:顺便再问,那麽不该用OO的时候呢?有哪些状况吗? 11/07 17:58
17F:→ Elfiend:就是指哪些状况算是滥用、不必要的使用OO。 11/07 17:58
19F:→ gpmm:虽然也是很粗略的提过而已,不过应该多少也可以提供一点资讯 11/07 22:35
20F:→ dlikeayu:包装可以去看工厂模式、装饰者模式、骨架模式 11/08 17:11
21F:推 j87b0003:欧莱礼的深入浅出设计模式 11/15 23:32