php利用反射實(shí)現(xiàn)插件機(jī)制的方法
更新時(shí)間:2015年03月14日 10:37:53 作者:work24
這篇文章主要介紹了php利用反射實(shí)現(xiàn)插件機(jī)制的方法,涉及php反射機(jī)制與插件的實(shí)現(xiàn)技巧,需要的朋友可以參考下
本文實(shí)例講述了php利用反射實(shí)現(xiàn)插件機(jī)制的方法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
復(fù)制代碼 代碼如下:
<?php
/**
* @name PHP反射API--利用反射技術(shù)實(shí)現(xiàn)的插件系統(tǒng)架構(gòu)
*/
interface Iplugin{
public static function getName();
}
function findPlugins(){
$plugins = array();
foreach (get_declared_classes() as $class){
$reflectionClass = new ReflectionClass($class);
if ($reflectionClass->implementsInterface('Iplugin')) {
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
function computeMenu(){
$menu = array();
foreach (findPlugins() as $plugin){
if ($plugin->hasMethod('getMenuItems')) {
$reflectionMethod = $plugin->getMethod('getMenuItems');
if ($reflectionMethod->isStatic()) {
$items = $reflectionMethod->invoke(null);
} else {
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$menu = array_merge($menu,$items);
}
}
return $menu;
}
function computeArticles(){
$articles = array();
foreach (findPlugins() as $plugin){
if ($plugin->hasMethod('getArticles')) {
$reflectionMethod = $plugin->getMethod('getArticles');
if ($reflectionMethod->isStatic()) {
$items = $reflectionMethod->invoke(null);
} else {
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$articles = array_merge($articles,$items);
}
}
return $articles;
}
class MycoolPugin implements Iplugin {
public static function getName(){
return 'MycoolPlugin';
}
public static function getMenuItems(){
return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));
}
public static function getArticles(){
return array(array('path'=>'/MycoolPlugin','title'=>'This is a really cool article','text'=> 'xxxxxxxxx' ));
}
}
$menu = computeMenu();
$articles = computeArticles();
print_r($menu);
print_r($articles);
/**
* @name PHP反射API--利用反射技術(shù)實(shí)現(xiàn)的插件系統(tǒng)架構(gòu)
*/
interface Iplugin{
public static function getName();
}
function findPlugins(){
$plugins = array();
foreach (get_declared_classes() as $class){
$reflectionClass = new ReflectionClass($class);
if ($reflectionClass->implementsInterface('Iplugin')) {
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
function computeMenu(){
$menu = array();
foreach (findPlugins() as $plugin){
if ($plugin->hasMethod('getMenuItems')) {
$reflectionMethod = $plugin->getMethod('getMenuItems');
if ($reflectionMethod->isStatic()) {
$items = $reflectionMethod->invoke(null);
} else {
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$menu = array_merge($menu,$items);
}
}
return $menu;
}
function computeArticles(){
$articles = array();
foreach (findPlugins() as $plugin){
if ($plugin->hasMethod('getArticles')) {
$reflectionMethod = $plugin->getMethod('getArticles');
if ($reflectionMethod->isStatic()) {
$items = $reflectionMethod->invoke(null);
} else {
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke($pluginInstance);
}
$articles = array_merge($articles,$items);
}
}
return $articles;
}
class MycoolPugin implements Iplugin {
public static function getName(){
return 'MycoolPlugin';
}
public static function getMenuItems(){
return array(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));
}
public static function getArticles(){
return array(array('path'=>'/MycoolPlugin','title'=>'This is a really cool article','text'=> 'xxxxxxxxx' ));
}
}
$menu = computeMenu();
$articles = computeArticles();
print_r($menu);
print_r($articles);
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:
- PHP使用反射機(jī)制實(shí)現(xiàn)查找類和方法的所在位置
- PHP反射類ReflectionClass和ReflectionObject的使用方法
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之類與反射API詳解
- php反射類ReflectionClass用法分析
- PHP通過(guò)反射動(dòng)態(tài)加載第三方類和獲得類源碼的實(shí)例
- PHP類的反射用法實(shí)例
- PHP的反射類ReflectionClass、ReflectionMethod使用實(shí)例
- 反射調(diào)用private方法實(shí)踐(php、java)
- PHP 反射機(jī)制實(shí)現(xiàn)動(dòng)態(tài)代理的代碼
- 解析php中反射的應(yīng)用
- PHP反射機(jī)制用法實(shí)例
- PHP基于反射獲取一個(gè)類中所有的方法
相關(guān)文章
PHP中=賦值操作符對(duì)不同數(shù)據(jù)類型的不同行為
作為一個(gè)PHP的新手,一直對(duì)PHP的引用困惑了很久,今晚仔細(xì)看了用戶手冊(cè)和做了一些實(shí)驗(yàn),終于明白了其中的原理和細(xì)節(jié),特別是=操作符對(duì)于不同類型的不同行為。2011-01-01php實(shí)現(xiàn)的mysqldb讀寫(xiě)分離操作類示例
這篇文章主要介紹了php實(shí)現(xiàn)的mysqldb讀寫(xiě)分離操作類,結(jié)合實(shí)例形式分析了php針對(duì)數(shù)據(jù)庫(kù)的讀寫(xiě)分離操作實(shí)現(xiàn)技巧,并給出了該封裝類的具體使用方法,需要的朋友可以參考下2017-02-02PHP開(kāi)發(fā)者常犯的10個(gè)MySQL錯(cuò)誤更正剖析
最近看到一篇文章:《PHP開(kāi)發(fā)者常犯的10個(gè)MySQL錯(cuò)誤》,發(fā)現(xiàn)文中不少內(nèi)容陳舊,隨著時(shí)間推移技術(shù)發(fā)展變化而變得不適用。為了防止誤導(dǎo)新手,特本著與時(shí)俱進(jìn)的精神寫(xiě)出此文,絕非對(duì)原文作者的不尊重2012-01-01關(guān)于頁(yè)面優(yōu)化和偽靜態(tài)
頁(yè)面優(yōu)化和偽靜態(tài)的說(shuō)明。2009-10-10jQuery+php實(shí)現(xiàn)ajax文件即時(shí)上傳的詳解
本篇文章是對(duì)jQuery+php實(shí)現(xiàn)ajax文件即時(shí)上傳的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06