代码之家  ›  专栏  ›  技术社区  ›  CSchulz cL83

反射类转换为“正常”类

  •  3
  • CSchulz cL83  · 技术社区  · 14 年前

    我有一个类TableData有两个神奇的方法。一个是构造函数,另一个是调用方法。

    $class = new ReflectionClass('TableData');
    $class->newInstanceArgs($parArray);
    

    $class->getData() ,但不起作用。我得到一个错误,我调用了一个未定义的方法。
    我试着使用ReflectionMethod和invoke,但它不再起作用。

    是否无法将ReflectionClass对象强制转换为我的TableData类?

    谢谢你的建议!

    3 回复  |  直到 14 年前
        1
  •  10
  •   Stefan Gehrig    14 年前

    无法对的实例调用该方法 ReflectionClass . 您必须调用 实例

    $class    = new ReflectionClass('TableData');
    $instance = $class->newInstanceArgs($parArray);
    $instance->getData();
    
        2
  •  2
  •   Pascal MARTIN    14 年前

    ReflectionClass :

    class MyClass {
      public function __call($method, $args) {
        var_dump($method);
      }
    }
    
    $reflectionClass = new ReflectionClass('MyClass');
    

    $class = $reflectionClass->newInstanceArgs();
    

    在那上面调用你的方法 $class 对象:

    $class->getData();
    

    你会得到预期的结果:

    string 'getData' (length=7)
    


    i、 e.您必须对返回的内容调用您的方法 newInstanceArgs ,而不是在 它自己。

        3
  •  0
  •   NikiC    14 年前

    我想知道你为什么在这里使用反射。也许您最好修改构造函数以接受数组?

    不使用反射的原因是缓慢和不易理解:

    $instace = new TableData($parArray);
    

    $class    = new ReflectionClass('TableData');
    $instance = $class->newInstanceArgs($parArray);
    

    func_get_args :

    class TableData {
        public function __constructor() {
            if (func_num_args() != 1 || !is_array($params = func_get_arg(0))) {
                $params = func_get_args();
            }
    
            // now the args are in $params either way
        }
    }