2013-02-21 215 views
3

我有一個問題,瞭解如何類推廣工作..PHP類擴展

我試圖擴展一個類中有它更有組織不同的文件分割功能..

但我有問題訪問主類的變量和函數到子類中。

這就是什麼,我有:

父類:這是UFLEX V類0.88 我就不寫了這一切,因爲它是長..

class uFlex { 
    //Constants 
    const version = 0.88; 
    const salt = ""; 
    //End of constants\\\\ 
    /** 
    * PDO/database credentials 
    */ 
    var $db = array(
     "host" => '', 
     "user" => '', 
     "pass" => '', 
     "name" => '', //Database name 
     "dsn" => '' //Alterntive PDO DSN string 
    ); 

     function connect(){ 
     if(is_object($this->db)) return true; 

     /* Connect to an ODBC database using driver invocation */ 
     $user = $this->db['user']; 
     $pass = $this->db['pass']; 
     $host = $this->db['host']; 
     $name = $this->db['name']; 
     $dsn = $this->db['dsn']; 

     if(!$dsn){ 
      $dsn = "mysql:dbname={$name};host={$host}"; 
     } 

     $this->report("Connecting to database..."); 

     try{ 
      $this->db = new PDO($dsn, $user, $pass); 
      $this->report("Connected to database."); 
     }catch(PDOException $e){ 
      $this->error("Failed to connect to database, [SQLSTATE] " . $e->getCode()); 
     } 

     if(is_object($this->db)) return true; 
     return false; 
    } 
} 

然後:

<?php 
class admin extends uFlex { 

    function adm_getUsers(){ 
      if(!$this->connect()) return false; 

      $sql= "SELECT * from users LIMIT 30"; 
      $st = $this->db->prepare($sql); 
     $out = $st->execute(); 
      $row = $st->fetchAll(PDO::FETCH_ASSOC); 
      return $row;  
    } 

    function adm_getSingleUser($id){ 
      if(!$this->connect()) return false; 
     if(is_numeric($id)){ 
      $sql= "SELECT * from users WHERE id = '$id'"; 
      }else{ 
      $sql= "SELECT * from users WHERE username = '$id'"; 
      } 
      $st = $this->db->prepare($sql); 
     $out = $st->execute(); 
      $row = $st->fetch(PDO::FETCH_ASSOC); 
      return $row; 
    } 
} 

?> 

我在配置文件中初始化它們,包括在每一頁中:

$user = new uFlex(false); 
$admin = new admin(); 

但是,當使用$admin->adm_getUsers(); $ row數組時,它是空的。

在嘗試在兩個類之間分割函數之前,我在主類中使用了相同的函數,並且正在工作。

這是我第一次嘗試擴展一個類..我在谷歌搜索,也在這裏得到了一些問題,但它對我來說太複雜了,因爲我仍然在學習PHP。

+1

不要使用繼承在不同的文件分割功能! – Philipp 2013-02-21 09:39:00

+1

'「SELECT *來自用戶的用戶名='$ id'」'是安全風險。 – jantimon 2013-02-21 09:45:44

+0

@Ghommey'$ id'在被傳遞給函數之前被檢查並轉義。無論如何,它只是一個測試功能。 – Fr0z3n 2013-02-21 09:51:48

回答

7

這是繼承不是最好的答案。相反,您可以放棄繼承並使用組合。通過您的uFlex例如,通過爲Admin依賴如下:

$user = new uFlex(false); 
$admin = new Admin($user); // uFlex is being passed in 

首先你需要更新你的PHP類,因爲有一些改動:

class Admin { 

    // Added private variable that will hold the uFlex instance 
    private $user; 

    // Added a class constructor which will be called when we create a new Admin 
    function __construct($user) { // Receives an instance of uFlex 
     $this->user = $user; 
    } 

    function adm_getUsers(){ 
     if(!$this->user->connect()) return false; // Call connect on user 
     $sql= "SELECT * from users LIMIT 30"; 
     $st = $this->user->db->prepare($sql); // Call prepare on db of user 
     $out = $st->execute(); 
     $row = $st->fetchAll(PDO::FETCH_ASSOC); 
     return $row;  
    } 

    function adm_getSingleUser($id){ 
     if(!$this->user->connect()) return false; // Same here 
     if(is_numeric($id)) { 
      $sql= "SELECT * from users WHERE id = '$id'"; 
     } else { 
      $sql= "SELECT * from users WHERE username = '$id'"; 
     } 
     $st = $this->user->db->prepare($sql); // And here 
     $out = $st->execute(); 
     $row = $st->fetch(PDO::FETCH_ASSOC); 
     return $row; 
    } 
} 
0

如果你想調用adm_getUsers(),你應該寫$ user = new admin()。你必須在admin類中創建_constuct()方法,它將調用parent :: _construct($ val)。

0

當你擴展一個類您實際上是在訪問父類的屬性和方法而不執行它們。所以如果你想從父類的某些方法訪問某些數據,你必須在父類中執行該特定的方法,然後訪問它。

對於前:

<?php 
class parent{ 

    public function adm_getUsers(){ 
     //your code to get users 
    } 
} 

class child extends class parent{ 
    public $adm_getUsers = array(); 

    public function getUsers(){ 
     if(!isset($this->adm_getUsers)){ 
      $this->adm_getUsers = $this->adm_getUsers(); 
     } 
     return $this->adm_getUsers; 
    } 
} 

$childObj = new child(); 
$users = $childObj->getUsers(); 
+0

如果我這樣做,將它分爲兩​​個不同的類別有什麼意義?我這樣做只是爲了在不同的文件中分割功能。所以管理員功能都在admin_functions.php中,用戶功能也是如此。 – Fr0z3n 2013-02-21 09:50:58

+0

您總是將兩個具有類似功能的類劃分開來,這就是圖片繼承的地方,這樣您就可以將核心功能保留在父類中,並且子類可以根據不同頁面中的不同需求來覆蓋它。不同功能的類應該保持不同。 – Sid 2013-02-21 09:56:09

+0

我只是爲了更好的組織而在不同的文件中聲明函數。使用你的方法,所有的函數都在主類上聲明,並且殺死它的分割點。你明白了嗎? – Fr0z3n 2013-02-21 09:59:44