Это ООП или как ООП - PullRequest
       18

Это ООП или как ООП

6 голосов
/ 24 октября 2009

Для долгого чтения и тестирования, но я хочу знать. Это правильный код ООП PHP или нет

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); Этот подход больше похож на сгруппированную функцию, а не на ООП, или лучше использовать сеттеры и геттеры?

Если этот пример не ООП, то что я делаю неправильно и как нужно сделать этот пример ООП способом?

Tnx

Ответы [ 4 ]

6 голосов
/ 24 октября 2009

Ты не поймешь это правильно. Что вы действительно хотите сделать, так это иметь класс User, представляющий одного пользователя, с методами, отражающими это.

Из википедии:

В объектно-ориентированном программировании Метод является подпрограммой, которая исключительно связаны либо с класс (в этом случае он называется метод класса или статический метод) или с объектом (в этом случае это метод экземпляра).

Пользовательский объект должен по крайней мере иметь методы экземпляра, позволяющие ему:

  • Загрузка из базы данных
  • Сохранить в базе данных

И статический метод для: - Создайте пользователя и верните объект пользователя.

У него также должен быть метод конструктора (__construct (args) в PHP5 или User (args) в PHP4), который будет вызываться при создании пользователя. Вероятно, это должно принять идентификатор, имя пользователя или что-то идентифицирующее, чтобы можно было загрузить нужного пользователя.

Ради простоты, а не просто для того, чтобы сделать все для вас, представьте пользовательский объект с только идентификатором и именем. Вот как может выглядеть класс:

Предполагая 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), или создать его по User::create($name)

Опасаясь быть образно распятым, я не стал бы беспокоиться о сеттерах и геттерах в PHP.

2 голосов
/ 24 октября 2009

$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 голосов
/ 24 октября 2009

Thanx! Я знаю кое-что о ООП, это не то место, где мой разум, мне нужно встряхнуть. Почему я делаю вещи, как я. Сначала я использую шаблонный движок. После того, как пользователь публикует данные, этот файл данных публикует действие. Есть что-то в этом 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)
}

Затем отправьте действие пользователю класса.

Пользовательский класс имеет немного больше функций

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

    }
}
0 голосов
/ 24 октября 2009

Технически это так, но вам либо не хватает большого количества кода, либо ваши методы не будут работать. Кажется, вы нигде не определяете $ sql. Поскольку красота oop действительно великолепна при устранении дублирующегося кода, и вы используете $ sql во всех своих методах, было бы неплохо увидеть, как вы справились с этим. Без полного, работающего кода трудно дать предложения.

Вот краткий пример того, что я имею в виду. Поскольку вы не используете никаких опций PHP5, я буду придерживаться PHP4:

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

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

Если вы хотите ознакомиться с некоторыми примерами надежного кода корпоративного уровня, я настоятельно рекомендую взглянуть на некоторые компоненты Zend Framework .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...