php
  • oop
  • 2009-10-23 4314 views 6 likes 
    6

    Để đọc và kiểm tra thời gian dài, nhưng tôi muốn biết. Đây là mã OOP PHP chính xác, hoặc không phải làĐây là OOP hoặc giống như 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; 
    

    Và bây giờ từ tệp userControl.php tôi có thể kiểm soát hành động. Nếu tôi muốn làm điều gì đó, tôi có thể gửi hành động đến cá thể của lớp người dùng: $MyUser->Add($Name, $Password); Cách tiếp cận này giống như một hàm được nhóm và không phải là OOP hay tốt hơn để sử dụng các bộ định cư và getters?

    Nếu ví dụ này không phải là OOP, thì điều tôi làm sai và cách thực hiện ví dụ OOP này?

    Tnx

    +0

    Tôi không nghĩ rằng nó có giá trị một xuống bỏ phiếu. Đó là một câu hỏi được xây dựng tốt và cho thấy một chút mã. Tôi nghĩ rằng nó có giá trị +1, mặc dù nó không phải là 'đẹp' hay 'chính xác'. – PatrikAkerstrand

    +0

    Tôi nghĩ nếu bạn gọi lớp UserAccount, bạn khá tốt để đi. – DanMan

    Trả lời

    0

    Về mặt kỹ thuật, nhưng bạn thiếu nhiều mã hoặc phương pháp của bạn sẽ không hoạt động. Bạn dường như không định nghĩa $ sql ở bất cứ đâu. Kể từ khi vẻ đẹp của oop thực sự tỏa sáng khi loại bỏ mã trùng lặp, và bạn sử dụng $ sql trong tất cả các phương pháp của bạn, nó sẽ được tốt đẹp để xem cách bạn xử lý với điều đó. Nếu không hoàn thành, làm việc, viết mã thì thật khó để đưa ra gợi ý.

    Đây là một ví dụ ngắn gọn về ý tôi. Kể từ khi bạn không sử dụng bất kỳ tính năng oop của PHP5 tôi sẽ gắn bó với PHP4:

    class User 
    { 
        var $sql; 
        function User() 
        { 
        $this->sql = new DatabaseConnection(); 
        } 
    
        function add($data) 
        { 
        $query = '...query here...'; 
        $this->sql->query($query); 
        } 
    } 
    

    Nếu bạn muốn kiểm tra một số ví dụ mã vững chắc, doanh nghiệp cấp, tôi rất muốn khuyên bạn nên xem xét một số các thành phần trong Zend Framework.

    6

    Bạn sẽ không thực hiện điều này đúng cách. Những gì bạn thực sự muốn làm là có một lớp người dùng đại diện cho một người dùng duy nhất, với các phương pháp phản ánh điều này.

    Từ wikipedia:

    Trong lập trình hướng đối tượng, một phương pháp là một chương trình con đó là độc quyền liên quan hoặc với một lớp (trong trường hợp này nó được gọi là một phương pháp lớp hoặc một phương pháp tĩnh) hoặc với một đối tượng (trong trường hợp đó là phương thức cá thể ).

    Một đối tượng người sử dụng nên ở rất ít nhất có phương pháp dụ cho phép chương trình:

    • tải từ cơ sở dữ liệu
    • Lưu cơ sở dữ liệu

    Và một phương pháp tĩnh để: - Tạo một người dùng và trả về một đối tượng người dùng.

    Nó cũng phải có phương thức khởi tạo (__construct (args) trong PHP5 hoặc Người dùng (args) trong PHP4) để được gọi khi người dùng được tạo. Điều này có lẽ nên chấp nhận một id hoặc một tên người dùng hoặc một cái gì đó xác định để nó có thể tải đúng người dùng.

    Vì mục đích đơn giản và không chỉ làm mọi thứ cho bạn, hãy tưởng tượng một đối tượng người dùng chỉ với id và tên.Đây là cách các lớp có thể trông:

    PHP5 Giả sử:

    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. 
        } 
    } 
    

    Bạn có thể tải một người dùng nào đó id của mình sử dụng new User($id), hoặc tạo ra một trao User::create($name)

    Tại nguy cơ bị theo nghĩa bóng đóng đinh, tôi wouldn 't bận tâm với setters và getters trong PHP.

    +1

    Trước khi tôi bắt đầu ..... _Tôi sẽ không bận tâm với những người định cư và getters trong PHP_ nói chung? Hay chỉ cho ví dụ cụ thể này? :) – dbf

    2

    $MyUser->Add($Name, $Password); có vẻ lạ. Hãy thử một cái gì đó như thế này:

    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; 
        } 
    } 
    

    Một mẫu thiết kế có thể phù hợp là Active Record.

    +0

    Tôi là một trong những người điên nghĩ rằng phương pháp getter và setter có mùi, nhưng YMMV. Tôi thậm chí phải thừa nhận tôi sử dụng chúng bản thân mình đôi khi, nhưng ít nhất tôi cảm thấy xấu về nó. ;) – DanMan

    0

    Thanx! Tôi biết một số điều về OOP là không đúng nơi tâm trí của tôi, tôi cần lắc. Tại sao tôi làm những việc như tôi. Đầu tiên tôi sử dụng công cụ tạo mẫu. Sau khi dữ liệu bài đăng của người dùng thì tệp tác vụ đăng dữ liệu này. Có một nơi nào đó this actionUser.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) 
    } 
    

    Sau đó gửi hành động cho người dùng lớp.

    tài Lớp có litle chút hơn chức năng của

    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(); 
    
        } 
    } 
    
    Các vấn đề liên quan