首頁 >後端開發 >php教程 >php反射類別ReflectionClass用法分析_php技巧

php反射類別ReflectionClass用法分析_php技巧

WBOY
WBOY原創
2016-05-16 08:59:523579瀏覽

本文實例講述了php反射類別reflectionclass用法。分享給大家參考,具體如下:

先來看一段程式碼:

/**
 * @name php反射api--利用反射技术实现的插件系统架构
 * @author :phpcq.com
 */
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;
}
require_once('plugin.php');
$menu = computemenu();
$articles = computearticles();
print_r($menu);
print_r($articles);

plugin.php 程式碼如下:

<?php
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));
 }
}

上述程式碼是php反射類別的一個應用。

什麼是php反射類,顧名思義,可以理解為一個類別的映射。

舉個例子:

class fuc { //定义一个类
 static
 function ec() {
  echo '我是一个类';
 }
}
$class=new reflectionclass('fuc'); //建立 fuc这个类的反射类

至於$class 這反射類別裡有什麼東東,可以查看手冊,這裡不詳解了

$fuc=$class->newinstance(); //相当于实例化 fuc 类
$fuc->ec(); //执行 fuc 里的方法ec
/*最后输出:我是一个类*/

其中還有一些更高級的用法

$ec=$class->getmethod('ec'); //获取fuc 类中的ec方法
$fuc=$class->newInstance(); //实例化
$ec->invoke($fuc);   //执行ec 方法

上面的過程很熟悉吧。其實和呼叫物件的方法類似

只不過這裡是反著來的,方法在前,物件在後

補充這裡推薦一款本站的php程式碼線上格式化工具,可以方便讀者對網路上壓縮的php格式化程式碼後進行閱讀,方便實用

php程式碼線上格式化美化工具:
http://tools.jb51.net/code/phpformat

更多關於php相關內容有興趣的讀者可查看本站專題:《php數組(array)操作技巧大全 》、《php排序演算法摘要》、《 php常用遍歷演算法與技巧總結》、《php資料結構與演算法教學》、《php程式設計演算法總結》、《php數學運算技巧總結 a>》、《php正規表示式用法摘要》、《php運算與運算子用法總結》、《php字串(string)用法總結》及《php常見資料庫操作技巧總表

希望本文所述對大家php程式設計有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn