PHP 对于容器设计思想的实现
1. 先声明一个类,用于后续使用
class Person
{
public function __construct()
{
echo "Person 被实例化了<br/>";
}
public function say()
{
echo "Person 说话了<br/>";
}
}
2. 声明一个容器类,用于存取数据对象
class Container
{
// 容器中的数据存储字段
public static $data = [];
// 绑定方法 (此处绑定一个函数)
public static function bind($name, $fun)
{
self::$data[$name] = $fun;
}
// 获取方法 (返回结果时调用绑定函数,实现惰性加载)
public static function get($name)
{
// 此处逻辑还可继续优化 做到全局只实例化一次 本案例未实现
return self::$data[$name]();
}
}
3. 程序开始时往容器中注册数据
// 此处绑定一个函数,避免在绑定时完成实例化等操作,尽可能实现惰性加载
Container::bind("Person", function () {
return new Person();
});
4. 使用时获取数据。
Container::get("Person");
附全部代码和执行结果如下:
<?php
class Person
{
public function __construct()
{
echo "Person 被实例化了<br/>";
}
public function say()
{
echo "Person 说话了<br/>";
}
}
class Container
{
// 容器中的数据存储字段
public static $data = [];
// 绑定方法 (此处绑定一个函数)
public static function bind($name, $fun)
{
self::$data[$name] = $fun;
}
// 获取方法 (返回结果时调用绑定函数,实现惰性加载)
public static function get($name)
{
echo "获取中,将要执行类的实例化操作<br/>";
// 此处逻辑还可继续优化 做到全局只实例化一次 本案例未实现
return self::$data[$name]();
}
}
// 此处绑定一个函数,避免在绑定时完成实例化等操作,尽可能实现惰性加载
Container::bind("Person", function () {
return new Person();
});
echo "此时只是绑定了数据,并没有执行类的实例化操作<br/>";
Container::get("Person")->say();
echo "<hr/>";
Container::get("Person")->say();
执行结果:
此时只是绑定了数据,并没有执行类的实例化操作
获取中,将要执行类的实例化操作
Person 被实例化了
Person 说话了
==============================
获取中,将要执行类的实例化操作
Person 被实例化了
Person 说话了