php 组件类设计

在程序执行中,有些类希望在一次请求中仅实例化一次,之后使用首次初始化的对象,类似Java Spring MVC中@Scope(“request”)作用域。PHP内置提供了多种解决方案,文中给出思路及方案,可解决实际生产问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预期情况,有些类在程序执行的过程中会在多个地方使用,但是我们希望这个类在内存中是持久化的,也就是在一次请求中只会被实例化一次,之后使用都是使用第一次初始化的对象,类似与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');
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值