2009-08-27 72 views
0

在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

一些澄清:你叫什么类功能

能更好地称为方法。方法是一个对象实例的函数。此外,类别可能有方法。这些被称为类方法静态方法。当你使用术语职能功能时,你就会混淆含义。

已解决,这两种方法没有更糟或更好。您可以使用两者,具体取决于上下文。参数的范围较小,从而导致耦合较少。 如果一切都相同,那么我会说参数比设置对象属性更好。

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

0

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

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

0

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

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

没有一种更好的方式适合所有人。

1

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

更好的原因是它不会使用副作用,副作用总是不好,因为它们对于类的用户是不可见的,但会改变类的行为。所以你应该尽量减少它们,或者让它们明显,因为它们在第一种情况下,当它们不是“真正的”侧面时。

但是在这种特殊情况下,Get_Existing_UserAdd_User应该是静态函数,即返回新的User对象,它有时被称为静态构造函数。之所以好得多是因为它清楚地说明了这些函数做了什么,它们获取了一些参数(现有用户的user_id或新用户的first_name,last_name和其他属性),并创建了表示用户的对象。所有的数据库操作都将被隐藏起来。对象本身应该具有名称和其他属性的属性,甚至可以使用Save()方法将更改推回。但主要想法是,您总是使用已构建的对象,已经具有上下文并且与现实世界中的某个东西(即数据库中的用户)相关联的对象,而不是一个空的外壳,随时随地将其填充。关于术语第一

0

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

  1. Coupling
  2. Cohesion

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