2015-10-16 72 views
-1

我有class User,它们对应于mySql数据库中的用户表。 基于通过调用函数传递给class public method initialize()的数据,类初始化可以通过三种不同的方式完成。初始化意味着将用户数据保存在局部变量数组中。班级如何获得这些用户数据取决于下面提到的条件。在PHP中重载以保持类的签名相同

1. Id被提供到初始化()类的方法,该方法从基于该ID的数据库中检索用户数据,并在一个 本地阵列将其保存。

2.用户名被提供给初始化()类的方法,该方法基于该用户名 数据库中检索用户数据,并在一个本地阵列将其保存。

3. UserData数组提供给initialize()类的方法,该方法将其简单地保存在本地数组中。

的要求是,调用函数并不需要知道如何类工作,因此对于该类所有上述三种方法必须具有相同的签名(?)

让我用伪代码进一步澄清它。

请理解它是一个理想跟踪准码我想出了的我找了 给定的约束内

class User { 

private $userData = array(); 

public function __construct(){ ... } 

public function initialize ($username) { 
    //connect to database and fetch user details based on username. 
    //and populate $this->userData. example : $this->userData['id'] = $this->row->id; 
} 

public function initialize ($id) { 
    //connect to database and fetch user details based on id. 
    //and populate $this->userData. example : $this->userData['id'] = $this->row->id; 
} 

public function initialize ($data) { 
    //connect to database and fetch user details. 
    //and save $data in $this->userData. example : $this->userData = $data; 
} 

} 
+0

来自[PHP手册](http://php.net/manual/en/language.oop5.overloading.php):'PHP中的重载提供了动态“创建”属性和方法的方法。这些动态实体通过魔术方法进行处理,可以在类中为各种动作类型建立。 PHP对“重载”的解释不同于大多数面向对象的语言。重载传统上提供了具有相同名称但参数的数量和类型不同的多种方法的能力。' – bansi

+0

在*语法级*上没有办法做到这一点。唯一的方法是检查'initialize'中传递的参数(例如'is_string')并做出适当的反应。 – Yoshi

+0

@Yoshi这正是我的想法,但它提出的问题是,id和用户名都可以是相同的类型,即字符串。 – StudentX

回答

0

您可以使用策略partern功能演示目的,并为此功能混合参数。我认为它是最好的方式。

Private initializeWithData,initializeWithId,initializeWithName。

+0

但是,如何区分同一类型的数据?例如,id和username都可以是相同的类型,即字符串。并且可能有更多的相同类型参数传递给函数。 – StudentX

+0

使用call_user_func_array传递其他参数。只有在第一次作为id找到时,才能区分字符串id与字符串。 –

3

我认为你做错了。

User类应具有单一职责。强制User类也负责与数据库进行交互似乎违反了简单的可靠规则。

+0

我会研究一下,但它不能解决我的问题。 – StudentX

+1

您通过编写奇怪的代码来创建问题,编写可靠的代码并且问题消失;) –

相关问题