我遇到了两个我创建的对象的问题。一旦我打电话给我,我就很难打电话给对方。让我写两个对象的一些代码来表明我的意思。到目前为止我所做的很棒。
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
类。
答案 0 :(得分:3)
由于updateUser
类中定义了UserService
,因此将其作用于特定User
实例的最佳方法是将其作为参数传递。
例如,将声明更改为
public function updateUser(User $user) {
}
并像这样称呼它
$um->updateUser($user);
如果您不想这样做,您还可以更改User
类以保留对创建它的服务的引用。请注意,这可能是糟糕的设计,因为它紧密地耦合User
和UserService
,因此为方便起见,为了便利而进行了一些可维护性。
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)