调用类私用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php
class Cat { private function want($see) { echo $see.$see.$see.PHP_EOL; } }
$reflector = new ReflectionClass(Cat::class); $instance = $reflector->newInstance(); $method = $reflector->getmethod('want'); $method->setAccessible(true); $result = $method->invoke($instance, 'eat food ');
|
实例化不可实例的类
使用这个的原因是因为拆分老的业务代码中,有个一个 Aentity 依赖另一个 Bentity (在orm层中调用get_class),如果查询或者Bentity提供的创建方法会导致将其注册到 UnitOfWork 中,会导致最后的入库(虽然也有可能不入库),所以采用 ReflectionClass::newInstanceWithoutConstructor 实例化一个在 get_class 范围内等价的 entity ,并将其作为一个临时的参数对象代替 Bentity 维持代码的运作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <?php function println(String $str) { echo($str.PHP_EOL); }
class Dog { protected $name;
private function __construct($name = 'WangCai') { $this->name = $name; }
public function setName($name) { $this->name = $name; }
public function getName() { return $this->name; } }
$reflector = new ReflectionClass(Dog::class); $dog = $reflector->newInstanceWithoutConstructor(); $dog->setName('DeFu'); $class = get_class($dog); println($class); println($dog->getName());
|