PHP中的重载以保持类的签名不变

PHP中的重载以保持类的签名不变,php,class,oop,object,Php,Class,Oop,Object,我有类User,它对应于mySql数据库中的User表。 根据调用函数传递给类公共方法initialize()的数据,可以通过三种不同的方式完成类初始化。 初始化意味着将用户数据保存在局部变量数组中。类获取此用户数据的方式取决于下面提到的条件 1。Id提供给initialize()类方法,该方法基于此Id从数据库检索用户数据并将其保存在 本地数组 2。用户名提供给initialize()类方法,该方法基于此用户名从数据库检索用户数据 并将其保存在本地数组中 3.UserData数组被提供给ini

我有
类User
,它对应于mySql数据库中的User表。 根据调用函数传递给
类公共方法initialize()
的数据,可以通过三种不同的方式完成类初始化。 初始化意味着将用户数据保存在局部变量数组中。类获取此用户数据的方式取决于下面提到的条件

1。Id提供给initialize()类方法,该方法基于此Id从数据库检索用户数据并将其保存在 本地数组

2。用户名提供给initialize()类方法,该方法基于此用户名从数据库检索用户数据 并将其保存在本地数组中

3.UserData数组被提供给initialize()类方法,该方法只是将其保存在本地数组中

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

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

请理解,这是我为了演示我在 给定约束


此函数可以使用strategy partern和mixed param。我认为这是最好的办法


Private initializeWithData、initializeWithId、initializeWithName。

我认为你做错了


用户
类应承担单一责任。强制
用户
类也负责与数据库的交互似乎违反了简单而可靠的规则。

From:
在PHP中重载提供了动态“创建”属性和方法的方法。这些动态实体通过可以在类中为各种动作类型建立的神奇方法进行处理。PHP对“重载”的解释不同于大多数面向对象语言。重载传统上提供了让多个方法具有相同名称但参数数量和类型不同的功能。
在语法级别上无法做到这一点。唯一的方法是检查
initialize
(例如
is_string
)中传递的参数并做出适当的反应。@Yoshi这正是我所想的,但它带来的问题是,id和用户名可以是同一类型的,即string。如果是这种情况,您可以在检查string之前尝试使用。因此,首先检查
是否为数组
,然后检查
是否为数字
,然后默认情况下,将其作为一个
用户名
进行处理。如果一切都失败了,抛出一个。我会研究一下,但这并不能解决我的问题。你通过编写奇怪的代码、编写可靠的代码来制造问题,问题就消失了;)但如何区分相同类型的数据呢?例如,id和用户名可以是同一类型,即字符串。并且可能会有更多相同类型的参数传递给函数。请使用call\u user\u func\u数组传递其他参数。您不能将字符串id和字符串区分开来,只有当try find first作为id时才可以。
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;
}

}