php反射类 ReflectionClass使用例子

 更新时间:2016年11月25日 14:55  点击:2111
对于php反射类我相信许多作php开发的朋友都不知道是一个什么东西了,但如果去大公司这些东西还是必须要知道了,今天我们来看篇关于php反射类 ReflectionClass使用例子,希望例子能够帮助到各位。

反射类是一个类的映射

  namespace News;
  class News{
      public $newsid; 
      public function index(){
           ……
      }
  }
正常我们实例化一个类是这样: $News = new News\News();
如果我们要实例化News类的反射类是这样:$News = new \ReflectionClass(‘News\News’);

那么通过反射类实例化的类和普通类有什么不同呢?

通过反射类实例化的类我们可以获取这个这个类的详细信息,可以对类进行分析

例如:$News->getProperties()可以获取这个类的所有属性与方法。

 array (size=1)
      0 => & object(ReflectionProperty)[2]
        public 'name' => string 'newsid' (length=6)
        public 'class' => string 'News' (length=4)
getShortName() getName() getNamespaceName() 分别可以获得类名,带命名空间的类名,和命名空间的名称 News News\News News

ReflectionClass的一个应用就是在父类中获取子类的名称,从而针对不同的子类做不同的处理:

    $reflection = new \ReflectionClass($this);
    $class_name = $reflection->getShortName();
    // check key
    if (!key_exists($class_name, $this->configs)) {
        return true;
    }
    // params
    $params = $this->configs[$class_name];

    return $this->_handle($params);
反射类的使用应该可以相当灵活,还有相当多的其他用途待发掘。

本文章来为各位整理一篇关于 php 建造者生成器模式学习笔记,希望这篇文章能够帮助到各位朋友哦,有兴趣的朋友可以进来看看的哦。

适用场景:

1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,生成器模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

使用效果:

1、 生成器模式的使用使得产品的内部表象可以独立的变化。使用生成器模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。


<?php
/**
* Created by PhpStorm.
*/
 
/**具体产品角色 车
* Class Car
*/
class Car
{
public $_head;
public $_engine;//引擎
public $_tyre;//轮胎
 
function show()
{
echo "车头的颜色:{$this->_head}<br/>";
echo "引擎的品牌:{$this->_engine}<br/>";
echo "轮胎的品牌:{$this->_tyre}<br/>";
}
}
 
/**抽象车的建造者(生成器)
* Class CarBuilder
*/
abstract class CarBuilder
{
protected $_car;
 
function __construct()
{
$this->_car=new Car();
}
 
abstract function BuildHead();
abstract function BuildEngine();
abstract function BuildTyre();
abstract function GetCar();
}
 
/**具体车的建造者(生成器) 宝马
* Class BMW
*/
class BMW extends CarBuilder
{
 
function BuildHead()
{
// TODO: Implement BuilderHead() method.
$this->_car->_head="Black";
}
 
function BuildEngine()
{
// TODO: Implement BuildEngine() method.
$this->_car->_engine="BMW";
}
 
function BuildTyre()
{
// TODO: Implement BuildTyre() method.
$this->_car->_tyre="BMW";
}
 
function GetCar()
{
// TODO: Implement GetCar() method.
return $this->_car;
}
}
 
/**别克
* Class BuickBird
*/
class BuickBird extends CarBuilder
{
 
function BuildHead()
{
// TODO: Implement BuildHead() method.
$this->_car->_head="Red";
}
 
function BuildEngine()
{
// TODO: Implement BuildEngine() BMmethod.
$this->_car->_engine="Buick";//
}
 
function BuildTyre()
{
// TODO: Implement BuildTyre() method.
$this->_car->_tyre="Buick";
}
 
function GetCar()
{
// TODO: Implement GetCar() method.
return $this->_car;
}
}
 
/**指挥者
* Class Director
*/
class Director
{
/**
* @param $_builder 建造者
* @return mixed 产品类:车
*/
function Construct($_builder)
{
$_builder->BuildHead();
$_builder->BuildEngine();
$_builder->BuildTyre();
return $_builder->GetCar();
}
}

适配器模式许多和php程序员都没有碰到关于适配器的应用了,这里小编整理了两个关于适配器的使用例子,下面我们就一起来看看吧,希望各位有帮助。


【目的】:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作


【主要角色】

目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的
源(Adaptee)角色:需要进行适配的接口
适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类
【适用性】
1、你想使用一个已经存在的类,而它的接口不符合你的需求
2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作
3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)

