【问题标题】:Advanced oop concept [closed]高级 oop 概念
【发布时间】:2011-01-06 06:59:32
【问题描述】:

我正在为我的公司项目编写数据库 api。

我们在数据库 api 中有 4 个类。

  1. 用户类(包括有关用户的信息)
  2. gib 类(包括 gib 信息)
  3. 卡类(
    1. 每个用户拥有一张卡
    2. 每个用户拥有两张gib卡
    3. 一个用户可以将卡给其他用户任何卡用户或gib卡。
  4. 连接
    1. 用户卡或gib卡可以有很多连接,特别是gib。
  5. 用于进行数据库查询的数据库类。

我调用类方法的这个页面

<?php
 include_once "config.php";
 foreach($_REQUEST as $key=>$value){
     $$key=$value;
 }

if($pagelength=='')$pagelength=10;// default page length
//because by username can update the other users data 
if($username!='' && $command!='saveuser'){
    $user=User::getuserarray($username);
    $userid=$user['userid'];
}
if($isowner!=''){
    $user=User::getuserarray($isowner);
    $userid=$user['userid'];
}
$users = array (
    "userid"  => $userid,
    "username" => $username,
    "firstname"   => $firstname,
    "lastname"   => $lastname,
    "password"   => $password,
    "email"   => $email,
    "photo"   => '',
    "url"   => $url,
    "avatar_url"   => $avatar_url,
    "thumb"   => $thumb,
    "crop_url"   => $crop_url,
    "crop_position"   => $crop_position
);
$getcard=array(
    'cardid'=>$cardid,
    'card_type'=>$card_type,
    'status'=>$status,
    'userid'=>$userid,
    'userid_to'=>$userid_to,
    'message'=>$message,
    'name'=>$name,
    'pagelength'=>$pagelength,
    'pagenumber'=>$pagenumber,
    'fields'=>$fields
);
$getuser=array(
    'userid'=>$userid,
    'name'=>$name,
    'pagelength'=>$pagelength,
    'pagenumber'=>$pagenumber,
    'fields'=>$fields

);
$getgib=array(
    'gibid'=>$gibid,
    'userid'=>$userid,
    'isowner'=>$isowner,
    'description'=>$description,
    'tagline'=>$tagline,
    'name'=>$name,
    'pagelength'=>$pagelength,
    'pagenumber'=>$pagenumber,
    'fields'=>$fields
);
$getlink=array(
    'gibid'=>$gibid,
    'view'=>$view,
    'userid'=>$userid,
    'cardid'=>$cardid,
    'name'=>$name,
    'pagelength'=>$pagelength,
    'pagenumber'=>$pagenumber,
    'fields'=>$fields
);
switch($command){
    case 'login':
        $user=new User(array());
        $msg=$user->login($username,$password);
        break;
    case 'logout':
        $user=new User(array('userid'=>$userid));
        $user->logout($id_session);
        break;
    //~ case 'isowner':
        //~ $gib=new Gib(array('gibid'=>$gibid));
        //~ $user=new User(array('userid'=>$userid));
        //~ if($user->validateUserid()!=true) return $msg;
        //~ if($gib->validateGibid()!=true) return $msg;
        //~ $msg=$gib->isowner($userid,$gibid);
        //~ break;
    case 'saveuser':
        $user=new User($users);
        if($userid==''){
            //checking if blank fields
            $msg=$user->validate();
            if($msg!='ok')break;
            $msg=$user->adduser();
        }else{
            $msg=$user->updateuser();
        }
        break;
    //~ case 'updateuser':
        //~ $user=new User($users);
        //~ $user->updateuser();
        //~ break;
    case 'changepassword':
        $user=new User($users);
        $msg=$user->changepassword($old_pswd,$new_pswd,$confirm_pswd);
        break;
    case 'changeimage':
        $user=new User($users);
        $user->changeimage($thumb,$url,$avatar_url,$crop_position,$crop_url);
        break;

    case 'getuser':
        $user=new User(array('userid'=>$userid));
        $msg=$user->getuser($getuser);
        break;
    /*----------link command -----------*/
    case 'getlink':
        $connection=new Connection(array());

        $connections=$connection->getlink($getlink);
        $connections=array('links'=>$connections);
        echo $msg=json_encode($connections);
        break;  
    case 'createlink':
        $user=new User($users);
        $msg=$user->validateUserid();
        if($msg!='ok') break;
        $connection=new Connection(array());
        $msg=$connection->createlink($getlink);
        break;
    case 'updatelink':
        $connection=new Connection(array('linkid'=>$linkid));
        $msg=$connection->validate();
        if($msg!='ok')break;
        $connection->updatelinkposition($positionx,$positiony);
        break;  
    case 'deletelink':
        $connection=new Connection(array('linkid'=>$linkid));
        $msg=$connection->validate();
        if($msg!='ok')break;
        $connection->deletelink();
        break;
    //~ case 'cardsend_validate':
        //~ $card=new Card(array('cardid'=>$cardid));
        //~ $msg=$card->cardSendValidate($userid_to);
        //~ break;
    case 'getcard':
        $card=new Card(array('cardid'=>$cardid));
         $cards=$card->getcardlist($getcard);
        if($cardid=='')
            echo $msg=$cards;
        else
            echo $msg=json_encode($cards);
        break;
    case 'givecard':
        $card=new Card(array('cardid'=>$cardid));
        $msg=$card->validate();
        if($msg!='ok')break;
        $user=new User(array('userid'=>$userid_to));
        $msg=$user->validateUserid();
        if($msg!='ok') break;
        $msg=$card->givecard($getcard);
        break;
    case 'cardar'://accept reject
        $card=new Card(array('cardid'=>$cardid));
        $msg=$card->validate();
        if($msg!='ok')break;
        $msg=$card->acceptReject($getcard);
        break;
    case 'deletecard':
        $card=new Card(array('cardid'=>$cardid));
        $msg=$card->validate();
        if($msg!='ok')break;
        $msg=$card->delete_card();
        break;
    case 'getgib':
        $gib=new Gib(array('gibid'=>$gibid));
        $gibs=array('success'=>true,'gibs'=>$gib->getgibs($getgib));
        echo $msg=json_encode($gibs);
        break;
    case 'savegib':
        $gib=new Gib(array('gibid'=>$gibid));
        $user=new User($users);
        $msg=$user->validateUserid();
        if($msg!='ok') break;
        if($gibid==''){
            $gibA=$gib->creategib($name,$type,$userid,$description,$tagline,$gib_background);
            $gibid=$gibA['gibid'];
            $gib->gibid=$gibid;
            $msg= 'gib created Successfully';
        }else{
            $gib->updategib($name,$description,$tagline,$gib_background);
            $msg= 'update Form submission complete';
        }
        $arrayjson1=array(
            'success' => true,
            'message'=>$msg
        );
        $gibA=$gib->getDetail();
        echo $msg= formjson(array(),$gibA,$arrayjson1); 
        break;


    default:
        break;
}

?>

<script language="javascript">
window.location.href="enterspace.php?msg=<?php echo urlencode($msg); ?>";
</script>

这里我只向你展示建议的用户类

<?php
Class User{

    var $userid;
    var $username;
    var $firstname;
    var $password;
    var $email;
    var $photo;
    var $avatar;
    var $thumbnail;
    var $crop_url;
    var $crop_position;



    function User($users){
        $this->userid=$users['userid'];
        $this->username= $users['username'];
        $this->firstname=$users['firstname'];
        $this->lastname=$users['lastname'];
        $this->password= $users['password'];
        $this->email=$users['email'];
        $this->photo= $users['photo'];
        $this->avatar= $users['avatar'];
        $this->thumbnail= $users['thumbnail'];
        $this->crop_url= $users['crop_url'];
        $this->crop_position= $users['crop_position'];

    }
    function validateUserid(){
        if($this->userid==''){
            $msg=geterrormsg(1);
            $arrayjson1=array(
                        'success' => false,
                        'message'=>$msg,
                        'error_code'=>'1');
            echo $msg= formjson(array(),array(),$arrayjson1);
            return $msg;

        }
        $sql="select count(*) from users where userid=?";
        $count=Db::getValue($sql,$this->userid);
        //User not exist
        if($count<=0){
            $msg=geterrormsg(1);
            $arrayjson1=array(
                        'success' => false,
                        'message'=>$msg,
                        'error_code'=>'1');
            echo $msg= formjson(array(),array(),$arrayjson1);
            return $msg;
        }
        return 'ok';

    }   

    function validate(){
        //checking if blank fields
        if($this->firstname=='' or $this->lastname=='' or $this->password=='' or $this->email=='' or $this->username==''){
            $msg=geterrormsg(6);
            $arrayjson1=array(
                        'success' => false,
                        'message'=>$msg,
                        'error_code'=>'6'
                    );
            echo $msg= formjson(array(),array(),$arrayjson1);   
            return false;
        }
        if($this->userid==''){
            $totalUsers = Db::getValue('SELECT COUNT(username) FROM users where username = ?',$this->username);
            if($totalUsers>0){
                //username already exist
                $msg=geterrormsg(5);
                $arrayjson1=array(
                        'success' => false,
                        'message'=>$msg,
                        'error_code'=>'6'
                    );
                echo $msg= formjson(array(),array(),$arrayjson1);
                return $msg;
            }
            $totalUsers = Db::getValue('SELECT COUNT(email) FROM users where email = ?',$this->email);
            if($totalUsers>0){
                $msg=geterrormsg(4);
                    //email already exist
                $arrayjson1=array(
                        'success' => false,
                        'message'=>$msg,
                        'error_code'=>'4'
                    );
                echo $msg= formjson(array(),array(),$arrayjson1);   
                return $msg;
            }
        }
        return 'ok';
    }
    function login($loginUsername,$loginpassword){
        //query for checking user username  exist or not 
        $sql="select count(*) from users where username=?";
        $count=Db::getValue($sql,$loginUsername);
        if($count<=0){
            $msg=geterrormsg(1);
            $arrayjson1=array(
                        'success' => false,
                        'message'=>$msg,
                        'error_code'=>'1'
                    );
            echo $msg= formjson(array(),array(),$arrayjson1);   
            return $msg;
        }
        $sql="select AES_DECRYPT(password,'text') as password,userid from users where username=?";
        $row=Db::getRow($sql,$loginUsername);
        if(is_array($row))  extract($row);
        $this->userid=$userid;
        //for checking password
        if($loginpassword != $password){
            $msg=geterrormsg(2);
            $arrayjson1=array(
                        'success' => false,
                        'message'=>$msg,
                        'error_code'=>'2'
                    );
            echo $msg= formjson(array(),array(),$arrayjson1);   
            return $msg;
        }

        //query for checking user exist  in session table with status =1

        //~ $ses_id = session_id(); 
        //~ $_SESSION['username']=$loginUsername;
        //~ $_SESSION['userid']=$userid;
        //~ $sql="DELETE FROM sessions WHERE userid=? or id_session=?";
        //~ Db::execute($sql,array($userid,$ses_id));
            //~ $sql="INSERT INTO sessions  (id_session,    userid,     START, 
        //~ END,    STATUS,     last_update )   VALUES  (?, ?,current_timestamp,    'end',  '1',    current_timestamp   );";
        //~ Db::execute($sql,array($ses_id,$userid));       

        $gibid=$this->getDefaultGibId();        
        //making user array
        $row=$this->getDetail();
        unset($row['updatedon'],$row['createdon']);

        $gib=new Gib(array('gibid'=>$gibid));
        //~ $gibs=$gib->getgibs($userid,'',5);
        $systemgibid=$gib->systemgibid();
        $arrayjson1=array(
                    'success' => true,
                    'message'=>'User logged in successfully',
                    'gibid'=>$gibid,
                    'systemgibid'=>$systemgibid
                );
        echo $msg= formjson(array(),$row,$arrayjson1);  
        return $msg;    

    }
    function getDefaultGibId(){
        $sql="SELECT referid FROM cards WHERE userid_from=? AND userid_to=?  and card_type='A' " ;
        $gibid=Db::getValue($sql,array($this->userid,$this->userid));
        return $gibid;
    }

    //making user array
    function getDetail(){
        $sql="select  * from users where userid=?";
        $row=Db::getRow($sql,$this->userid);
        unset($row['password']);
        return $row;
    }
    // for creating new user 
    // will have one user entry , one profile card entry in card table , one system gib 
    function adduser(){
         $sql = "INSERT INTO users  (username, firstname,   lastname, PASSWORD,email,createdon  )
            VALUES  (?, ?, ?, AES_ENCRYPT(?,'text'),?,current_timestamp);";
        Db::execute($sql,array($this->username,     $this->firstname, $this->lastname,$this->password,$this->email));
        $this->userid=Db::getLastInsertId();
        //make profile card in cards table...
        $sql="INSERT INTO cards( userid_from, userid_to,card_type, referid,status,createdon)VALUES(?, ?, ?, ?, ?,current_timestamp)";   
        Db::execute($sql,array($this->userid,$this->userid,'V',$this->userid,'A'));

        $id_card=Db::getLastInsertId();
        $gib=new Gib(array());
        $systemgibid=$gib->systemgibid();
        //make system gib card in cards table...
        $sql="INSERT INTO cards(userid_from,    userid_to,  referid, 
            card_type   ,status,createdon)VALUES(?,  ?, ?,?,?,current_timestamp )"  ;   
        Db::execute($sql,array($this->userid,$this->userid,$systemgibid,'A','A'));  
        $this->firstname=$this->firstname."'s Gib";
        //create gibs define in connection.php type D for default gib
        $gib->creategib($this->firstname,'D',$this->userid,'','');
        $arrayjson=array();
        $row=$this->getDetail();

        $arrayjson1=array(
            'success' => true,
            'message'=>'Registered in successfully',
            'username'=>$this->username
        );
        echo $msg= formjson($arrayjson,$row,$arrayjson1);   
        return $msg;
    }
    function updateuser(){
        $sql="UPDATE users SET firstname = ?,   lastname = ?, email=?   WHERE userid = ? ";
        Db::execute($sql,array($this->firstname,$this->lastname,$this->email,$this->userid));
        $user=$this->getDetail();
        $arrayjson1=array(
            'success' => true,
            'message'=>'form submission complete'
        );
        echo $msg= formjson(array(),$user,$arrayjson1); 
        return $msg;
    }
    function changepassword($old_pswd,$new_pswd,$confirm_pswd){

        $sql="select count(*) from users where password=AES_ENCRYPT(?,'text') and userid=? ";
        $count=Db::getValue($sql,array($old_pswd,$this->userid));
        if($count<=0){
            $msg=geterrormsg(28);
            //old passwod not matched
            $arrayjson1=array(
                'success' => false,
                'message'=>$msg,
                'error_code'=>'28'
            );
            echo $msg= formjson(array(),array(),$arrayjson1);   
            return $msg;
        }
        //checking  confirm and new password 
        if($new_pswd!=$confirm_pswd){
            $msg=geterrormsg(29);
            $arrayjson1=array(
                'success' => false,
                'message'=>$msg,
                'error_code'=>'29'
            );
            echo $msg= formjson(array(),array(),$arrayjson1);   
            return $msg;
        }
        $sql="UPDATE users  SET PASSWORD = AES_ENCRYPT(?,'text')
            WHERE userid = ? ; ";
        Db::Execute($sql,array($new_pswd,$this->userid));
        $arrayjson1=array(
            'success' => true,
            'message'=>'password changed successfully .',
            'userid'=>$this->userid
        );
        echo $msg= formjson(array(),array(),$arrayjson1);   
        return $msg;
    }
    function changeimage(){

        $sql="UPDATE users SET  thumbnail=? ,url=?, avatar=?,crop_position=?,   crop_url=?  WHERE userid = ? ";
        Db::Execute($sql,array($this->thumbnail,$this->url,$this->avatar,$this->crop_position,$this->crop_url,$this->userid));
        $user=$this->getDetail();
        $arrayjson1=array(
            'success' => true,
            'message'=>'form submission complete'
        );
        echo $msg= formjson(array(),$user,$arrayjson1);     
    }
    function logout($id_session){
        //~ $sql="delete from sessions where userid=? and id_session=?";
        //~ Db::Execute($sql,array($this->userid,$id_session));

        //~ $sql="delete from occupants where userid=?";
        //~ Db::Execute($sql,$this->userid);

        //~ unset($_SESSION['username']);
        //~ session_destroy(); // start up your PHP session! 


        //~ echo $msg= "{'success': 'true','message':'logout successfully','userid':'$userid'}";
        return $msg;
    }
    function getuser($getuser){
        $userid=$getuser['userid'];
        $name=$getuser['name'];
        $pagelength=$getuser['pagelength'];
        $pagenumber=$getuser['pagenumber'];
        $fields=$getuser['fields'];


        $condition = '';
        $query=array();

        if($userid !='') {
            $condition .= " and userid=? ";
            array_push($query,$userid);
        }
        if($name!=''){
            $condition .= " and concat_ws('  ',firstname,lastname)  like ?";
            array_push($query,"%".$name."%");
        }

        if($pagelength!=''){
            $limitpagelength="limit $pagelength";
        }

        if($pagenumber!=''){
            $pagenumber=$pagelength*($pagenumber-1);
            $pagenumber="offset $pagenumber";
        }
        if($fields=='*'){
            $fields=",users.*";
        }elseif($fields!=''){
            $fields=",".$fields;
        }


        $sql="select  userid,concat_ws(' ',firstname,lastname) as name $fields 
            from users where 1=1   $condition order by updatedon $limitpagelength $pagenumber";
        $row=Db::getResult($sql,$query);

        $user=array();
        for($i=0;$i<count($row);$i++){
            unset($row[$i]['password']);
            extract($row[$i]);
            $this->userid=$userid;
            $row[$i]['gibid']=$this->getDefaultGibId();
            array_push($user,$row[$i]);
        }


        $arrayjson1=array(
            'success' => true,
            'message'=>'User data successfully',
            'users'=>$user
        );
        echo $msg= formjson(array(),array(),$arrayjson1);   
        return $msg;
    }
    //making user array
    function getuserarray($username){
        $sql="select  * from users where username=?";
        $row=Db::getRow($sql,$username);
        unset($row['password']);
        return $row;
    }


}


