加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

畅聊PHP Closure类及其用法

发布时间:2022-07-19 14:45:27 所属栏目:PHP教程 来源:互联网
导读:本篇文章给大家介绍一下PHP Closure类,以及如何使用Closure创建匿名函数。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 推荐学习:《PHP视频教程》 Closure 类 用于代表匿名函数的类。 匿名函数(在 PHP 5.3 中被引入)会产生这个类
  本篇文章给大家介绍一下PHP Closure类,以及如何使用Closure创建匿名函数。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
 
 
  推荐学习:《PHP视频教程》
 
  Closure 类
  用于代表匿名函数的类。
 
  匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象。在过去,这个类被认为是一个实现细节,但现在可以依赖它做一些事情。自 PHP 5.4 起,
  这个类带有一些方法,允许在匿名函数创建后对其进行更多的控制。
 
  这个类不能实例化,里面主要有两个方法,都用来复制闭包,一个静态一个动态,下面分别详细讲解下这两个不好理解的方法。
 
  Closure::bind
 
  
    this
 
  需要绑定到匿名函数的对象,或者 NULL 创建未绑定的闭包。
 
   
 
  newscope
 
  想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的
 
  私有、保护方法 的可见性。 The class scope to which associate the closure is to be associated, or 'static' to keep the
 
  current one. If an object is given, the type of the object will be used instead. This determines the visibility of
 
  protected and private methods of the bound object.
 
  上面是该方法的定义,第一个参数很好理解,就是一个闭包函数;第二个参数就不太好理解,如果要复制的闭包中包含$this,这个对象就表示这个
  $this,闭包函数里面对这个对象的修改在调用结束之后也会保持一致,比如修改了一个属性;第三个参数就不太好理解了,看官方的说明也是云里雾里的,
  默认参数情况下,调用$this->访问object $newthis中的属性函数的时候,会有限制,只能访问public属性的函数,如果想访问protected/private属性,
  就要设置为对应的类名/类实例,就要像在类里面一样,要访问那个类的保护/私有属性函数。
 
  例子
 
 
  
 
  <?php
 
  class T {
 
      private function show()
 
      {
 
          echo "我是T里面的私有函数:shown";
 
      }
 
   
 
      protected  function who()
 
      {
 
          echo "我是T里面的保护函数:whon";
 
      }
 
   
 
      public function name()
 
      {
 
          echo "我是T里面的公共函数:namen";
 
      }
 
  }
 
   
 
  $test = new T();
 
   
 
  $func = Closure::bind(function(){
 
      $this->who();
 
      $this->name();
 
      $this->show();
 
  }, $test);
 
   
 
  $func();
 
  上面的代码会报错Fatal error: Uncaught Error: Call to protected method T::who() from context 'Closure'。 加上bind第三个参数为t::class或者new T(),会正常输出每一个结果。
 
 
 
 
  我是T里面的保护函数:who
 
  我是T里面的公共函数:name
 
  我是T里面的私有函数:show
 
  当然了,闭包也可以传递参数
 
  
  $test = new StdClass();
 
  var_dump($test);
 
   
 
  $func = Closure::bind(function($obj){
 
      $obj->name = "燕睿涛";
 
  }, null);
 
   

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读