首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是OOP或类似于OOP

这是OOP或类似于OOP
EN

Stack Overflow用户
提问于 2009-10-24 04:44:54
回答 4查看 916关注 0票数 5

长时间阅读和测试,但我想知道。这是不是正确的PHP OOP代码

代码语言:javascript
复制
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控制这些操作。如果我想做一些事情,我可以将操作发送到user类的实例:$MyUser->Add($Name, $Password);这种方法更像是分组函数而不是OOP,还是使用setter和getter更好?

如果这个例子不是面向对象的,那么我做错了什么,需要如何做这个例子的面向对象的方式?

Tnx

EN

回答 4

Stack Overflow用户

发布于 2009-10-24 05:03:12

你这样做是不对的。您真正想要做的是创建一个表示单个用户的user类,并使用反映这一点的方法。

来自维基百科:

在面向对象编程中,方法是唯一地与类(在这种情况下称为类方法或静态方法)或与对象(在这种情况下是实例方法)关联的子例程。

用户对象至少应该有实例方法,使其能够:

  • 从数据库中加载
  • 保存到数据库

和一个静态方法:-创建一个用户并返回一个用户对象。

它还应该有一个构造函数方法( PHP5中的__construct(Args)或PHP4中的User(args) ),以便在创建用户时调用。这可能需要接受id、用户名或其他标识,这样才能加载正确的用户。

为了简单起见,而不是只为您做所有事情,假设有一个只有id和名称的user对象。下面是这个类可能的样子:

假设PHP5:

代码语言:javascript
复制
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。

票数 6
EN

Stack Overflow用户

发布于 2009-10-24 05:16:05

$MyUser->Add($Name, $Password);看起来很奇怪。尝试如下所示:

代码语言:javascript
复制
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());
    }
}

代码语言:javascript
复制
class User {
    private $_id;
    private $_name;
    public function getId(){
        return $this->_id;
    }
    public function getName(){
        return $this->_name;
    }
}

一种可能适合的设计模式是Active Record

票数 2
EN

Stack Overflow用户

发布于 2009-10-24 04:49:37

从技术上讲是这样的,但是你要么遗漏了很多代码,要么你的方法不能工作。您似乎没有定义$sql anywhere。由于oop的美妙之处在于消除了重复代码,而且您在所有方法中都使用了$sql,因此很高兴看到您是如何处理这一问题的。如果没有完整的、有效的代码,就很难提供建议。

这里有一个简短的例子来说明我的意思。由于您没有使用PHP5的任何oop特性,因此我将继续使用PHP4:

代码语言:javascript
复制
class User
{
  var $sql;
  function User()
  {
    $this->sql = new DatabaseConnection();
  }

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

如果您想查看一些可靠的企业级代码示例,我强烈建议您查看Zend Framework中的一些组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1615784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档