在OOP中,最好在类函数中使用类属性,或者只是将参数传递给它们。
class User{
private $user = array();
public function Get_Existing_User($user_id){
//SQL selects user info for existing user
$this->user = mysqli_fetch_assoc();
}
public function Set_User($user_data){
$this->user = (array) $user_data;
}
public function Add_User(){
//insert everything from $this->user into database
}
public function Get_User(){
return $this->user;
}
}
VS
class User{
public function Get_Existing_User($user_id){
//SQL selects user info for existing user
$user = mysqli_fetch_assoc();
return $user;
}
public function Add_User($user_data){
//insert everything from $user_data into database
}
}
什么是更好的方式?
答案 0 :(得分:1)
在您的解决方案之间,首先更好,但您必须更改功能的名称。只有在函数返回某些内容时才应使用'get'。
它更好的原因是它不使用副作用,副作用总是坏的,因为它们对类的用户是不可见的,但改变了类行为。所以你应该尽量减少它们,或者在第一种情况下使它们显而易见,当它们不是真的“支持”时。
但在这种特殊情况下,Get_Existing_User
和Add_User
应该是静态函数,返回新的User
对象,有时称为静态构造函数。更好的原因是它清楚地说明了这些函数的功能,它们将某些内容作为参数(现有用户的user_id或first_name,last_name和新用户的其他属性)获得,并创建一个表示用户的对象。所有数据库操作都将被隐藏起来。对象本身应该具有名称和其他属性的属性,甚至还有Save()方法来推送更改。但主要的想法是你总是使用构造对象,已经有上下文并且链接到现实世界中某些东西的对象(即数据库中的用户),而不是一个将在你去的时候填充的空壳。
答案 1 :(得分:0)
期望类属性描述被称为对象的类的实例的状态。因此,类的任何函数都可以使用这些属性来修改它的状态。另一方面,函数参数可能与对象的当前状态无关,但可用于修改其状态。
例如:可以期望用户对象具有用户名属性,密码属性和经过身份验证的属性。此用户对象还具有名为authenticate的函数,该函数采用描述身份验证方法的参数。该参数用于修改用户对象的状态,但不会作为其属性保存。
答案 2 :(得分:0)
这完全取决于您是否会重新使用数据以及您如何使用该类。
如果您创建了Class的许多单个实例,并且每个Object代表一个唯一的用户,那么将数据保存在成员变量中是有意义的。如果您将Class作为DAO(数据访问对象)使用了大量的一次性操作,那么持久保存数据可能没有多大意义。但即使在DAO中,根据其内部工作原理,如果单个调用中涉及许多函数(例如beforeQuery
和afterQuery
),将数据至少临时存储在成员变量中可能是有意义的。回调等等。
没有一个更好的方式适合它。
答案 3 :(得分:0)
首先澄清术语:
您所谓的类函数更适合称为方法。方法是对象实例上的函数。此外,类可能有方法。这些被称为类方法或静态方法。当您使用术语类函数时,您的意思就会混淆。
已经解决了,这两种方法并没有更糟或更好。您可以使用两者,具体取决于上下文。参数范围较小,因此耦合较少。 如果其他一切都相同,我会说参数比设置对象属性更好。
也就是说,通常还有其他因素可以决定选择哪个因素。您可以将对象视为相关变量的范围。如果变量属于该范围,则将其分配给属性是有意义的。
答案 4 :(得分:0)