我有一些不同的类,比如用户和组。我想创建一个通用类来添加类的属性。我的班级有一些功能,如添加、删除、编辑等,例如:
<?php
class Persistence{
function add(Users $userObj){
....
}
function add(Groups $groupObj){
....
}
}
?>
我怎样才能做到这一点?
我有一些不同的类,比如用户和组。我想创建一个通用类来添加类的属性。我的班级有一些功能,如添加、删除、编辑等,例如:
<?php
class Persistence{
function add(Users $userObj){
....
}
function add(Groups $groupObj){
....
}
}
?>
我怎样才能做到这一点?
虽然 PHP 中允许类型提示,但不允许基于参数类型的方法重载。因此,您需要为每个案例创建不同的方法并使用这些方法。但是,您可以做的是从 add-method 中删除类型提示,并改用 if-else 语句或参数上的 switch:
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) {
}
另一种解决方案是为您的Persistence
类创建一个接口:
interface PersistenceInterface { /* ... */ }
class Users implements PersistenceInterface { /* ... */ }
class Groups implements PersistenceInterface { /* ... */ }
class Persistence
{
public function add(PersistenceInterface $userObj)
{
// ...
}
}
这样,您的Persistence
类只允许使用该接口标记的对象。
像这样的方法重载是不可能的;你必须削弱声明中的谓词:
function add($obj)
{
if ($obj instanceof Users) {
} elseif ($obj instanceof Groups) {
} else {
throw new Exception("Invalid type for object");
}
}
在 PHP 中,重载仅适用于属性,而不是您可能习惯于其他语言的重载。您可以重载__call
and__callStatic
,但使用继承更简单。
PHP 没有类型化参数,因此您无法像示例中那样进行操作。但是,您可以传入带有类型的第二个参数并在函数中使用它:
function add($type, $object){
if ($type=="user"){
// process $object as a user
} elseif ($type=="group"){
// process $object as a group
}
}