PHP对象交互

时间:2013-10-27 16:22:57

标签: php object

我遇到了两个我创建的对象的问题。一旦我打电话给我,我就很难打电话给对方。让我写两个对象的一些代码来表明我的意思。到目前为止我所做的很棒。

class User {
private $userdata = array();

public function __construct(){      
}

public function set($var, $value) {
    $this->userdata[$var] = $value; 
}

public function get($var) {
      if(isset($this->userdata[$var])){
         return $this->userdata[$var];
      }
    return NULL;
    }
}

然后我有我的用户服务类:

class UserService {
private $db;
private $error;
private $fields = array();


    public function __construct() {
        $this->db = new Database();

    }

            public function updateUser(){
                  //some update query
            }




            public function getCurrentUser($fields) {   

    $query = sprintf("SELECT ".$this->fields." FROM User WHERE IDUser=%s", 
$this->db->GetSQLValueString($_SESSION['MM_Username'], "int"));
        $result = $this->db->query($query);

        if($result && $this->db->num_rows($result) > 0) {

            //create new user class
            $user = new User();
            $row = $this->db->fetch_assoc($result);

            //set rows as object
            foreach($row as $key => $value){
                $user->set($key, $value);   

                             return $user;
            }
                     }
             }

}

在我呼叫用户的页面上,我运行此代码:

$um = new UserService();
$userfields = "*";  
$user = $um->getCurrentUser($userfields);

所以我现在通过调用getCurrentUser()来实例化我的User()类我很难看到我现在如何调用$ user上的updateUser(),因为$ user var是User类的一部分而不是userService类。

1 个答案:

答案 0 :(得分:3)

由于updateUser类中定义了UserService,因此将其作用于特定User实例的最佳方法是将其作为参数传递。

例如,将声明更改为

public function updateUser(User $user) {

}

并像这样称呼它

$um->updateUser($user);

如果您不想这样做,您还可以更改User类以保留对创建它的服务的引用。请注意,这可能是糟糕的设计,因为它紧密地耦合UserUserService,因此为方便起见,为了便利而进行了一些可维护性。

class User {
    protected $service;
    public function __construct($service) {
        $this->service = $service;
    }
    public function update() {
        return $this->service->updateUser($this);
    }
    // ... other code you already had ...
}

...然后在getCurrentUser功能更改new User()改为new User($this)