?>

请建议我如何通过实现高级和所有 oops 概念来改进我的代码。 如果您觉得这个问题含糊不清,请提出改进​​建议。 谢谢

【问题讨论】:

  • 这个问题含糊不清,几乎没有什么可以改进的(问题)。

标签: php oop


【解决方案1】:

这个

 foreach($_REQUEST as $key=>$value){
     $$key=$value;
 }

可以缩短为

extract($_REQUEST);

但是,这样做是不安全的,原因有两个:

  1. Using $_REQUEST is insecure unless you know the order in which data was merged into it
  2. Extracting variables might potentially overwrite existing important variables.

由于您已经在进行 OOP,我建议在您的应用程序中引入一个 Request 对象并通过它的 API 访问任何请求参数。无需将 Request 数据提取到数组子集中,只需将整个 Request 对象传递给需要它的任何函数或方法,例如而不是

$connections = $connection->getlink($getlink);

$connections = $connection->getlink($request);

除此之外,@mario 对replacing that switch/case block 也有好处。基本上,您显示的代码是FrontController,它根据收到的输入确定下一步要做什么。所以你可以把所有这些命令字符串变成classes of their own,例如

class LoginCommand
class SaveUserCommand
…

然后只实例化命令和run an interface method,例如所有这些命令都必须在实例上实现的方法。然后你可以用

