二. PHP模式设计----PHP对象工具
来源:互联网 发布:ms sql 去空格 编辑:程序博客网 时间:2024/06/11 04:32
1 自动加载需要的源代码文件 __autoload()//文件My_Packages/Debug.phpclass MyPackages_Debug{ static function helloWorld(){ print "hello from Debug\n"; }} //文件二function __autoload($className){ //DIRECTORY_SEPARATOR将返回一个系统目录分隔标识符,WIN下是'\',Linux下是'/' $path=str_replace('_', DIRECTORY_SEPARATOR, $className); include_once("$path.php");}$debug=new MyPackages_Debug();$debug::helloWorld(); 2 通过命名空间融合自动加载__autoload实现自动包含 function __autoload($className){ //匹配包含反斜杠的类名 if(preg_match("/\\\\/", $className)){ $path=str_replace('\\', DIRECTORY_SEPARATOR, $className); }else{ //DIRECTORY_SEPARATOR将返回一个系统目录分隔标识符,WIN下是'\',Linux下是'/' $path=str_replace('_', DIRECTORY_SEPARATOR, $className); } include_once("$path.php");}use MyPackages\Debug;$debug=new Debug();$debug::helloWorld(); 3 判断对象所属的具体哪个类,用get_class() 判断对象是属于哪个类或接口的家族成员,用instanceof 操作符(要检测的对象在左边)4 获取类或者对象中的所有public方法 get_class_methods()注意,method_exists($方法名)可以检测出任意访问权限的方法是否存在,不单单是public5 获取类或者对象的属性 get_class_vars()Array{ [属性名]=>VALUE(如果有的话)}6 还有很多,比如get_parent_class(),is_subclass_of(),class_implements等等7 反射API下面的例子介绍了如何利用反射API,创建一个类,用于动态调用Module对象class Person{ public $name; function __construct($n){ $this->name=$n; }}interface Module{ function execute();}//下面定义两个实现Module接口的类class FtpModule implements Module{ function setHost($host){ print "FtpModule::setHost():$host\n"; } function setUser($user){ print "FtpModule::setHost():$user\n"; } function execute(){ //Do something }}class PersonModule implements Module{ function setPerson(Person $person){ print "FtpModule::setPerson():{$person->name}\n"; } function execute(){ //Do something }}//用于动态加载实现了Module接口的对象的类class ModuleRunner{ //用来保存创建出来的对象 private $modules=array(); private $configData=array( "PersonModule"=>array('Person'=>'bob'), "FtpModule"=>array('Host'=>'cow.com','User'=>'Coco543') ); //根据配置文件初始化对象 function init(){ $interface=new ReflectionClass('Module'); foreach ($this->configData as $moduleName=>$parmes){ //检测是否存在相对应的模块名,有则创建出来 $moduleClass=new ReflectionClass($moduleName); //创建出来的类必须是实现了Module接口的 if(!$moduleClass->isSubclassOf($interface)){ throw new Exception("Unknow module type: $moduleName"); } $module=$moduleClass->newInstance(); //获取创建的类的所有方法 $methods=$moduleClass->getMethods(); foreach ($methods as $method){ $this->handleMethod($module, $method, $parmes); } array_push($this->modules, $module); } } //操控方法 function handleMethod(Module $module,ReflectionMethod $method,$parmes){ $name=$method->getName(); $args=$method->getParameters(); //方法必须是以set开头,而且参数只有一个 if(count($args)!=1 || stripos($name,'set')>0){ return false; } //方法名去掉set之后,首字母大写 $property=ucfirst(substr($name, 3)); if(!isset($parmes[$property])){ return false; } //获取参数限定类型 $arg_class=$args[0]->getClass(); if(empty($arg_class)){ //执行一个反射方法 $method->invoke($module,$parmes[$property]); }else{ $method->invoke($module,$arg_class->newInstance($parmes[$property])); } }}(new ModuleRunner())->init();
0 0
- 二. PHP模式设计----PHP对象工具
- PHP设计模式(二)
- php面向对象设计模式
- PHP面向对象设计模式
- PHP 设计模式(二)
- PHP设计模式--数据访问对象模式
- php设计模式:值对象模式
- php 设计模式(数据库对象模式)
- php设计模式(二):结构型模式
- PHP面向对象学习笔记之二:生成对象的设计模式
- PHP面向对象编程设计模式(二)单例模式
- 五. PHP模式设计----生成对象
- [php]php设计模式 (总结)
- [介绍]PHP设计模式:DAO(数据访问对象模式)
- [介绍]PHP设计模式:DAO(数据访问对象模式)
- [介绍]PHP设计模式:DAO(数据访问对象模式)
- php设计模式介绍之伪对象模式
- PHP生成对象之设计模式—单例模式
- 经验之谈Java和.NET初级学习入门的区别
- Android:Layout_weight的深刻理解
- urlrewrite 地址重写
- Qt部署中插件的处理
- .net开源背后的故事
- 二. PHP模式设计----PHP对象工具
- java中的多态
- Android之事件响应的两种模型分析
- easyui TextBox 回显 换行
- Web Service的加密
- 如何查看JDK源码
- IA32 MMU paging初始化代码
- 1520
- logstash tcp multihost output(多目标主机输出,保证TCP输出链路的稳定性)