Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是OOP或者类似于OOP_Php_Oop - Fatal编程技术网

Php 这是OOP或者类似于OOP

Php 这是OOP或者类似于OOP,php,oop,Php,Oop,长时间的阅读和测试,但我想知道。这是不是正确的PHP 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 U

长时间的阅读和测试,但我想知道。这是不是正确的PHP 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;
类用户{
函数添加($Name,$Password){
$sql_str=“插入到用户集名称='$Name',密码='$Password'”;
$sql->do\u sql($sql\u str);
}
函数Del($UserID){
$sql_str=“从用户中删除,其中UserID='$UserID';
$sql->do\u sql($sql\u str);
}
功能显示($Limit)
如果($limit>0){
$sql_str=“按名称从用户订单中选择*限制$LIMIT”;
}否则{
$sql_str=“按名称从用户订单中选择*”;
}
$result=$sql->do\u sql($sql\u str);
对于($i=0;$i
现在我可以从userControl.php文件控制操作。如果我想做些什么,我可以将操作发送到user类的实例:
$MyUser->Add($Name,$Password)
这种方法更像分组函数而不是OOP,还是使用setter和getter更好

如果这个例子不是OOP,那么我做错了什么,需要如何用OOP的方式来做这个例子


Tnx从技术上讲是这样的,但是您要么缺少很多代码,要么您的方法不起作用。您似乎没有在任何地方定义$sql。由于oop的美妙之处在于消除重复代码,并且您在所有方法中都使用$sql,因此很高兴看到您是如何处理的。如果没有完整、有效的代码,就很难提供建议

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

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

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

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

你这样做是不对的。您真正想要做的是拥有一个表示单个用户的类用户,其方法反映了这一点

来自维基百科:

在面向对象编程中,一种 方法是一个 专门与某个 类(在这种情况下称为 类方法或静态方法)或 使用对象(在这种情况下,它是 实例方法)

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

  • 从数据库加载
  • 保存到数据库
以及一种静态方法,用于: -创建一个用户并返回一个用户对象

它还应该有一个构造函数方法(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.
    }
}
您可以使用
newuser($id)
加载给定id的用户,或创建一个给定的
user::create($name)

冒着被比喻成十字架的风险,我不会在PHP中使用setter和getter看起来很奇怪。试着这样做:

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


可能适合的设计模式是。

Thanx!我知道一些关于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();

    }
}

我认为不值得投反对票。这是一个精心设计的问题,并显示了一些代码。我认为它值+1,即使它不“漂亮”或“正确”。我认为如果你调用类UserAccount,你就可以去了。我是那种认为getter和setter方法很臭的疯子之一,但是YMMV。我甚至不得不承认有时我自己也会使用它们,但至少我感觉很糟糕在我开始之前。。。。。一般来说,我不会在PHP中使用setter和getter?或者仅仅针对这个特定的例子?:)
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();

    }
}