为什么setAccessible方法无法改变php中可访问的构造函数方法?

时间:2017-01-28 14:42:51

标签: php reflection constructor

当我尝试将Reflection API用于PHP中的单例模式类的新实例时,由于非公共构造函数,我失败了。

简单代码:

    JButton b;
    new JPanel().add(b=new JButton(new AbstractAction("Click Me"){
        @Override
        public void actionPerformed(ActionEvent e){
            //
        }
    }));

然后,在调用newInstanceArgs方法之前,我尝试使用$ class-> getConstructor() - > setAccessible(true)。它也失败了,异常消息也一样。

现在,我知道这些代码无法获得某个对象的正确实例。但是,我想知道为什么setAccessible方法不能改变构造函数方法是否可访问?

1 个答案:

答案 0 :(得分:0)

$class->getConstructor()返回一个ReflectionMethod,setAccessible(true)允许调用该方法,但只能从ReflectionMethod实例调用。在ReflectionClass级别,构造函数保持私有。

要做你想做的事,你可以尝试这样的事情:

$reflection = new ReflectionClass(MySingletonClass::class);
$constructor = $reflection->getConstructor();
$constructor->setAccessible(true);

$mySingleton =  $reflection->newInstanceWithoutConstructor();
$constructor->invokeArgs($mySingleton, [/*your arguments*/]);