//目标角色 
interface Target { 
    public function simpleMethod1(); 
    public function simpleMethod2(); 

 
//源角色 
class Adaptee { 
     
    public function simpleMethod1(){ 
        echo 'Adapter simpleMethod1'."<br>"; 
    } 

 
//类适配器角色 
class Adapter implements Target { 
    private $adaptee; 
     
     
    function __construct(Adaptee $adaptee) { 
        $this->adaptee = $adaptee;  
    } 
     
    //委派调用Adaptee的sampleMethod1方法 
    public function simpleMethod1(){ 
        echo $this->adaptee->simpleMethod1(); 
    } 
     
    public function simpleMethod2(){ 
        echo 'Adapter simpleMethod2'."<br>";    
    }  
     

 
//客户端 
class Client { 
     
    public static function main() { 
        $adaptee = new Adaptee(); 
        $adapter = new Adapter($adaptee); 
        $adapter->simpleMethod1(); 
        $adapter->simpleMethod2();  
    } 

 
Client::main();

 【运行结果】

Adapter simpleMethod1
Adapter simpleMethod2

例子2

生活中最常见到的足球换人机制

<?php
/**
* Created by PhpStorm.
*/
//-------------抽象接口---------------
/**抽象运动员
* Interface IPlayer
*/
interface SoccerPlayer
{
function Attack();
function Defense();
}
 
/**前锋
* Class Forward
*/
class Forward implements SoccerPlayer
{
 
function Attack()
{
echo "前锋攻击<br/>";
}
 
function Defense()
{
echo "前锋防御<br/>";
}
}
 
/**中锋
* Class Center
*/
class Center implements SoccerPlayer
{
 
function Attack()
{
echo "中锋攻击<br/>";
}
 
function Defense()
{
echo "中锋防御<br/>";
}
}
 
//--------------待适配对象-----------
/**梅西 刚进入罢赛的运动员
* Class Yaoming
*/
class Messi
{
function 进攻()
{
echo "梅西进攻<br/>";
}
 
function 防御()
{
echo "梅西防御<br/>";
}
}
 
//------------适配器--------------
/**适配器
* Class Adapter
*/
class Adapter implements SoccerPlayer
{
private $_player;
 
function __construct()
{
$this->_player=new Messi();
}
 
function Attack()
{
$this->_player->进攻();
}
 
function Defense()
{
$this->_player->防御();
}
}

测试如下

$player1=new Forward();
 
echo "前锋上场:<br/>";
$player1->Attack();
$player1->Defense();
 
echo "<hr/><br/>";
 
echo "梅西上场:<br/>";
$Messi=new Adapter();
$Messi->Attack();
$Messi->Defense();

PHP7下安装Emlog5有朋友听了会觉得其怪了这个和php 7有什么关系呢,其实这个当然是有的了,下面我们就一起来看看关于PHP7下安装Emlog5.3.1的笔记吧。

PHP7出来一段时间了,据说PHP7可以性能翻倍。而且我的服务器上也已经开通了PHP7,就开始折腾下Emlog5.3.1。
直接在php7安装emlog5.3.1各种报错。emlog5.3.1虽然已经出了使用mysqli连接类,但是为了兼容性还是默认是使用了mysql。因为PHP7已经不支持mysql扩展了,但是支持mysqli和pdo_mysql。所以这里还是介绍如何使用mysqli来安装emlog。

以下是修改emlog安装程序,无报错安装。如果是实际环境请在本地环境模拟后成功后再更换。

1、修改include\lib\option.php,大概11行修改为mysqli
 //默认MySQL链接方式,mysql或mysqli
 const DEFAULT_MYSQLCONN = 'mysql';
改为
 const DEFAULT_MYSQLCONN = 'mysqli';//默认链接方式改为mysqli

2、修改include\lib\database.php,大概16行删除default:
            case 'mysql':
            default ://这边需要删除default:
3、修改include\lib\cache.php,大概195行加大括号
    $$row['option_name'] = $row['option_value'];
改为
   ${$row['option_name']} = $row['option_value'];

PS:暂时就发现这么些地方要修改的,还有部分插件写死了数据库链接方式。需要修改,不然直接报数据库错误。
比如:$DB = MySql::getInstance();改为$DB = Database::getInstance();等等。

2.jpg

[!--infotagslink--]

相关文章