2013-11-09 224 views
0

我正在顯示一個相對「重」的PHP頁面。我有幾個函數每個都使用連接到數據庫來獲取一些行。我注意到在每個函數中創建一個新的$ con可以減慢很多事情,所以很自然地我想爲頁面上的每個函數使用相同的$ con。我嘗試這樣做:

$con = mysqli_connect("localhost","root","root", "mydb"); 

function fA($a, $b, &$con = $con) 
{} 

function fB($a, &$con = $con) 
{} 

你可以看到我想要一個指針傳遞給$ CON爲每個功能,但我得到一個syntax error, unexpected $con的每一個。 (我能通過$ CON每當我打電話給他們,但做這種方式,我沒有回去,並改變每個函數調用的函數,它看起來整潔)

+2

PHP不能像那樣工作。 '$ con'在您定義函數時沒有定義。只需定義爲'函數fA($ a,$ b,$ con)'和對象'$ con'將始終通過引用傳遞。 –

+0

換句話說,通過在函數原型中「預定義」一個變量,你無法避免在運行時傳遞一個參數。您可以使用常量值定義默認值,但不能使用動態(變量)值。 –

+0

好吧,如果我打電話給fA(10,12)他會自動獲得$ con? – Juicy

回答

1

您可以使用:

global $con; 

在每個功能的身體開始像這樣:

function fA($a, $b) { 
    global $con 
    // ...etc... 
} 

但是,這通常被視爲一種不好的做法。

更好的方法是使用依賴注入,以便您的邏輯不會依賴於賦予它的存儲設備的種類。沿着這些路線的東西:

class LogicExecutor { 
    private $con; 

    public __construct($con) { 
     $this->con = $con; 
    } 

    public function doTaskOne($a, $b) { 
     // you can use $this->con in this scope 
    } 
} 

$con = mysqli_connect('localhost', 'root', 'root', 'mydb'); 
$le = new LogicExecutor($con); 

$le->doTaskOne('a','b'); 

但即使這樣,也對夫婦代碼以mysqli非常緊密。你有沒有考慮過ORM

0

使用全局$ con是好的,最好的解決方案是把東西放到一個類中。

如果你堅持你的原始概念,你應該在每個函數調用中傳遞$ con。

$con = mysqli_connect("localhost","root","root","mydb"); 
fA("abraca","dabra",$con); 
fB("hocus-pocus",$con); 

function fA($a, $b, &$con) 
{} 

function fB($a, &$con) 
{} 

也許最好使用$ con作爲第一個參數。