很多时候发现光看并不能很好的学习新东西,必须要动手操作才有更深刻的理解。这篇文章边敲代码边学习laravel的核心功能
类的反射与依赖注入
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| <?php
class Tel { public $number;
public function __construct($number = 110) { $this->number = $number; } }
class Phone { const Time_ZONE = 'CN';
public $time; public $tel;
public function __construct(Tel $tel) { $this->tel = $tel; }
public function call(Tel $tel) { echo $tel->number . PHP_EOL; } }
$reflectionClass = new ReflectionClass(Phone::class);
var_dump($reflectionClass); var_dump($reflectionClass->getConstructor());
$tel = new Tel(123);
var_dump($reflectionClass->newInstance($tel));
var_dump($reflectionClass->getConstants()); var_dump($reflectionClass->getProperty('time')); var_dump($reflectionClass->getProperties()); var_dump($reflectionClass->getFileName()); var_dump($reflectionClass->getMethods());
$parameters = $reflectionClass->getMethod('call')->getParameters(); foreach ($parameters as $parameter) { var_dump($parameter->isDefaultValueAvailable()); var_dump($parameter->getClass()); }
function make(string $className) { $reflectionClass = new ReflectionClass($className); $constructor = $reflectionClass->getConstructor(); $parameters = $constructor->getParameters(); $dependencies = getDependencies($parameters);
return $reflectionClass->newInstanceArgs($dependencies); }
function getDependencies(array $parameters): array { $dependencies = [];
foreach ($parameters as $parameter) { $dependency = $parameter->getClass();
if (is_null($dependency)) {
if ($parameter->isDefaultValueAvailable()) { $dependencies[] = $parameter->getDefaultValue(); } else { $dependencies[] = '0'; }
} else { $temp = make($dependency->name); $dependencies[] = $temp; } } return $dependencies; }
$phone = make('Phone'); var_dump($phone);
|
服务容器
服务容器的两个概念,依赖注入和控制反转:
依赖注入和控制反转是对同一件事情的不同描述,它们描述的角度不同。依赖注入是从应用程序的角度在描述,应用程序依赖容器创建并注入它所需要的外部资源。而控制反转是从容器的角度在描述,容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
服务提供者
//todo
最近多线学习,更新不完整,抱歉!