0

可能重复:
PHP OOP:每个参数类型的唯一方法?
PHP 5.3 方法重载(如在 Java 中)

我有一些不同的类,比如用户和组。我想创建一个通用类来添加类的属性。我的班级有一些功能,如添加、删除、编辑等,例如:

<?php
class Persistence{
    function add(Users $userObj){
        ....
    }
    function add(Groups $groupObj){
        ....
    }
}
?>

我怎样才能做到这一点?

4

5 回答 5

5

虽然 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) {
}
于 2012-10-22T05:24:51.960 回答
2

另一种解决方案是为您的Persistence类创建一个接口:

interface PersistenceInterface { /* ... */ }

class Users implements PersistenceInterface { /* ... */ }
class Groups implements PersistenceInterface { /* ... */ }

class Persistence
{
    public function add(PersistenceInterface $userObj)
    {
        // ...
    }
}

这样,您的Persistence类只允许使用该接口标记的对象。

于 2012-10-22T05:24:41.380 回答
2

像这样的方法重载是不可能的;你必须削弱声明中的谓词:

function add($obj)
{
    if ($obj instanceof Users) {
    } elseif ($obj instanceof Groups) {
    } else {
        throw new Exception("Invalid type for object");
    }
}
于 2012-10-22T05:17:04.737 回答
0

在 PHP 中,重载仅适用于属性,而不是您可能习惯于其他语言的重载。您可以重载__calland__callStatic,但使用继承更简单。

于 2012-10-22T05:19:46.390 回答
0

PHP 没有类型化参数,因此您无法像示例中那样进行操作。但是,您可以传入带有类型的第二个参数并在函数中使用它:

function add($type, $object){
    if ($type=="user"){
       // process $object as a user
    } elseif ($type=="group"){
       // process $object as a group
    }
}
于 2012-10-22T05:20:05.830 回答