先进的oop概念

时间:2011-01-06 06:59:33

标签: php oop

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

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

  1. 用户类(包含有关用户的信息)
  2. gib class(包括gib信息)
  3. 卡类(
    1. 每个用户拥有一张卡
    2. 每个用户拥有两张gib卡
    3. 一个用户可以将卡片给任何卡用户或gib卡给其他用户。
  4. 连接
    1. 特别是gib可以有很多用户卡或gib卡的连接。
  5. 用于进行数据库查询的db类。
  6. 这是我调用类方法的页面

    <?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概念来改进我的代码。 如果您发现此问题含糊不清,请提出改进​​建议。 谢谢

2 个答案:

答案 0 :(得分:2)

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

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

    DO

    $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

    是否引入第二个参数“controller”来执行此类操作

    $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。并使用{{3}}确保您遵循该约定。

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

答案 1 :(得分:0)

两件事。从ArrayObject派生User类(也可能是其他类),可能使用ArrayObject :: ARRAY_AS_PROPS。这样就可以按原样使用数据,可以保存手动属性填充。

class User extends ArrayObject {

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

这样您就可以访问$ this [“username”]和$ this-&gt;用户名等。可能会在其他地方受益。

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

赞成使用预准备语句,顺便说一下!