2013-03-27 62 views
1

首先:這個問題是不是重複。這是爲什麼。我之前關於這個話題的問題被關閉,作爲this(所有事情)的重複。這毫無幫助 - 我不明白這該死的東西。我對OOP完全陌生 - 我需要一個適合我的理解水平的答案 - 我不知道關聯問題的答案是在說什麼。僅僅因爲問題出現似乎是相似的,提問者可能不會 - 我在之前的問題中特別要求對我的理解水平有一個「可理解的」答案。所以,我會再問一次(如果需要的話,再次提問)。這裏所說:避免在PHP中使用全局數據庫處理程序變量,面向面向對象PHP的新手?


我還是相當新的PHP的整體,甚至是新的,以面向對象的PHP,纔剛剛開始它自己的教育在過去的一週內,有,我仍然無法掌握的一些概念比如繼承和什麼類抽象 - 其中一些我可以合理快速地獲得,因爲我一直在使用PDO處理我的數據庫連接和查詢一段時間,但除此之外,我仍然是一個新手在OOPHP,如果我的問題看起來有點「基本」,請耐心等待。

我得在每個我的網頁,其中,除其他事項外,連接到使用PDO作爲這樣一個MySQL數據庫的頂部所需的初始化文件(的init.php):

 
try { 
    $dbh = new PDO(conn. data here); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

所以,據我瞭解,在執行此代碼時,$dbh現在被實例化爲一個PDO對象。在我的init.php文件的底部是很多需要鏈接到功能文件,如user.func.phpimages.func.php

問題是每當我需要從我的一個函數內查詢數據庫,我需要聲明$dbh作爲一個全球性的,我能夠操縱它,像這樣前:現在

 
function myFunction { 
    global $dbh; // Here's the problem! 

    try { 
     $stmt = $dbh->prepare(Some SQL here); 
     $stmt->execute(); 
    } catch { 
     // etc. 
    } 
}

,這個問題是不是我的爲什麼我必須聲明爲一個全球性的理解 - 我明白了,但我怎樣才能避免它。我已經閱讀了一些關於爲什麼要避免全局變量的StackOverflow答案,我只是不確定如何。

我該如何去除我的代碼中的global $dbh?我是否會創建一個數據庫處理程序類,並在每次實例化它並使用它時將我的連接設置傳遞給構造函數方法? (看起來有點多餘)。

不知道如何替換我使用的全局變量,所以幫我理解,絕對讚賞!

+0

事實上,你不明白問題的答案並不意味着你的問題不是重複的。但是,您現在至少有一個答案可以幫助您。祝你好運。 – vascowhite 2013-03-27 06:08:11

+0

@vascowhite誠然,但即使如此,我和他的問題之間的關係似乎還是非常脆弱。我想知道如何在代碼中的函數中停止使用全局變量,他想知道如何正確設置PDO連接。如果有人能夠就我的問題回答我的問題,請賜教,我將不勝感激!謝謝。 – ReactingToAngularVues 2013-03-27 06:20:10

回答

1

用非常廣泛的術語 - 你在這裏問的關於Scope 有一些具體的理論認爲,在編寫代碼之前,先理解它是有用的。我知道它有時看起來很有吸引力,但退一步去學習一些理論在這裏真的很有用。

您鏈接到跳直入解釋依賴注入的答案,但是這可能是一個更好的地方開始(How to explain dependency injection to a 5-year-old?),特別是此評論:https://stackoverflow.com/a/1639321/181707

最後 - 我建議你看一些簡單的框架,處理這些東西 - 並從閱讀源代碼中學習。

一個超級簡單的depency注入容器是疙瘩:

http://pimple.sensiolabs.org/

有一個快速瀏覽一下介紹 - 這不是可怕的,應該可以幫助您涉及的概念。

+0

優秀的答案。有一個很好的描述PHP如何處理範圍在這裏http://php.net/manual/en/language.variables.scope.php – vascowhite 2013-03-27 06:12:17

-1

您可以通過擴展類來避免代碼的多餘使用。新類從擴展類中獲取所有公共和受保護的函數。

<?php 
//$dbh stuff up here 

class Main{ 
    public $dbh; 
    function __construct() { //this magic function runs when the class is initiated. 
     global $dbh; 
     $this->dbh = $dbh; 
     //dbh will be accessible for this whole class using $this->dbh 
    } 
} 

class imageClass extends Main{ 
    public function test(){ 
     if (isset($this->dbh){ 
      echo "it works"; 
     } 
    } 
} 

class userClass extends Main{ 
    function __construct(){ 
     //this construct function overwrites the construct function in main so dbh 
     //will not be accessible in this class 
    } 
} 

imageFunc::test(); 

如果您對不重複使用代碼感到如此擔心,爲什麼您需要在每個頁面頂部使用init.php! 我想你可能想看看Model-View-Controller框架。我從cakephp.org上的博客教程開始,您可以在YouTube上查看jream,這是創建MVC http://www.youtube.com/playlist?list=PL7A20112CF84B2229的教程。

+0

我投票,因爲你建議把$ dbh變量放到全局範圍。這是不好的做法,也是OP特別想避免的。 – vascowhite 2013-03-27 06:10:46