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



假设我有两个类,分别称为UserProduct。这两者都需要保存在数据库中。

第三个名为PersistencyHandler的类处理所有数据库交互(以便同时遵守单一响应原则和依赖反转(。这是这个类的样子:

<?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((返回限定名称(。

最新更新