在 PHP 中实现相同的方法重载行为的最佳方法是什么?

What is the best way to achieve the same behaviour of method overloading in PHP?

假设我有两个 classes,分别叫做 UserProduct。 这两个都需要保存在数据库中。

第三个 class 称为 PersistencyHandler 处理所有数据库交互(为了遵守单一责任原则和依赖倒置)。 这是 class 的样子:

<?php
/**
 * Class PersistencyHandler
 * Handles database using PDO API
 */
class PersistencyHandler{

    /**
     * PDO connection used to save objects into.
     * @var $conn PDO
     */
    private $conn;

    /**
     * PDODatabaseSaver constructor.
     * @param $conn PDO
     */
    public function __construct($conn){
        $this->pdo = $conn;
    }

    /**
     * Saves the given object in the database
     * @param $object mixed
     */
    public function save($object){

        // as PHP does not support classic method overloading for different
        // types of objects, this is the cleanest solution I've been able to find.
        // And it's still pretty dirty...

        if($object instanceof Product) {
            $this->saveProduct($object);
        } else if($object instanceof User) {
            $this->saveUser($object);
        } else {
            throw new UnsupportedOperationException("Cannot save object, unsupported type."); // custom class
        }
    }


    private function saveProduct(Product $object){
        // save Product into database
    }

    private function saveUser(User $object){
        // save User into database
    }

}
?>

我有 Java 经验,我确信使用 instanceof 是一种 非常糟糕的做法 (至少在 Java 中) .例如,在Java中,我曾经使用重载方法来解决这样的问题。

我查看了 php.net 和其他网站(包括这个网站),但没有找到我的问题的合适答案:

以正确的方式实现上述代码的相同行为的更好方法是什么?

请注意,我有一个 单一方法 单一参数 并且被调用的方法由 类型决定 的参数。

一个解决方案是使用动态调用(类似于Java中的反射):

public function save($object)
{
    $mtd = 'save'.get_class($object);
    if(method_exists($this, $mtd))
        call_user_func(array($this, $mtd), $object);
    else
        throw new UnsupportedOperationException("Cannot save object, unsupported type.");
}

注意:如果您使用命名空间,则需要调整代码(get_class() returns 限定名称)。