2016-02-12 259 views
0

我的開發過程中的PHP的兩個版本之間存在以下情況。我暫時做了以下以下內容:PHP函數覆蓋?

$oldphp = getdbVersion(); 
if($oldphp) 
{ 
    $result = mysql_query($sql) or die(mysql_error()); 
} 
else 
{ 
    $result = mysqli_query($conn, $sql) or die(mysql_error()); 
} 

反正是有覆蓋這些功能,這樣你就可以調用新的名字,但老名字叫做自動使代碼只會有:

mysqli_query ($sql); 

但會看到基於服務器版本的正確功能?

我最終使用的包裝使代碼檢查並不需要是所有的地方,以檢查是否函數存在:

function _mysql_query($connection, $findrecords) 
{ 
    if(check_sql_version()) 
    { 
     $result = mysql_query($findrecords); 
    } 
    else 
    { 
     $result = mysqli_query($connection, $findrecords); 
    } 
    if(! $result) 
    { 
     die('Invalid query: ' . (check_sql_version())? mysql_error():mysqli_error()); 
    } 
    return $result; 
} 
+3

你不能簡單地取代舊的mysql'_...()'函數那樣。如果你想做正確的事情,兩個連接器都需要不同的用法。 – arkascha

+1

你可以使用包裝類,忘了分貝共(ORM任何系統一樣主義等) – kero

+0

你跑的比舊的5.0的PHP? mysqli可從php 5.0獲得。 – fusion3k

回答

0

Appaprently you can override PHP built-in functions(使用APD extension),但你真的應該有一個好的用例,那是你想要做的事情。在問題中的一個是而不是一個這樣的情況。

如果你需要同時支持MySQL和mysqli的擴展,應該比你抽象的數據庫交互使用一組類和適配器,其中每個適配器實現用來與數據庫交互的通用接口。有許多數據庫抽象庫可用,並且您可能會找到滿足您的系統要求的一個,同時仍然通過mysql和mysqli擴展提供訪問方法。

ADODB是經典之一。作爲一個遺留的庫本身,它很可能與您必須支持的舊版本的PHP一起工作,同時仍然能夠使用mysqli擴展。文檔是在這裏:

http://phplens.com/lens/adodb/docs-adodb.htm

0

您需要定義封裝器的所有功能外,還有一個如何做到這一點here一個很好的例子。在這種情況下,它提供了向後兼容性,如果您想要在較新版本的PHP中運行大量舊代碼,這非常有用。然而你的情況恰恰相反。你應該開發使用mysqli配置前向可比性墊片。

要調用(正向)墊片,只是......

if(!function_exists('mysqli_connect')) { 
    require_once 'mysqli.inc,.php'; 
} 

不過我不知道對於mysqli的現有向前墊片。