代码之家  ›  专栏  ›  技术社区  ›  Daniel Vandersluis

在产品代码中使用反射是不是不好?

  •  4
  • Daniel Vandersluis  · 技术社区  · 14 年前

    我有一个 Validator 类创建 Validations 类,它包含所有验证方法。当进行验证时, __call 在里面 用于发送呼叫 Validator->validate_ method Validations-> method

    例如,有一个方法 验证 打电话 length_of

    $v = new Validator();
    $v->validate_length_of(...);
    

    这个 中的验证 类被执行。

    为了确保 __呼叫 Validation 方法,我用 ReflectionMethod 要检查指定的方法:

    $method = new ReflectionMethod($this->validations, $validation_method);
    if (!$method->isPublic())
    {
      // error
    }
    

    我很确定这是确定方法是否公开的唯一方法,但我不确定反射是否适合在生产代码中使用。这是密码气味吗?

    3 回复  |  直到 9 年前
        1
  •  6
  •   NikiC    14 年前

    您真的不应该在生产代码中使用反射。你为什么不用 is_callable 在这里?

    if (!is_callable(array('Validations', $validation_method)) {
        throw new LogicException('method does not exist');
    }
    

    Validations 类具有静态方法 $validation_method 并确保您可以从当前上下文调用它。实际上,这给了你比思考更大的灵活性,因为这需要 __call

        2
  •  1
  •   Community CDub    8 年前

    如果在代码中需要反射API的强大功能,那么就使用它。但是反射可能很慢,基准在使用时永远不会受到损害。最后,只有您才能决定它是否对您的应用程序有太大的影响。我们只是在谈论微秒。

    example Validation class .

    如果你想用 __call 有了它(魔法方法太慢了,顺便说一句),你可以使用 class_implements

    public function __call($method, $args)
    {
        if ( class_exists( $method )) {
            $validator = new $method;
            if($validator instanceof IValidate) {
                return call_user_func(array($validator, 'validate'), $args);
            }
            throw new BadMethodCallException('Class exists but is not a Validator');
        }
        throw new RuntimeException('Method does not exist');
    }
    

    旁注: the Zend Framework already has an extensive number of Validators you can build on . 由于ZF是一个组件库,您可以使用它们,而无需将整个应用程序迁移到ZF。梨也有 Validation package.

        3
  •  0
  •   MANCHUCK    14 年前

    我不想在产品代码中使用反射。而不是试图调用validate_ 某物