2015-06-16 86 views
1

我是新來做事的oop方式。這是我得到的。PHP OOP在其他類中的訪問方法

首先,我創建了一個將我連接到數據庫的類。然後我創建了一個類來從數據庫中獲取結果。

/engine/classes.php

class DB 
{ 
    public static function dbConnect() 
    { 
     $db = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); 
     if ($db->connect_error) { 
     die('A connection to the database cannot be made.'); 
     } 
    } 
} 

class Blog 
{ 
    public function fetchBlog() 
    { 
     DB::dbConnect(); 
     $results = array(); 
     if ($blog = $db->query('SELECT * FROM blog')) { 
      if ($blog->num_rows) { 
       while ($row = $blog->fetch_object()) { 
        $results[] = $row; 
       } 
      $blog->free(); 
      } 
     } 
    } 
} 

然後,我有一個core.php文件,其中包括我我classes.php文件,這些類別實例。像這樣

/engine/core.php

require_once 'classes.php'; 

$con = new DB(); 
$con->dbConnect(); 

$blog = new Blog(); 

於是最後我有我的index.php當我想呼應的結果我得到。看起來像這樣

的index.php

<?php include 'engine/core.php'; ?> 
html stuff 
<div id="blog"> 
    <?php 
    $blog->fetchBlog(); 
    if (!count($results)) { 
     echo'There are no blog posts at this time.'; 
    } else { 
     foreach ($results as $r) { 
      echo'<div class="blogPost"> 
       <em>', escape($r->postDate), '</em> 
       <h1>', escape($r->postTitle), '</h1> 
       <div>', escape($r->postBody), '</div> 
      </div>'; 
     } 
    } 

    ?> 
</div> 

我有錯誤報告和關於core.phpclasses.php沒有得到錯誤。但是我index.php頁面上我得到這些錯誤

Notice: Undefined variable: db in C:\wamp\www\website\engine\classes.php on line 138 
Fatal error: Call to a member function query() on a non-object in C:\wamp\www\website\engine\classes.php on line 138 

我如何糾正呢?我假設我需要一個__construct,並且我還假設我沒有正確調用dbConnect方法。我嘗試了很多東西,但是在這裏列出它們太多了?誰能告訴我我做錯了什麼?

+1

在您的Blog類的構造函數內部傳遞數據庫依賴關係,以使其在本地可訪問。 –

回答

0

在你的類Blog你剛剛訪問變量$db這是從來沒有在該行宣佈:

if ($blog = $db->query('SELECT * FROM blog')) { 

你必須給一個變量$db添加到您的類數據庫,然後創建一個類的新實例在你的班級Blog

+0

$ db在DB類中,我在fetchBog中用DB :: dbConnect調用它是錯誤的嗎?我必須添加到DB類公共$ db和tehn做一個__construct有$ this-> db = $ db = new mysqli? – badsyntax

+0

是的,在你的腳本中,變量'$ db'是你的'DB'類的局部變量。這就是爲什麼當你試圖調用它的時候會出錯:對於你所在的範圍('fetchBlog'函數),沒有定義'$ db'。 –

2

問題是您的$db變量對於DB::dbConnect()函數是本地的,這意味着一旦該函數完成運行,它將被銷燬。

$results還有一個問題,您沒有從函數中返回它或從函數調用中分配一個值。

通過以下編輯,您將能夠使其工作,我會評論它,希望能夠讓您更好地理解爲什麼我按照自己的方式完成了任務。

/engine/classes.php

class DB 
{ 
    /** 
    * keep the variable available for all instances of the DB class since it's static. 
    */ 
    static protected $db; 

    /** 
    * get database instance, connect if necessary 
    */ 
    public static function conn() 
    { 
     /** 
     * automatically connect to the database if it's not connected 
     * this is known as lazy loading, which means it only creates 
     * the resource at the exact time that it needs it 
     */ 
     if (false === (self::$db instanceof mysqli) { 
      self::connect(); 
     } 
     return self::$db; 
    } 

    /** 
    * create a connection to the database 
    */ 
    protected static function connect() 
    { 
     self::$db = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); 
     if (self::$db->connect_error) { 
      die('A connection to the database cannot be made.'); 
     } 
    } 
} 

class Blog 
{ 
    public function fetchBlog() 
    { 
     $results = array(); 
     /** 
     * Since the db method is static, you can just call it without an instance 
     */ 
     if ($blog = DB::conn()->query('SELECT * FROM blog')) { 
      if ($blog->num_rows) { 
       while ($row = $blog->fetch_object()) { 
        $results[] = $row; 
       } 
      $blog->free(); 
      } 
     } 
    /** 
     * you didn't do anything with the results, presumably you want to return them so you can do something with them 
     */ 
    return $results; 
    } 

} 

/engine/core.php

require_once 'classes.php'; 

/** 
* It is unnecessary to create an instance of the DB class 
* as all methods are defined statically 
*/ 
//$con = new DB(); 
//$con->dbConnect(); 

$blog = new Blog(); 

索引。PHP

<?php include 'engine/core.php'; ?> 
<!-- html stuff --> 
<div id="blog"> 
    <?php 
    /** 
    * You must assign the output of the function call so you can make use of it 
    */ 
    $results = $blog->fetchBlog(); 
    if (!count($results)) { 
     echo'There are no blog posts at this time.'; 
    } else { 
     foreach ($results as $r) { 
      echo'<div class="blogPost"> 
       <em>', escape($r->postDate), '</em> 
       <h1>', escape($r->postTitle), '</h1> 
       <div>', escape($r->postBody), '</div> 
      </div>'; 
     } 
    } 

    ?> 
</div> 
+0

我試過了,現在我得到這個錯誤構造函數DB ::數據庫()不能靜態在C:\ wamp \ www \ ballpointmachinist \ engine \ classes.php在第36行我還添加了一個)if語句在db方法裏面。 – badsyntax

+0

所以我發現方法和類名不能匹配。所以我改變了它,但現在我有一個意想不到的ruturn refrencing返回$結果 – badsyntax

+0

我覺得它返回需要在方法內。感謝Augwa和Avinash的幫助 – badsyntax

0

在你行if ($blog = $db->query('SELECT * FROM blog')) {$db從未聲明。

你需要做的是從構造函數返回DB對象,所以你DB類應該如下:

class DB 
{ 
    public static function dbConnect() 
    { 
     $db = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); 
     if ($db->connect_error) { 
      die('A connection to the database cannot be made.'); 
     } 

     // Note this line :) 
     return $db; 

    } 
} 
從這個

除了有很多很多的改進,可以在你的代碼來完成。剛開始我建議你從這裏詳細介紹OOP:http://php.net/manual/en/language.oop5.php

偏離主題,但我想補充幾點建議。正如你已經創建了DB對象創建方法一樣。我會建議爲這樣的對象實現Singleton設計模式,因爲在你的應用程序中只需要這個類的一個對象。 Read More

相關問題