2017-03-08 90 views
0

從php文檔中,PDO連接在其對象的整個生命週期中都存在。因此,在下面的代碼...php PDO連接關閉範圍

<?php 

for($i = 0; $i < 5; $i++) 
{ 
    myfunc(); 
} 

function myFunc() 
{ 
    $conn = new PDO("connectionStuff"); 

    //Do things 
} 

?> 

...因爲$康恩只myFunc的範圍之內,並在PDO連接得到每逢myFunc的完成執行時間?或者它是否保留5個PDO連接直到整個頁面完成?

我是否必須在myFunc的末尾設置$ conn = null,或者這是不必要的?

+2

自己測試一下。只需在你的php腳本的末尾添加一個'var_dump($ conn);'。您始終會建立一個新的PDO實例,用於覆蓋之前創建的實例。所以在'myFunc()'函數結束之前總會有一個單獨的PDO連接。 – Marcel

+0

好的謝謝。此外,這是最佳做法,還是應該每頁使用一個PDO連接並將連接對象傳遞給函數? – mang

回答

1

只是爲了回答你在評論中提出的問題。在現代編程中,最好的做法是使用dependency injection來處理像你這樣的情況。此外,使用容器更實用。在現代的面向對象的框架中,總是有一個服務管理器,它充當一個容器並提供你需要的所有東西。

class DiContainer { 
    protected $instances = []; 

    public function __construct(array $aInstances = []) { 
     $this->instances = $aInstances; 
    } 

    public function set($sName, $oInstance) { 
     if (isset($this->instances[$sName]) { 
      throw new \Exception(sprintf(
       'An instance for "%s" already exists' 
       $sName 
      )); 
     } 

     $this->instances[$sName] = $oInstance; 
    } 

    public function get($sName) { 
     if (!isset($this->instances[$sName)) { 
      throw new ErrorException(sprintf(
       'No instance for "%s"', 
       $sName 
      )); 
     } 

     return $this->instances[$sName]; 
    } 
} 

這是依賴容器。您可以將您的應用程序所需的所有實例存儲在其中。請記住,這是一個未經測試的小例子,它顯示了依賴注入的好處。你不應該以有效的方式使用它,因爲DI容器比這個簡單的例子更加完善。

實際上,您可以在下面的示例中使用它。

// when you instanciate your application 
$oContainer = new DiContainer([ 
    'db-connection' => new PDO(...), 
]); 

// in your specific class 
public function doSomethingWithDatabase(DiContainer $oContainer) { 
    $oDbHandle = $oContainer->get('db-connection'); 
    ... 
} 
+0

謝謝。我喜歡這個想法。所以底線,DB連接應該被傳入一個函數,而不是在函數內被實例化,對嗎? – mang

+0

絕對正確 – Marcel