Re: [請益] function OR class
※ 引述《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)
推
11/07 10:18, , 1F
11/07 10:18, 1F
推
11/07 12:22, , 2F
11/07 12:22, 2F
→
11/07 12:24, , 3F
11/07 12:24, 3F
→
11/07 12:25, , 4F
11/07 12:25, 4F
→
11/07 12:25, , 5F
11/07 12:25, 5F
→
11/07 12:36, , 6F
11/07 12:36, 6F
→
11/07 14:21, , 7F
11/07 14:21, 7F
→
11/07 16:54, , 8F
11/07 16:54, 8F
→
11/07 16:55, , 9F
11/07 16:55, 9F
→
11/07 16:55, , 10F
11/07 16:55, 10F
→
11/07 17:03, , 11F
11/07 17:03, 11F
→
11/07 17:05, , 12F
11/07 17:05, 12F
→
11/07 17:05, , 13F
11/07 17:05, 13F
→
11/07 17:55, , 14F
11/07 17:55, 14F
推
11/07 17:57, , 15F
11/07 17:57, 15F
→
11/07 17:58, , 16F
11/07 17:58, 16F
→
11/07 17:58, , 17F
11/07 17:58, 17F
→
11/07 22:35, , 18F
11/07 22:35, 18F
→
11/07 22:35, , 19F
11/07 22:35, 19F
→
11/08 17:11, , 20F
11/08 17:11, 20F
推
11/15 23:32, , 21F
11/15 23:32, 21F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章