参数与属性(类变量)?

时间:2009-08-27 03:35:56

标签: php oop

在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
  }
}

什么是更好的方式?

5 个答案:

答案 0 :(得分:1)

在您的解决方案之间,首先更好,但您必须更改功能的名称。只有在函数返回某些内容时才应使用'get'。

它更好的原因是它不使用副作用,副作用总是坏的,因为它们对类的用户是不可见的,但改变了类行为。所以你应该尽量减少它们,或者在第一种情况下使它们显而易见,当它们不是真的“支持”时。

但在这种特殊情况下,Get_Existing_UserAdd_User应该是静态函数,返回新的User对象,有时称为静态构造函数。更好的原因是它清楚地说明了这些函数的功能,它们将某些内容作为参数(现有用户的user_id或first_name,last_name和新用户的其他属性)获得,并创建一个表示用户的对象。所有数据库操作都将被隐藏起来。对象本身应该具有名称和其他属性的属性,甚至还有Save()方法来推送更改。但主要的想法是你总是使用构造对象,已经有上下文并且链接到现实世界中某些东西的对象(即数据库中的用户),而不是一个将在你去的时候填充的空壳。

答案 1 :(得分:0)

期望类属性描述被称为对象的类的实例的状态。因此,类的任何函数都可以使用这些属性来修改它的状态。另一方面,函数参数可能与对象的当前状态无关,但可用于修改其状态。

例如:可以期望用户对象具有用户名属性,密码属性和经过身份验证的属性。此用户对象还具有名为authenticate的函数,该函数采用描述身份验证方法的参数。该参数用于修改用户对象的状态,但不会作为其属性保存。

答案 2 :(得分:0)

这完全取决于您是否会重新使用数据以及您如何使用该类。

如果您创建了Class的许多单个实例,并且每个Object代表一个唯一的用户,那么将数据保存在成员变量中是有意义的。如果您将Class作为DAO(数据访问对象)使用了大量的一次性操作,那么持久保存数据可能没有多大意义。但即使在DAO中,根据其内部工作原理,如果单个调用中涉及许多函数(例如beforeQueryafterQuery),将数据至少临时存储在成员变量中可能是有意义的。回调等等。

没有一个更好的方式适合它。

答案 3 :(得分:0)

首先澄清术语:

您所谓的类函数更适合称为方法。方法是对象实例上的函数。此外,可能有方法。这些被称为类方法静态方法。当您使用术语类函数时,您的意思就会混淆。

已经解决了,这两种方法并没有更糟或更好。您可以使用两者,具体取决于上下文。参数范围较小,因此耦合较少。 如果其他一切都相同,我会说参数比设置对象属性更好。

也就是说,通常还有其他因素可以决定选择哪个因素。您可以将对象视为相关变量的范围。如果变量属于该范围,则将其分配给属性是有意义的。

答案 4 :(得分:0)

选择最适合您情况的方法非常重要。忽略那个不那么有用的建议我鼓励你好好看看面向对象设计中的一些重要原则

  1. Coupling
  2. Cohesion
  3. 对这些主题的深刻理解将帮助您评估您的情况和代码,以适应项目的目标。随着项目的增长,您可能会发现您需要使用具有可选参数的方法与对象进行交互以实现高内聚和松散耦合。然后你会像专家一样使用方法和参数。