如何过滤类中方法的所有返回值

时间:2016-12-01 22:29:38

标签: php oop

我继承了这个PHP项目。我有一个类,其中包含20种不同的方法,其中大多数返回值。我想过滤此类中方法返回的每个值。有没有一种简单而优雅的方法来执行此操作,或者必须在返回之前将每个值都包装在过滤器方法中?

该课程如下:

class db_ops
{

    // ...

    public function get_var($query) {
        // ...
        return $values;
    }

    public function get_name($query) {
        // ...
        return $name;
    }

    // ...

}

1 个答案:

答案 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');