预期情况,有些类在程序执行的过程中会在多个地方使用,但是我们希望这个类在内存中是持久化的,也就是在一次请求中只会被实例化一次,之后使用都是使用第一次初始化的对象,类似与java spring mvc 中 @Scope(“request”) 作用域的详解。 怎么办呢?php 内置为我们提供了很多的解决方案。这里我提供我的思路及解决方案,它完美的解决了我们在实际生产过程中会遇到的问题。
<?php
/**
* 定义一个控制类,继承自此控制类的类都拥有组件化特性,如果组件的扩展还需依赖于其它类 则让组件类继承其它共有依赖的类
* 比如 class Commponent extends XXXX 类或是让依赖类 继承组件类, class XXXX extends Component 但是这样就不能直接
* 继承Component,要转而去继承类的依赖类。
*/
class Component
{
/**
* 存放所有的组件类对象,每个元素即是一个引用对象
*/
private static $Objs= [];
/**
* 获取目标组件
* @param
* String $class_name 组件类名称
* boolean is_new 是否创建一个新的对象组件
* @return
* Object obj 组件对象
*/
public static function getObject($class_name,$is_new = false)
{
if(!$is_new)
{
if(!isset(self::$Objs[$class_name]))
{
self::$Objs[$class_name] = new $class_name();
if(method_exists(self::$Objs[$class_name],"__init"))
self::$Objs[$class_name]->__init();
}
return self::$Objs[$class_name];
}else{
$target_obj = new $class_name();
if(method_exists($target_obj,"__init"))
$target_obj->__init();
return $target_obj;
}
}
}
/**
* 创建组件使用函数
* 注解:关于组件地址的引用规则和类名和文件名的引用规则可以在这里做变化,这案例为测试,所及就比较偏简化
*/
function loadComponent($class_name)
{
require("$class_name.php");//注意类文件名和文件内容中类名之间的关系
return $class_name::getObject($class_name);
}
?>
组件对象的使用 Test.php
<?php
class Test extends Component
{
public function __construct()
{
echo "<p>我被创建了</p>";
}
public function __init()
{
echo "<p>我是组件内置构造函数</p>";
}
public function getNname()
{
return "my name is tantong";
}
}
$test = loadComponent('Test');
$test1 = loadComponent('Test');
?>