替换你的开关/外壳
$request         = new Request($_GET, $_POST);
$commandClass    = $request->getCommand() . 'Command';
$commandInstance = new $commandClass($request);
$commandInstance->execute();

由于您有多个命令处理相同的对象,例如“getLink”和“createLink”都适用于Connection,您可能还需要考虑将这些相关命令组合到PageController 中。

你是否引入第二个参数“控制器”来做这样的事情

$controllerClass = $request->getController();
$controller      = new $controllerClass($request);

call_user_func(array($controller, $request->getCommand()));

或使用路由器将命令映射到控制器中的适当方法

$router          = new Router('routes.ini');
$controllerClass = $router->mapCommandToControllerClass($request);
$controller      = new $controllerClass($request);

call_user_func(array($controller, $request->getCommand()));

由你决定。

如果你这样做,你已经非常接近MVC(忽略关于它是 MVP 还是 HMVC 的小问题,因为它在网络上)。无论如何,所有这些中最重要的因素是将业务逻辑与表示层分离。

我不会评论你的类,除了我不相信 ActiveRecord 并且认为你应该 separate the code 认为 queries the database 来自对封装在这些类中的数据进行业务操作的代码。

最后一点,我发现缺少空格的代码很难阅读。考虑关注Code Convention like PEAR。并使用PHP_CodeSniffer 确保您遵守该约定。

免责声明:以上均不被视为生产代码。这些只是让您了解如何改进应用程序架构的示例。

【讨论】:

  • 非常感谢您提供出色的答案。想要做您在答案中建议的所有事情。 :)
【解决方案2】:

两件事。从 ArrayObject 派生 User 类(可能还有其他类),可能使用 ArrayObject::ARRAY_AS_PROPS。这样你就可以直接使用数据,可以省去手动填写属性。

class User extends ArrayObject {

    function User($users) {   // __construct
        parent::__construct($users, 2);

这样你就可以访问 $this["username"] 和 $this->username 了。可能有利于其他地方的处理。

对于第一个脚本,尝试将冗长的开关替换为类和方法。您可以使用call_user_func(array("modules", $command)) 来调用它们。

赞成使用准备好的语句,顺便说一句!

【讨论】:

  • 扩展 ArrayObject 的建议对我来说听起来是 YAGNI,它也会让 User 类暴露整个 ArrayObject API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多