public function injectDependent($refl, $ins, $meta, $properties, $injector = null)
{
$defaults = array();
$class_name = $refl->getName();
$class_defaults = $refl->getDefaultProperties();
if (isset($meta['property'])) {
foreach ($meta['property'] as $property => $value) {
//参数是否可选
if (isset($value['value']) && isset($value['value']['optional']) && $value['value']['optional']) {
continue;
}
//设置了默认值
if (isset($value['value']) && isset($value['value']['default'])) {
$defaults[$property] = $value['value']['default'];
continue;
}
// 是否设置了默认值
if (array_key_exists($property, $class_defaults)) {
continue;
}
Verify::isTrue(array_key_exists($property, $properties), "{$class_name}::{$property} is required");
}
}
// 设置属性
if ($properties !== null) {
foreach ($properties as $name => $value) {
unset($defaults[$name]);
$v = $this->getProperty($value);
self::setPropertyValue($refl, $ins, $name, $v);
}
}
// 注入依赖
if (isset($meta['inject'])) {
foreach ($meta['inject'] as $property => $value) {
//先设置必须的属性
if (is_array($value['value'])) {
$src = $value['value']['src'];
//参数是否可选
if (isset($value['value']) && isset($value['value']['optional']) && $value['value']['optional']) {
continue;
}
//设置了默认值
if (isset($value['value']) && isset($value['value']['default'])) {
$defaults[$property] = $value['value']['default'];
continue;
}
} else {
$src = $value['value'];
}
//是否设置了默认值
if (array_key_exists($property, $class_defaults)) {
continue;
}
if ($src === "ioc_factory" || $src == "factory") {
continue;
} else {
$got = false;
Verify::isTrue($injector !== null, "{$class_name}::{$property} is required");
$val = $injector($src, $got);
Verify::isTrue($got, "{$class_name}::{$property} is required");
self::setPropertyValue($refl, $ins, $property, $val);
unset($meta['inject'][$property]);
}
}
//在设置可选的
foreach ($meta['inject'] as $property => $value) {
if (is_array($value['value'])) {
$src = $value['value']['src'];
} else {
$src = $value['value'];
}
if ($src == "ioc_factory" || $src == "factory") {
self::setPropertyValue($refl, $ins, $property, $this);
unset($defaults[$property]);
} else {
if ($injector) {
$val = $injector($src, $got);
if ($got) {
self::setPropertyValue($refl, $ins, $property, $val);
unset($defaults[$property]);
}
}
}
}
}
// 设置默认属性
foreach ($defaults as $name => $value) {
unset($defaults[$name]);
$v = $this->getProperty($value);
self::setPropertyValue($refl, $ins, $name, $v);
}
}