可能重复:
PHP OOP: Unique method per argument type?
PHP 5.3 method overloading (like in Java)
我有一些不同的类,如用户和组。我想创建一个通用类来添加类的属性。我的课有一些功能,如添加,删除,编辑等。 例如:
<?php
class Persistence{
function add(Users $userObj){
....
}
function add(Groups $groupObj){
....
}
}
?>
我该怎么做?
答案 0 :(得分:3)
虽然在PHP中允许类型提示,但基于参数类型的方法重载不是。因此,您需要为每个案例创建不同的方法,并使用它们。但是,您可以执行的操作是从add方法中删除类型提示,并使用if-else语句或对参数进行切换:
public function add ($collection) }
if($collection instanceof Users) {
return $this->addUsers($collection);
}
if($collection instanceof Groups) {
return $this->addGroups($collection);
}
...
throw new InvalidArgumentException("Unknown collection type");
}
public function addUsers(Users $users) {
}
public function addGroups(Groups $groups) {
}
答案 1 :(得分:1)
这样的方法重载是不可能的;你必须削弱声明中的谓词:
function add($obj)
{
if ($obj instanceof Users) {
} elseif ($obj instanceof Groups) {
} else {
throw new Exception("Invalid type for object");
}
}
答案 2 :(得分:1)
另一种解决方案是为您的Persistence
类创建一个界面:
interface PersistenceInterface { /* ... */ }
class Users implements PersistenceInterface { /* ... */ }
class Groups implements PersistenceInterface { /* ... */ }
class Persistence
{
public function add(PersistenceInterface $userObj)
{
// ...
}
}
这样,Persistence
类只允许使用界面标记的对象。
答案 3 :(得分:0)
在PHP中,重载仅适用于属性,而不是您可能习惯使用的其他语言。您可以重载__call
and __callStatic
,但使用继承更简单。
答案 4 :(得分:0)
PHP没有输入类型参数,因此您无法像在示例中那样执行此操作。您可以使用该类型传入第二个参数,并在函数中使用它:
function add($type, $object){
if ($type=="user"){
// process $object as a user
} elseif ($type=="group"){
// process $object as a group
}
}