在 PHP 中实现相同的方法重载行为的最佳方法是什么?
What is the best way to achieve the same behaviour of method overloading in PHP?
假设我有两个 classes,分别叫做 User
和 Product
。
这两个都需要保存在数据库中。
第三个 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 限定名称)。
假设我有两个 classes,分别叫做 User
和 Product
。
这两个都需要保存在数据库中。
第三个 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 限定名称)。