2011-11-11 37 views
4

我是新來的類和oo。 我一直在尋找一個基本的MySQL類,並且我發現了Matthew Saragusa的「一個簡單的MySQL類」。PHP:在類之外或構造函數中定義常量?

這些是第一行:

define('SIMPLE_DB_SERVER', 'mysqlserver.net'); 
define('SIMPLE_DB_NAME', 'mydbname'); 
define('SIMPLE_DB_USERNAME', 'myusername'); 
define('SIMPLE_DB_PASSWORD', 'mypassword'); 
class ASimpleMySQLDB { 
    public function __construct($server, $database, $username, $password){ 

     $this->conn = mysql_connect($server, $username, $password); 
     $this->db = mysql_select_db($database,$this->conn); 
    } 
[...] 

我不知道是否有用於該常數被定義在類外,而不是使用構造一個具體的原因 - 例如:

public function __construct(){ 
    $this->conn = mysql_connect('localhost', 'username', 'password'); 
    $this->db = mysql_select_db('database',$this->conn); 
} 

或者:

public function __construct($which_db){ 
     if($which_db=='firstdb'){ 
      $server='localhost'; 
      $username='user1'; 
      $password='pass1'; 
      $database='db1'; 
     }elseif($which_db=='otherdb'){ 
      $server='localhost'; 
      $username='user2'; 
      $password='pass2'; 
      $database='db2'; 
     } 

    $this->conn = mysql_connect($server, $username, $password); 
    $this->db = mysql_select_db($database,$this->conn); 

} 

或使用開關或其他。

這兩種方法有什麼區別?你會推薦哪個?非常感謝:-)

+0

什麼更可讀? –

+0

如何在.ini文件中定義它們:P – Esailija

回答

2

雖然現在大多數OO PHP開發人員都很沮喪,但許多庫仍然使用define()來設置配置常量,這些常量需要由實現該庫的最終用戶修改。這些通常被收藏在一個需要/需要配置信息的類中包含的配置文件中,或者包含在全局所需的堆棧中(如果需要的話可以進一步備份)(WordPress需要記住)。

PHP 5 includes類常量來完成這個相同的功能,但只在類本身的範圍內。

http://php.net/manual/en/language.oop5.constants.php

這種做法是創建你的庫將需要特定類的,不可改變的價值的好方法。由於在PHP中使用OOP的主要目標之一是代碼可重用性,因此將該包配置良好地發佈。對於數據庫類,您可以在您的構造方法定義所有訪問憑證(例如db_host,db_user和db_pass)之前進行const聲明。請注意,這些常量必須通過ClassName::ConstName來訪問,就像靜態方法一樣。儘管PHP中的OOP已經走過了很長的路,並且現在已經廣泛存在,但大量更老的或更「鎖定」的框架和庫仍然使用定義約定,所以即使在OO環境中也會看到它很常用。

+0

非常感謝,正是我希望聽到的。 – Giona

+0

如果您只是在學習,我建議您儘可能多地閱讀PHP文檔的課程章節。它真的有助於理解靜態與實例化方法以及對象繼承等核心事物。 http://www.php.net/manual/en/language.oop5.php 即使早已在我的團隊中從PHP切換到Python,PHP文檔的質量和範圍仍然是我真正的小姐! – DeaconDesperado

+0

我學會了php自學,現在我正在讀一本書,由Peter MacIntyre shop.oreilly.com/product/9780596804381​​.do 不幸的是我是意大利語,雖然我對英語很熟悉,但技術語言對我來說依然很難: - ) – Giona

1

我不確定該特定MySQL連接類的具體上下文,但將連接信息定義爲常量而不是類屬性的區別是範圍之一。

在特定代碼行運行後,常量可在代碼庫中的任何位置使用,因此您可以在ASimpleMySQLDB類之外訪問它們。另一方面,在構造函數中定義的任何變量都不能在類之外工作。

很多時候,我發現人們在代碼的開頭使用常量來設置需要修改的值(通常只有一次)(WordPress在wp-config.php文件中使用http://codex.wordpress.org/Editing_wp-config.php) 。通過這種方式,人們不必深入該類就可以找到設置數據庫連接值的位置。我猜這個可讀性因素就是爲什麼這個特定的作者決定使用常量。

+0

非常感謝您的評論!那麼除了在課外提供課程之外,沒有別的原因嗎?由於他們不會被代碼的其他部分使用(這就是爲什麼我想要一個類來管理數據庫連接),我會把它們放在構造函數中。 再次感謝 – Giona

+0

是的。按照DeaconDesperado的說法,它現在主要是一個約定,這意味着你的MySQL連接信息在連接類之外的代碼庫中可用,這對安全性沒有幫助。 – brandwaffle

0

常量定義了一個地方。而在您的示例中,其他開發人員將不得不搜索數據庫參數的位置。

2
  1. 所以其他的文件/類可以訪問所定義的值(GLOBAL)
  2. 更容易的情況下,編輯你要改變你的分貝在未來

最好的方式來實現,這是對用所有這些定義創建一個配置文件。 即

的configuration.php

define('SIMPLE_DB_SERVER', 'mysqlserver.net'); 
define('SIMPLE_DB_NAME', 'mydbname'); 
define('SIMPLE_DB_USERNAME', 'myusername'); 
define('SIMPLE_DB_PASSWORD', 'mypassword'); 

,並將其納入到你的MySQL連接類connection.php

include "configuration.php"; 

class DBConnection 
{ 
    public function __construct(){ 
     $this->conn = mysql_connect(SIMPLE_DB_SERVER, SIMPLE_DB_USERNAME, SIMPLE_DB_PASSWORD); 
     $this->db = mysql_select_db(SIMPLE_DB_NAME,$this->conn); 
    } 
} 
0

這種分離是最有可能的,因爲ASimpleMySQLDb類是圍繞着數據庫的包裝。這是一個通用類,因此通過在構造函數中編寫連接細節的硬編碼來使其具體化將會使其無法重用。即使在單個應用程序中,您也希望保持這種靈活性,因爲您最終可能會擁有多個數據庫。

我個人傾向於創建一個遵循單例模式的Application類,並在該類中聲明我的數據庫連接詳細信息爲static變量。這使我仍然可以根據需要輕鬆更改我的數據庫連接信息或添加其他數據庫。

相關問題