我继承了这个PHP项目。我有一个类,其中包含20种不同的方法,其中大多数返回值。我想过滤此类中方法返回的每个值。有没有一种简单而优雅的方法来执行此操作,或者必须在返回之前将每个值都包装在过滤器方法中?
该课程如下:
class db_ops
{
// ...
public function get_var($query) {
// ...
return $values;
}
public function get_name($query) {
// ...
return $name;
}
// ...
}
答案 0 :(得分:0)
我之前使用过一种包装类来做类似的事情。这是一个通用的例子,只是为了说明它是如何工作的。如果你喜欢这个想法,你应该能够沿着这些思路实现自己的想法。
class FilteredExample
{
private $example;
function __construct($example)
{
$this->example = $example;
}
public function __call($name, $arguments)
{
if (method_exists($this->example, $name)) {
$result = call_user_func_array([$this->example, $name], $arguments);
if (is_string($result)) {
return "$result filtered";
} elseif (is_array($result)) {
return array_map(function($item){ return "$item filtered"; }, $result);
} else {
return $result;
}
} else {
throw new BadMethodCallException("Method '$name' not found", 1);
}
}
}
在构造函数中注入要过滤其方法的对象,然后使用__call()
魔术方法,以便可以调用所有原始对象的方法。使用method_exists
,您可以验证任何被调用的方法并抛出异常(如果它不存在),就像您在原始对象上调用它一样。如果确实存在,那么您可以使用call_user_func_array
调用它,过滤结果并返回。
我添加了一个小部分来表明你可以处理不同的结果类型,或者只是返回未修改的结果(如果它不是某种类型)。如果原始对象的所有方法返回相同的类型,显然不需要这样做。
以下是您可以根据问题中的示例类使用它的示例:
$dbOps = new db_ops;
$filteredDbOps = new FilteredExample($dbOps);
$result = $filteredDbOps->get_var('something');