【问题标题】:define multi function with same name and different argument type in PHP [duplicate]在PHP中定义具有相同名称和不同参数类型的多功能[重复]
【发布时间】:2012-10-22 05:13:11
【问题描述】:

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

我该怎么做?

【问题讨论】:

    标签: php function arguments


    【解决方案1】:

    虽然 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) {
    }
    

    【讨论】:

    • 我认为这种方式是最好的方式
    • 我会通过将“addUsers”和“addGroups”设为私有并仅显示“add”以供使用来改进这一点。
    【解决方案2】:

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

    function add($obj)
    {
        if ($obj instanceof Users) {
        } elseif ($obj instanceof Groups) {
        } else {
            throw new Exception("Invalid type for object");
        }
    }
    

    【讨论】:

    • 非常感谢。这是最快的答案!
    【解决方案3】:

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

    interface PersistenceInterface { /* ... */ }
    
    class Users implements PersistenceInterface { /* ... */ }
    class Groups implements PersistenceInterface { /* ... */ }
    
    class Persistence
    {
        public function add(PersistenceInterface $userObj)
        {
            // ...
        }
    }
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        function add($type, $object){
            if ($type=="user"){
               // process $object as a user
            } elseif ($type=="group"){
               // process $object as a group
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 2020-10-23
          • 1970-01-01
          • 2020-10-18
          相关资源
          最近更新 更多