2013-02-21 3 views
3

클래스 확장 작업 ..PHP 클래스는</p> <p>.. 내가 문제가

내가 더 조직 한 서로 다른 파일에 기능을 분할하는 클래스를 확장하기 위해 노력하고있어 방법을 이해 연장하지만 난 문제가 메인 클래스의 변수와 함수를 자식 클래스에 접근.

내가이 뭐죠입니다

:

부모 클래스 : 그럼 내가 모든 것을 기록하지 않는 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(); $ 행 배열을 사용하면 비어 있습니다.

2 개의 클래스 사이에서 함수를 분할하기 전에, 나는 주 클래스에서 같은 함수를 사용하여 작업하고있었습니다.

나는 처음으로 클래스를 확장하려고합니다 .. 나는 Google에서 검색하고 여기에도 약간의 질문을 읽었지 만 여전히 PHP를 배우고 있기 때문에 이해하기에는 너무 복잡합니다.

+1

이 다른 파일에 기능을 분할 상속을 사용하지 마십시오! – Philipp

+1

' "사용자의 SELECT * WHERE username = '$ id' ''는 보안상의 위험이 있습니다. – jantimon

+0

@Ghommey'$ id'가 함수에 전달되기 전에 검사되고 이스케이프됩니다. 그것은 어쨌든 단지 테스트 함수입니다. – Fr0z3n

답변

7

이것은 상속이 실제로 가장 좋은 답변이 아닌 곳입니다. 대신 상속을 삭제하고 대신 컴포지션을 사용할 수 있습니다. 다음을 통해 Admin의 종속성으로 uFlex의 인스턴스를 전달합니다

$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 함수는 모두 admin_functions.php 안에 있으며, 사용자 함수에 대해서도 마찬가지입니다. – Fr0z3n

+0

비슷한 기능을 가진 두 개의 클래스를 항상 나눕니다. 상속이 그림에 오는 곳입니다. 따라서 핵심 기능을 상위 클래스에 유지하고 하위 클래스는 다른 페이지의 필요에 따라 재정의 할 수 있습니다. 기능이 다른 클래스는 다른 것으로 유지해야합니다. – Sid

+0

더 나은 조직을 위해 다른 파일에 함수를 선언하는 것입니다. 귀하의 방법을 사용하여, 모든 기능은 주요 클래스에 선언되며, 그것은 분할 지점을 죽일. 당신이 이해 한? – Fr0z3n

관련 문제