这是面向对象编程或类似于面向对象编程。

5

我花了很长时间阅读和测试,但我想知道这段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); 这种方法更像是一种分组函数而不是面向对象编程,使用设置器和获取器是否更好?如果这个例子不是OOP,那么我做错了什么,怎样才能以OOP方式完成这个例子?谢谢。

我认为这个问题不值得被踩。它是一个很好的问题,并且展示了一点代码。我认为它值得一个+1,即使它不是“美丽”或“正确”的。 - PatrikAkerstrand
我认为如果你把类命名为UserAccount,那么就很不错了。 - DanMan
4个回答

6
你的做法不正确。你真正想做的是创建一个代表单个用户的User类,并使用反映这一点的方法。
来自维基百科:
在面向对象编程中,方法是一个子例程,它与类或对象关联,如果它与类相关,则称为类方法或静态方法,如果它与对象相关,则是实例方法。
用户对象应至少具有使其能够执行以下操作的实例方法:
从数据库加载 保存到数据库
还应该有一个静态方法:
- 创建一个用户并返回一个用户对象。
它还应该有一个构造函数方法(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。 点击此处 了解更多信息。

我是那些认为getter和setter方法有点臭的疯子之一,但你的看法可能不同。我甚至不得不承认有时候我自己也会使用它们,但至少我对此感到内疚。 ;) - DanMan

0
从技术上讲,是可以的,但你要么缺少很多代码,要么你的方法行不通。你似乎没有在任何地方定义 $sql。由于面向对象编程的优点在于消除重复代码,并且你在所有的方法中都使用了 $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中的一些组件。


-1
谢谢!我知道关于OOP的一些东西不是我所应该思考的,我需要调整。我需要理解为什么我做事情的方式是这样的。首先,我使用模板引擎。在用户提交数据之后,这些数据会被提交到操作文件中。在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();

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接