2009-10-23 5 views
6

오랫동안 독서와 테스트를 위해, 그러나 나는 알고 싶습니다. 이것은 올바른 PHP OOP 코드입니다.이것은 OOP 또는 OOP와 유사합니다

Class User { 

    function Add($Name, $Password){ 
    $sql_str = "INSERT INTO User SET Name = '$Name', Password = '$Password'"; 
    $sql->do_sql($sql_str); 
    } 

    function Del($UserID) { 
    $sql_str = "DELETE FROM User WHERE UserID = '$UserID'"; 
    $sql->do_sql($sql_str); 
    } 

    function Show ($Limit) 
    if ($limit > 0){ 
     $sql_str = "SELECT * FROM User ORDER BY Name LIMIT $Limit"; 
    }else{ 
     $sql_str = "SELECT * FROM User ORDER BY Name"; 
    } 
    $result = $sql->do_sql($sql_str); 
    for ($i = 0; $i < COUNT($result); $i++){ 
     $data[$i]['UserID'] = .... 
     $data[$i]['Name'] = .... 
    } 
    return $Data 
    } 

} 
$MyUser = new User; 

이제 userControl.php 파일에서 조치를 제어 할 수 있습니다. 뭔가를하고 싶다면 액션을 사용자 클래스의 인스턴스에 보낼 수 있습니다 : $MyUser->Add($Name, $Password); 이 접근법은 OOP가 아닌 그룹화 된 함수와 비슷합니까? 아니면 setter 및 getter를 사용하는 것이 더 낫습니까?

이 예제가 OOP가 아니라면, 내가 뭘 잘못하고 어떻게 OOP 방식으로이 예제를 수행해야합니까?

TNX

+0

나는 그것이 아래로 투표 가치가 있다고 생각하지 않습니다. 그것은 잘 공식화 된 질문이며 약간의 코드를 보여줍니다. 나는 그것이 '아름답 지 않거나'정확하지는 않더라도 +1 가치가 있다고 생각합니다. – PatrikAkerstrand

+0

UserAccount 클래스를 호출하면 꽤 좋습니다. – DanMan

답변

0

기술적으로는,하지만 당신은 하나의 코드를 많이 놓치고 또는 방법이 작동하지 않습니다. 어디서나 $ sql을 정의하지 않는 것 같습니다. 중복 된 코드를 제거 할 때 oop의 아름다움이 빛을 발하며 모든 메소드에서 $ sql을 사용하면 어떻게 처리했는지 알게 될 것입니다. 완전하고, 일하고, 코드가 없으면 제안을하기가 어렵습니다.

다음은 간단한 의미입니다. 당신은 PHP5의 OOP 기능을 사용하지 않기 때문에 내가 PHP4 맡기 겠소 :

class User 
{ 
    var $sql; 
    function User() 
    { 
    $this->sql = new DatabaseConnection(); 
    } 

    function add($data) 
    { 
    $query = '...query here...'; 
    $this->sql->query($query); 
    } 
} 

당신이 고체, 엔터프라이즈 수준의 코드의 예를 확인하려면, 내가보기 엔의 일부보고하는 것이 좋습니다 것입니다 Zend Framework의 구성 요소.

6

당신은 올바른 방향으로 나아 가지 않을 것입니다. 당신이 정말로하고 싶은 것은이를 반영하는 방법으로 단일 사용자를 나타내는 클래스 사용자를 갖는 것입니다. 위키

: 객체 지향 프로그래밍

는 방법은 서브 루틴이다 배타적으로 연관된 하나 그것이 클래스 법 또는 정적 메소드 호출되는 경우에 클래스 (함께) 또는 (이 경우 인스턴스 메소드 임). 데이터베이스

