rollun-com / rollun-dic
InsideConstruct
Requires
- php: ^8.0
- container-interop/container-interop: ^1.2
- psr/container: ^1.0
Requires (Dev)
- laminas/laminas-config-aggregator: ^1.7
- laminas/laminas-db: ^2.13.4
- laminas/laminas-diactoros: ^2.8.0
- laminas/laminas-http: ^2.15.1
- laminas/laminas-servicemanager: ^3.10.0
- laminas/laminas-stratigility: ^3.5.0
- mezzio/mezzio: ^3.9
- phpunit/phpunit: ^9.5.10
- symfony/dotenv: 6.1.x-dev
This package is auto-updated.
Last update: 2024-08-30 01:23:15 UTC
README
目录
帮助
依赖注入
通过设置器方法 - 如果存在设置器属性,则将在注入时使用它。通过对象属性/属性 - 如果未找到相应的设置器,则将通过属性注入依赖。
公开属性 - 考虑继承层次结构初始化实例中的属性受保护属性 - 考虑继承层次结构初始化实例中的属性私有属性 - 无继承层次结构初始化实例中的属性
依赖项加载和参数类型化
如果参数类型化为基础类型,则不会从容器中获取此类参数。
简单类型(int,string,float,array,resource,)
如果参数通过类名或接口名进行类型化,则将从容器中加载此类服务,并在失败时抛出异常。
如果参数未类型化,则服务将尝试从容器中加载,如果失败,则使用默认值。
方法和调用特定
init
初始化服务依赖项,如方法 __construct 中所述。
如果有父构造函数,则调用父构造函数并注入依赖项。这还允许将依赖项传递给父构造函数。
为此,需要在方法参数中传递一个映射数组。
作为 键 的数组指定构造函数中参数的名称(服务)的名称,作为值指定父类构造函数中参数的名称。
setConstructParams
初始化服务依赖项,如方法 __construct 中所述。
不调用父构造函数
作为参数可以传递配置映射。
作为键 - 构造函数参数的名称,作为值 - 需要加载的服务名称。
initWakeup
允许使用依赖项初始化服务。
作为参数可以传递配置映射。
作为键 - 属性/属性类的名称,作为值 - 需要加载的服务名称。
runParentConstruct
调用父构造函数
作为参数可以传递配置映射。
作为键 - 构造函数参数的名称(父类),作为值 - 需要加载的服务名称。
创建应用程序的框架。
DI - InsideConstruct
##快速入门
###常规做法
假设有一个类,接受 3 个服务作为依赖项
class Class1
{
public $propA;
public $propB;
public $propC;
public function __construct($propA = null, $propB = null, $propC = null)
{
$this->propA = $propA;
$this->propB = $propB;
$this->propC = $propC;
}
}
/* @var $container ContainerInterface */
global $container;
$propA = $container->has('propA') ? $container->get('propA') : null;
$propB = $container->has('propB') ? $container->get('propB') : null;
$propC = $container->has('propC') ? $container->get('propC') : null;
new Class1($propA, $propB, $propC);
我们从容器中获取依赖项并将它们分配给对象的同名属性。
###现在使用 InsideConstruct::init()
做同样的事情
如果参数名与服务名和对象属性名相匹配
class Class1
{
public $propA;
public $propB;
public $propC;
public function __construct($propA = null, $propB = null, $propC = null)
{
InsideConstruct::init();
}
}
new Class1();
所有三个服务都将像上面的例子一样从 $containr
中初始化。InsideConstruct::init
调用不会更改传递给构造函数的参数。
如果构造函数参数指定了类型或接口,则通过 InsideConstruct::init()
获取的服务将进行验证。
初始化对象的 Public
、Protected
和 Private
属性,以及如果尚未初始化则父属性。之后将调用父构造函数,并将服务传递给它。
不会初始化 Static
属性和先祖的 Private
属性。
##使用
InsideConstruct::init();
方法返回什么
返回数组 ['param1Name'=>value1', 'param2Name' => 'value2', ...]
如何覆盖默认值
如果这样
new Class1(new stdClass(), null);
则只有一个(最后一个)参数将被服务 $container->get('propC')
初始化。
其他两个将获得 new stdClass(
) 和 null
的值。但对于所有参数,赋值给对象属性或调用设置器(见下文)将正常工作。
设置器 ($this->setPropA($value)
)
如果构造函数参数定义了相应的(按名称)setter,则它将被调用。setter具有高于属性的优先级。如果参数既有setter又有属性,则将调用setter,而不会对属性进行赋值。
那么继承呢?
假设我们有基类
class Class0
{
public $propA;
public $propB;
public function __construct($newPropA = null, $propB= null)
{
//do some...
}
}
$class0 = new Class0; // $class0->propA = $container->get('propA');
,而我们需要更改所使用的服务
$class0->propA = $container->get('newPropA');
$class0->propB = $container->get('propB');
可以这样
class Class1 extends Class0
{
public function __construct($newPropA = null)
{
InsideConstruct::init(['newPropA' => 'propA']);
}
};
或者使用init()
方法来初始化我们的依赖项和父类的依赖项。如果我们的类构造函数中存在与父类构造函数中相同的服务的名称,则依赖项将被传递 - 将作为参数传递给父类构造函数。同样,init()
方法接受一个参数替换数组,在子类重定义父类依赖项的情况下。在这种情况下,可以传递一个数组,其中键包含重定义依赖项的名称,值包含初始依赖项的名称。
如果需要在中间做些什么呢?
class Class0
{
public $propA;
public function __construct($propA = null)
{
}
}
$class0 = new Class0; // $class0->propA = $container->get('propA');
,而我们需要更改所使用的服务
$propB = $container->get('propB'); $class0->propA = $propB->getPropA()
可以这样
class Class1 extends Class0
{
public function __construct($propB = null)
{
$params = InsideConstruct::setConstructParams();
$propA = ($params['propB'])->getPropA();
InsideConstruct::runParentConstruct(['propA' => $propA]);
}
};
我们可以使用runParentConstruct()
方法来通过构造函数初始化父级依赖项,我们还可以传递一个包含我们希望显式传递给父类构造函数的字段的数组。
调用setConstructParams()
方法将初始化我们的依赖项。同样,可以传递一个数组作为参数,其中键指定具有setter的类的变量名称,您想要初始化,而值指定服务名称。
调用参数
在上面的例子中,InsideConstruct::runParentConstruct(['propA' => $propA]);
添加了调用参数['propA' => $propA]
。这样做是为了能够将预先定义好的参数传递给父类构造函数。
再次简要介绍要点
如果存在相应的setter或属性,则将赋值。
如果传递了参数(即使NULL
),则不会从容器中加载服务。
如果没有传递参数,则如果存在setter或属性,将从容器中加载服务。