2015-10-12 141 views
-1

我有一個PHP類,擴展了另一個類,但我只得到MySQL在擴展類而不是第一類工作。任何人都知道問題是什麼?我似乎無法在所有現在弄明白:SPHP類,擴展數據庫不工作

# Vote class. 
class vote { 
    public $newsID; 
    private $db; 

    # Construct. 
    public function __construct() { 
     global $_database; 
     $this->db = $_database; 
    } 

    # Vote Up. 
    public function voteUp() { 
     return '<a href="#" class="fa fa-angle-up" style="position:absolute;top: 1px; right: 10px;"></a>'; 
    } 
    public function voteScore($newsID) { 

     $vote = mysqli_fetch_object($this->db->query("SELECT * FROM ".PREFIX."news WHERE newsID='".$newsID."' LIMIT 1"))->vote; 
     return '<span class="BigFontSize" style="position:absolute; top: 37px;right: 14px;">'.$vote.'</span>'; 
    } 
    public function voteDown() { 
     return '<a href="#" class="fa fa-angle-down" style="position:absolute; bottom: 0;right: 10px;"></a>'; 
    } 
} 

# News class. 
class news extends vote { 
    public $countNews; 
    private $db; 

    # Construct. 
    public function __construct() { 
     global $_database; 
     $this->db = $_database; 
    } 

    # Count News. 
    public function countNews() { 
     return $this->db->query("SELECT * FROM ".PREFIX."news ORDER BY date DESC")->num_rows; 
    } 


    # Print the news. 
    public function GetNews() { 
     $newsArray = array(); 
     $sql = $this->db->query("SELECT * FROM ".PREFIX."news ORDER BY date DESC"); 
     while ($rad = $sql->fetch_array()) { 
      $newsArray[] = array('headline' => $rad['headline'], 'content' => $rad['content'], 'date' => $rad['date'], 'poster' => $rad['userID'], 'published' => $rad['published'], 'intern' => $rad['intern'], 'newsID' => $rad['newsID']); 
     } 
     return $newsArray; 
    } 
} 

這是票類,可是沒有運作數據庫。我錯過了什麼嗎?

+0

你得到的錯誤是什麼? –

+0

備註:儘管有人可能會開始在twitter和reddit的世界中這樣想,但一個新聞不是投票。新聞文章可能是關於投票,或者可能是與新聞相關的投票/投票,但是「新聞延伸投票」......這聽起來不對。 – VolkerK

+0

向我們展示了你實例化你的'news'對象並且有任何問題或錯誤信息的代碼片段? – Alex

回答

1

只需從新聞中刪除構造函數,它將繼承投票構造函數。你將不得不使得$ db class var受保護而不是私有,並且將它從新聞中全部刪除。從它們自己對同一個$數據庫的引用中獲得絕對沒有收益,因爲它仍然是相同的實例。

雖然我們正在討論更好的代碼設計,但不要在PHP,EVER中使用GLOBAL。 PHP global in functions http://smartik.ws/2014/07/do-not-use-php-global-variables-never/

而是在構造函數中訪問全局連接對象,你是幹什麼的,使用依賴注入,即它傳遞到構造函數中的參數:

# Vote class. 
class vote { 
    public $newsID; 
    private $db; 

    # Construct. 
    public function __construct($_database) 
    { 
     $this->db = $_database; 
    } 
} 

$_database = new Database(); 
$news = new News($_database); 

從長遠來看,你會發現由於很好的原因,這是首選的做法。它也將標誌着你成爲一名專業人士而非業餘愛好者。 http://tutorials.jenkov.com/dependency-injection/index.html

+0

是的,但如果新聞課也需要初始化,這將是一個非常糟糕的主意。我們不知道。我同意設置有點奇怪,但正確的答案是重用父$ this-> db,而不是跳過子構造函數。父母構造函數永遠不會被初始化的問題。 – davidkonrad

+1

如果當子類需要做新的事情,那麼是時候添加自己的構造函數了。這真的是整個繼承點。即使那樣它也不需要它自己的數據庫對象類var,你可以調用parent :: constructor然後添加新的代碼。 –

+0

你意識到'$ _database'是一個全局變量,與這兩個類的實現無關嗎?這是一個簡單的參考,重複使用'$ _database'沒有什麼不妥 - 事實上,「_that確實是全局變量_的全部要點」。你在混合在一起,並要求OP改變他的類成員可見性設置,他只需要調用祖先構造函數。 – davidkonrad