그리고 정적 방법에 저장되는 데이터베이스

  • 에서

    • 로드 :

  • 사용자 객체는 최소한으로 가능 인스턴스 메소드가 필요합니다 을 - 사용자를 생성하고 사용자 객체를 반환합니다.

    PHP5에서는 __construct (args), PHP4에서는 User (args)와 같은 생성자 메서드가 있어야 사용자를 만들 때 호출 할 수 있습니다. 이것은 아마도 올바른 사용자를 적재 할 수 있도록 ID 또는 사용자 이름을 식별해야합니다.

    단순함을 위해 모든 것을 수행하지 않고 ID와 이름 만있는 사용자 개체를 상상해보십시오.여기에 클래스가 보일 수 있습니다 방법은 다음과 같습니다

    가정 PHP5 :

    class User{ 
        private $id; 
        public $name; 
    
        public function __construct($id){ 
         $this->load($id); 
        } 
    
        public function load($id){ 
         // Do a query to load a user and initialize $id and $name. 
        } 
    
        public function save(){ 
         // Do a query saving $this->id and $this->name to the database. 
        } 
    
        public static function create($name){ 
         // Do a query to create a user with name $name. 
        } 
    } 
    

    당신은 new User($id)를 사용하여 자신의 ID를 부여 사용자를로드하거나 만들 수는 비 유적으로 십자가에 못 박혀 위험이

    User::create($name)을 부여 하나, 나는 같으면 PHP에서는 setter와 getter를 사용하지 않아도됩니다.

    +1

    시작하기 전에 ..... _ PHP에서는 일반적으로 setter 및 getter에 신경을 쓰지 않습니까? 아니면이 특별한 예를 위해서입니까? :) – dbf

    2

    $MyUser->Add($Name, $Password); 이상하게 보입니다. 에 맞게 수

    class UserManager { 
        public function add(User $user) { 
         $sql->do_sql("INSERT INTO users (id, name) VALUES (".$user->getId().", ".$user->getName().")"); 
        } 
        public function delete(User $user) { 
         $sql->do_sql("DELETE FROM users WHERE id = ".$user->getId()." LIMIT 1"); 
        } 
        public function show(User $user) { 
         return $sql->do_sql("SELECT * FROM users WHERE id = ".$user->getId()); 
        } 
    } 
    

    class User { 
        private $_id; 
        private $_name; 
        public function getId(){ 
         return $this->_id; 
        } 
        public function getName(){ 
         return $this->_name; 
        } 
    } 
    

    디자인 패턴은 Active Record이다 : 이런 식으로 뭔가를 시도하십시오.

    +0

    나는 getter와 setter 방법이 냄새 나는 것이라고 생각하는 그 미친 사람들 중 하나입니다. 그러나 YMMV. 나는 심지어 나 자신을 때때로 사용하는 것을 인정해야한다. 그러나 최소한 나는 그것에 관해 나쁘다고 느끼고있다. ;) – DanMan

    0

    고맙습니다. 나는 OOP에 대한 몇 가지 사실이 내 마음이 옳지 않다는 것을 알고, 나는 흔들 필요가있다. 왜 내가하는 것처럼 일을하는지. 먼저 템플릿 엔진을 사용합니다. 사용자가 데이터를 게시 한 후이 데이터 게시 작업 파일. 이 작업이 필요합니다 .User.php :

    $op = ''; 
    IF (ISSET($_REQUEST['op'])){ 
        $op = ADDSLASHES($_REQUEST['op']); 
    } 
    
    if ($op == 'AddUser'){ 
    $Name = ADDSLASHES($_REQUEST['Name']) 
    $Password = ADDSLASHES($_REQUEST['Password']) 
    $MyUser->Add($Name, $Password) 
    } 
    

    그런 다음 작업을 클래스 사용자에게 보냅니다.

    사용자 클래스가 저 작은 조금 더 함수의

    class User{ 
    private $SQL; 
    
        public function __construct(){ 
         $this->SQL = SQL::getInstance(); 
        } 
    
        public Function AddUser ($Name, $Password) { 
        $sql_str ="INSERT INTO USER SET Name = '$Name', Password='$Password'"; 
        $this->SQL->do_sql($sql_str); 
        } 
    
        public Function DelUser($UserID){ 
         $sql_str = "DELETE FROM User WHERE UserID = '$UserID'"; 
         $sql->do_sql($sql_str); 
    
        } 
    
        public Function Login($Login, $Password){ 
         $sql_str = "SELECT * FROM User WHERE Login = '$Login' AND Password = '$Password' "; 
         LIST($sql_result, $sql_count) = $this->SQL->do_sql($sql_str); 
         if ($sql_count == 1){ 
          $_SESSION["UserID"] = $this->SQL->result_strip($sql_result, 0, "AdminUserID"); 
          $_SESSION["Login"] = $this->SQL->result_strip($sql_result, 0, "Login"); 
          $sql_str = "UPDATE User SET LastLogin = NOW()"; 
          $this->SQL->do_sql($sql_str); 
    
         } 
        } 
    
        public Function Logout(){ 
         $_SESSION = array(); 
         if (isset($_COOKIE[session_name()])) { 
          setcookie(session_name(), '', time()-42000, '/'); 
         } 
         session_destroy(); 
    
        } 
    } 
    
    관련 문제