1反射原理的梳理
1.1 BeanFactory属性注解
seckill\pro\core\BeanFactory.php
private static function handlerPropAnno(&$instance,\ReflectionClass $refClass,AnnotationReader $reader) { //读取反射对象的属性 $props = $refClass->getProperties(); foreach ($props as $prop){ //$prop必须是反射对象属性 $propAnnos = $reader->getPropertyAnnotations($prop); foreach ($propAnnos as $propAnno){ //返回对象实例 obj 所属类的名字。如果 obj 不是一个对象则返回 FALSE $handler = self::$handlers[get_class($propAnno)]; $handler($prop,$instance,$propAnno); } } }
其中
第一个参数
//读取反射对象的属性
$props = $refClass->getProperties();
第二个参数
$instance = self::$container->get($refClass->getName())
第三个参数
//$prop必须是反射对象属性
$propAnnos = $reader->getPropertyAnnotations($prop);
DB类自身
1.2 handler
seckill\pro\core\annotationhandlers\DBHandler.php
return [ /** * @prop * object(ReflectionProperty)#48 (2) { ["name"]=> string(2) "db" ["class"]=> string(30) "App\controllers\UserController" } * @instance * object(App\controllers\UserController)#52 (2) { ["db":"App\controllers\UserController":private]=> NULL ["version"]=> string(3) "1.0" } * @self * object(Core\annotations\DB)#55 (1) { ["source"]=> string(6) "docker" } */ DB::class=>function(\ReflectionProperty $prop,$instance,$self) { $mydbBean = BeanFactory::getBean(MyDB::class); //从新获取一个对象 $mydbBean ->setDbSource($self->source);//annotations/DB 里设置的数据源 $prop->setAccessible(true); // $prop->setValue($instance,$mydbBean); return $instance; } ];
第一个参数\ReflectionProperty $prop $prop
来源于 \controllers\UserController.php
第二次参数 $instance
是指\controllers\UserController的实例
第三个参数 $self
seckill\pro\core\annotations\DB.php的实例
标签:HttpServer,20,数据源,self,DB,prop,controllers,instance,UserController From: https://www.cnblogs.com/polax/p/16733133.html