PHP对象交互

PHP对象交互,php,object,Php,Object,我创建的两个对象有问题。一旦我打了一个电话,我就很难再打另一个了。让我从这两个对象中编写一些代码来显示我的意思。到目前为止,我所做的工作非常有效 class User { private $userdata = array(); public function __construct(){ } public function set($var, $value) { $this->userdata[$var] = $value; } public function

我创建的两个对象有问题。一旦我打了一个电话,我就很难再打另一个了。让我从这两个对象中编写一些代码来显示我的意思。到目前为止,我所做的工作非常有效

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 var是用户类的一部分,而不是在
userService
类中定义,

类中定义了
updateUser
类,因此我现在正在努力了解如何调用$User上的
updateUser()
,使其作用于特定
用户
实例的最佳方法是将其作为参数传入

例如,将声明更改为

public function updateUser(User $user) {

}
这样称呼它

$um->updateUser($user);

如果不想这样做,还可以更改
User
类以保留对创建它的服务的引用。请注意,这可能是一个糟糕的设计,因为它将
用户
用户服务
紧密地结合在一起,因此为了方便起见,需要牺牲一些可维护性

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)

中,我可以发现一些问题:首先,您使用的是传统的构造函数方法,请改用
\u construct()
getCurrentUser
的缩进有点问题-您能在原始代码中修复它吗?理想情况下,也能在问题中修复它吗?它使读者更容易阅读(属性和方法都应该是一个缩进级别)。最后,该方法被标记为getter,但不返回任何内容(即结尾没有
return
语句)。@halfer谢谢,我只是复制了一些错误的位。我不是在努力获取用户数据。由于$user在user类中,所以我很难对属于userService类的$user调用任何方法。我希望这更有意义。呃,您现在似乎已经接受了答案,但如果将来您能注意只提供格式良好的代码,我们就不会费劲去阅读了!有经验的程序员在看到不一致的缩进时确实会退缩,这会让他们推迟回答。我倾向于建议对
private
没有什么真正的需求,因为任何子类都可能需要访问
$service
。因此,在国际海事组织,它应该受到保护。尽管如此,+1当我们使用它时,为什么不通过
公共函数updateUser(User$User){
键入提示对象呢。