2009-10-23 17 views
6

Para lecturas prolongadas y pruebas, pero quiero saber. Este es el código PHP OOP correcto, o noEsto es OOP o como 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; 

Y ahora desde el archivo userControl.php puedo controlar las acciones. Si quiero hacer algo, puedo enviar la acción a la instancia de la clase de usuario: $MyUser->Add($Name, $Password); ¿Este enfoque es más parecido a una función agrupada y no OOP o es mejor usar setters y getters?

Si este ejemplo no es OOP, entonces ¿qué hago mal y cómo debo hacer este ejemplo OOP?

TNX

+0

No creo que vale la pena una baja votación función. Es una pregunta bien formulada y muestra un poco de código. Creo que vale +1, a pesar de que no es 'hermoso' o 'correcto'. – PatrikAkerstrand

+0

Creo que si llamas a la cuenta de usuario de la clase, ya estás listo para empezar. – DanMan

Respuesta

0

Técnicamente es, pero usted está bien perder una gran cantidad de código o de sus métodos no funcionará. Parece que no define $ sql en ningún lado. Dado que la belleza de oop realmente brilla al eliminar el código duplicado, y usa $ sql en todos sus métodos, sería bueno ver cómo lidió con eso. Sin un código completo y funcional, es difícil ofrecer sugerencias.

Aquí hay un breve ejemplo de lo que quiero decir. Puesto que usted no está utilizando ningún características oop de PHP5 me quedo con PHP4:

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

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

Si quieres echa un vistazo a algunos ejemplos de código, a nivel de empresa sólida, Recomiendo encarecidamente que mirar a algunas de las componentes en Zend Framework.

6

No va por el camino correcto. Lo que realmente quiere hacer es tener un Usuario de clase que represente un solo usuario, con métodos que lo reflejen.

de Wikipedia:

En la programación orientada a objetos, un método es una subrutina que es asociado exclusivamente bien con una clase (en cuyo caso se denomina un método de clase o un método estático) o con un objeto (en cuyo caso es un método de instancia ).

Un objeto de usuario debe por lo menos tener métodos de instancia que le permite:

  • de carga de la base de datos
  • Guardar a la base de datos

y un método estático para: - Crear un usuario y devolver un objeto de usuario.

También debe tener un método constructor (__construct (args) en PHP5 o User (args) en PHP4) para llamar cuando se crea el usuario. Esto probablemente debería aceptar una identificación o un nombre de usuario o algo que lo identifique para que pueda cargar al usuario correcto.

En aras de la simplicidad y no solo de hacer todo por ti, imagina un objeto de usuario con solo una identificación y un nombre.Así es como la clase podría ser:

PHP5 Suponiendo:

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

Puede cargar un usuario dado su identificación usando new User($id), o crear uno da User::create($name)

en riesgo de ser crucificado en sentido figurado, me wouldn No te molestes con setters y getters en PHP.

+1

Antes de empezar ..... _No me molestaría con los setters y getters en PHP_ en general? ¿O solo por este ejemplo en particular? :) – dbf

2

$MyUser->Add($Name, $Password); se ve raro. Intentar algo como esto:

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

y

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

Un patrón de diseño que podría encajar es Active Record.

+0

Soy una de esas personas locas que piensan que los métodos getter y setter son malolientes, pero YMMV. Incluso tengo que admitir que los uso a veces, pero al menos me siento mal por eso. ;) – DanMan

0

Gracias! Sé que algo acerca de OOP no es correcto, pon mi mente, necesito temblar. Por qué hago cosas como yo. Primero uso el motor de plantillas. Después de los datos de publicación del usuario, este archivo de acción de datos posteriores. Hay algo así 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) 
} 

A continuación, envíe la acción al usuario de la clase.

clase de usuario tiene Litle poco más de

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(); 

    } 
}