作者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)
推 LaPass:大概就是這篇講的這樣~ 11/07 10:18
推 gname:學東西就是要這樣一步一步推上來才對,否則根本不會了解一些 11/07 12:22
→ gname:本質之類的東西,然後就亂用一通...想當年我開始學著刻 11/07 12:24
→ gname:framework 時也是這樣一步一步走上來,但總有人會問為什麼不 11/07 12:25
→ gname:用現成的? 因為我只是想殺雞,為什麼一定得拿牛刀來用... 11/07 12:25
→ chrisQQ:找錯字 XD => DatabaseWithSingleton"e"::getInstance 11/07 12:36
→ rickysu:疑... for($i=0;$i<10;$i++) echo "singleton"; 罰寫10次 11/07 14:21
→ chrisQQ:其實看過很多包成 class 都只是當 namespace 用 XD 11/07 16:54
→ chrisQQ:雖然 5.3 之後提供 namespace,不過 prefix 用 \ 真是有點 11/07 16:55
→ chrisQQ:不太習慣 XD 11/07 16:55
→ dlikeayu:這篇用到了OO最基本精神;多用合成少用繼承 11/07 17:03
→ dlikeayu:再下去就是定義Model ,static method CRUD時去call連線 11/07 17:05
→ dlikeayu:每次new Model或get Model完 ->save() 就做完一堆事 11/07 17:05
→ gname:php 的 namespace 真的是越看越無言...= = 11/07 17:55
推 Elfiend:好文推一個。請問"多用合成少用繼承"這部分有更詳細解說嗎 11/07 17:57
→ Elfiend:順便再問,那麼不該用OO的時候呢?有哪些狀況嗎? 11/07 17:58
→ Elfiend:就是指哪些狀況算是濫用、不必要的使用OO。 11/07 17:58
→ gpmm:雖然也是很粗略的提過而已,不過應該多少也可以提供一點資訊 11/07 22:35
→ dlikeayu:包裝可以去看工廠模式、裝飾者模式、骨架模式 11/08 17:11
推 j87b0003:歐萊禮的深入淺出設計模式 11/15 23:32