摘要:復制當前閉包對象,綁定指定的對象和類作用域。類作用域,可以是對象,也可以是實例名稱什么是匿名類先理解以下三個例子例閉包函數(shù)都是繼承類返回匿名函數(shù)返回匿名函數(shù),也就是閉包函數(shù),所有閉包函數(shù)都是繼承類輸出例將一個匿名函數(shù)綁定到一個類中。
類結(jié)構(gòu)
Closure { /* 方法 */ // 用于禁止實例化的構(gòu)造函數(shù) __construct ( void ) // 復制一個閉包,綁定指定的$this對象和類作用域。 public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = "static" ] ) // 復制當前閉包對象,綁定指定的$this對象和類作用域。 public Closure bindTo ( object $newthis [, mixed $newscope = "static" ] ) } // 類作用域,可以是對象,也可以是實例名稱什么是匿名類?
先理解以下三個例子
例1. 閉包函數(shù)都是繼承Closure類class A { public static function testA() { return function($i) { //返回匿名函數(shù) return $i+100; }; } } function B(Closure $callback) { return $callback(200); } $a = B(A::testA()); // A::testA() 返回匿名函數(shù),也就是閉包函數(shù),所有閉包函數(shù)都是繼承Closure類 // print_r($a); //輸出 300例2. 將一個匿名函數(shù)綁定到一個類中。返回Closure類
class A { public $base = 100; public function funca() { echo 2222; } } class B { private $base = 1000; } // bind : 復制一個閉包,綁定指定的$this對象和類作用域。 $f = function () { return $this->base + 3; }; print_r($f); /** * $f其實就是一個closure對象 Closure Object ( ) */ $a = Closure::bind($f, new A); print_r($a());//out: 103 print_r($a); /* * out: Closure Object ( [this] => A Object ( [base] => 100 ) ) */ // 第三個參數(shù)就聲明了這個函數(shù)的可調(diào)用范圍(如果該函數(shù)要調(diào)用private) , 該參數(shù)可以是對象實例,也可以是類名 $b = Closure::bind($f, new B, "B"); print_r($b); /** * out: Closure Object ( [this] => B Object ( [base:B:private] => 1000 ) ) */ print_r($b());//out: 10033. 第二參數(shù)為null,代表靜態(tài)調(diào)用static
class A { private static $sfoo = 1; private $ifoo = 2; } // 要調(diào)靜態(tài)的屬性,就必須聲明static $cl1 = static function() { return A::$sfoo; }; $cl2 = function() { return $this->ifoo; }; // 第二參數(shù)為null,就代表調(diào)用static $bcl1 = Closure::bind($cl1, null, "A"); $bcl2 = Closure::bind($cl2, new A(), "A"); // 以closure對象調(diào)用靜態(tài)屬性 $bcl3 = $cl1->bindTo(null,"A"); echo $bcl1(), " ";//輸出 1 echo $bcl2(), " ";//輸出 2 echo $bcl3(); // 輸出1匿名類有什么用? 給類動態(tài)添加新方法
trait DynamicTrait { /** * 自動調(diào)用類中存在的方法 */ public function __call($name, $args) { if(is_callable($this->$name)){ return call_user_func($this->$name, $args); }else{ throw new RuntimeException("Method {$name} does not exist"); } } /** * 添加方法 */ public function __set($name, $value) { $this->$name = is_callable($value)? $value->bindTo($this, $this): $value; } } /** * 只帶屬性不帶方法動物類 * * @author fantasy */ class Animal { use DynamicTrait; private $dog = "汪汪隊"; } $animal = new Animal; // 往動物類實例中添加一個方法獲取實例的私有屬性$dog $animal->getdog = function() { return $this->dog; }; echo $animal->getdog();//輸出 汪汪隊模板渲染輸出
Template.php
class Template{ /** * 渲染方法 * * @access public * @param obj 信息類 * @param string 模板文件名 */ public function render($context, $tpl){ $closure = function($tpl){ ob_start(); include $tpl; return ob_end_flush(); }; // PHP7: $closure->call($context, $tpl); $closure = $closure->bindTo($context, $context); $closure($tpl); } }
Article.php
/** * 文章信息類 */ class Article { private $title = "這是文章標題"; private $content = "這是文章內(nèi)容"; }
tpl.php
··· ···title;?>
content;?>
··· ···
index.php
function __autoload($class) { require_once "$class.php"; } $template = new Template; $template->render(new Article, "tpl.php");PHP7 新增的call方法
class Value { protected $value; public function __construct($value) { $this->value = $value; } public function getValue() { return $this->value; } } $three = new Value(3); $four = new Value(4); $closure = function ($delta){ return $this->getValue() + $delta; }; /** * function call ($newThis, ...$parameters) * 把$closure綁定到$three,并調(diào)用;第二參數(shù)起就是閉包的參數(shù) */ echo $closure->call($three , 3); echo PHP_EOL; echo $closure->call($four , 4);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31424.html
摘要:匿名函數(shù)輸出可以直接將匿名函數(shù)進行傳遞。報錯,找不到變量之所以稱為副本,是因為通過閉包傳值到匿名函數(shù)內(nèi)的變量值也是不能改變。該方法使用了一個作為回調(diào)函數(shù)。 匿名函數(shù) // Example1 $func = function( $param ) { echo $param; }; $func( some string );//輸出:some string // Example2...
摘要:它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數(shù)錯誤的報告方式。不同于傳統(tǒng)的錯誤報告機制,現(xiàn)在大多數(shù)錯誤被作為異常拋出。 PHP7性能 7最大的亮點,應該就是性能提高了兩倍,某些測試環(huán)境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...
摘要:實例化對象里面的所在哪個類就返回哪個類。訪問的是當前類有點像因為其是繼承了的方法,而調(diào)用的。由此可見,他們的區(qū)別只有在繼承中才能體現(xiàn)出來,如果沒有任何繼承,那么這兩者是沒有區(qū)別的。但如果是在靜態(tài)方法內(nèi)本類的話,最好還是用 以static::來調(diào)用,是在運行的那個時刻才執(zhí)行綁定操作; 父類中有個方法是延遲綁定的,在子類::調(diào)用這個方法的時候它又回到調(diào)用的子類開始向上找; exampl...
摘要:通過生成器來生成關(guān)聯(lián)數(shù)組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產(chǎn)生的是一個,它的成員變量與函數(shù)不存在別名引用關(guān)系。關(guān)鍵字在的版本,生成器允許從其他生成器,可迭代對象或數(shù)組通過關(guān)鍵字來生成對應的值輸出 一般你在迭代一組數(shù)據(jù)的時候,需要創(chuàng)建一個數(shù)據(jù),假設(shè)數(shù)組很大,則會消耗很大性能,甚至造成內(nèi)存不足。 //Fatal error: Allowed memory ...
說明 魔術(shù)方法就是在特定場景下不需要調(diào)用而自動執(zhí)行的方法。因為有魔術(shù)方法,所以我們的類可以寫得很靈活~ __construct #構(gòu)造方法,在類被實例化時自動調(diào)用,一般用于初始化操作; __destruct #析構(gòu)方法,對象被銷毀時自動調(diào)用; __clone() #克隆方法,當對象被克隆時,將會自動調(diào)用 __get($key) #屬性獲取...
閱讀 3031·2021-11-12 10:36
閱讀 4773·2021-09-22 10:57
閱讀 1584·2021-09-22 10:53
閱讀 2673·2019-08-30 15:55
閱讀 3504·2019-08-29 17:00
閱讀 3362·2019-08-29 16:36
閱讀 2478·2019-08-29 13:46
閱讀 1356·2019-08-26 11:45