在PHP中定义具有相同名称和不同参数类型的多功能

时间:2012-10-22 05:13:11

标签: php function arguments

  

可能重复:
  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){
        ....
    }
}
?>

我该怎么做?

5 个答案:

答案 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
    }
}