美文网首页
PHP闭包和反射的一点总结

PHP闭包和反射的一点总结

作者: 北山学者 | 来源:发表于2019-06-23 16:21 被阅读0次

一、什么是闭包

闭包是指有权访问另一个函数作用域的变量的函数

匿名函数(Anonymous functions ),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

匿名函数目前是通过 Closure (PHP 5 >= 5.3.0, PHP 7)类来实现的。

闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:

<?php
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');

闭包的使用场景:OO使用

<?php

class factory{
    private $_factory;
    public function set($id,$value){
        $this->_factory[$id] = $value;
    }   

    public function get($id){
        $value = $this->_factory[$id];
        return $value();
    }

}

class User{
    private $_username;

    function __construct($username="") {
        $this->_username = $username;
    }

    function getUserName(){
        return $this->_username;
    }

} 

$factory = new factory();
$factory->set("zhangsan",function(){
    return new User('张三');
});

$factory->set("lisi",function(){
   return new User("李四");
});

echo $factory->get("zhangsan")->getUserName();
echo $factory->get("lisi")->getUserName();

连接闭包和外界变量的关键字:USE

闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。

闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。 PHP 7.1 起,不能传入此类变量:superglobals$this或者和参数重名

二、什么是反射

PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。

反射是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。

反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。

反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类。

反射示例:

<?php
class Person {
 
 /**
  * For the sake of demonstration, we"re setting this private
  */
 private $_allowDynamicAttributes = false;

 /**
  * type=primary_autoincrement
  */
 protected $id = 0;

 /**
  * type=varchar length=255 null
  */
 protected $name;

 /**
  * type=text null
  */
 protected $biography;

 public function getId() {
  return $this->id;
 }

 public function setId($v) {
  $this->id = $v;
 }

 public function getName() {
  return $this->name;
 }

 public function setName($v) {
  $this->name = $v;
 }

 public function getBiography() {
  return $this->biography;
 }

 public function setBiography($v) {
  $this->biography = $v;
 }
}

$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类  
$instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类 

参考

1、PHP闭包(Closure)初探
2、匿名函数
3、深入了解PHP闭包的使用以及实现
4、PHP中的闭包小谈(推荐阅读)
5、php什么时候使用闭包(推荐阅读)
6、PHP Reflection API详解
7、PHP 反射机制Reflection
8、PHP的反射类ReflectionClass、ReflectionMethod使用实例
9、php反射类ReflectionClass用法实例详解

相关文章

  • PHP闭包和反射的一点总结

    一、什么是闭包 闭包是指有权访问另一个函数作用域的变量的函数。 匿名函数(Anonymous functions ...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • PHP闭包的理解是使用

    PHP 闭包函数及Closure对象的总结 PHP的闭包 其实学习一个新的概念,除了知道怎么使用,更多的我是想知道...

  • Modern PHP : 闭包和匿名函数

    Modern PHP : 闭包和匿名函数

  • PHP新特性之闭包、匿名函数

    闭包 闭包是什么? 1).闭包和匿名函数在PHP5.3中被引入。2).闭包是指在创建时封装函数周围状态的函数,即使...

  • PHP 闭包

    闭包和匿名函数在php5.3中引入,闭包是指的创建时封装周围状态的函数,即便闭包所在的环境不存在了,闭包中封装的状...

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • Javascript 闭包和递归

    本篇是关于自己对于JS学习闭包和递归的学习和总结 , 大部分为引用 , 部分案例自己总结 。 1.1 闭包(cl...

  • PHP闭包

    一. 闭包函数又叫做匿名函数(没有函数名称的函数). 英文closure 匿名函数常在js函数中出现,比如ajax...

网友评论

      本文标题:PHP闭包和反射的一点总结

      本文链接:https://www.haomeiwen.com/subject/glziqctx.html