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){
键入提示对象呢。