摘要:復制當前閉包對象,綁定指定的對象和類作用域。類作用域,可以是對象,也可以是實例名稱什么是匿名類先理解以下三個例子例閉包函數都是繼承類返回匿名函數返回匿名函數,也就是閉包函數,所有閉包函數都是繼承類輸出例將一個匿名函數綁定到一個類中。
類結構
Closure { /* 方法 */ // 用于禁止實例化的構造函數 __construct ( void ) // 復制一個閉包,綁定指定的$this對象和類作用域。 public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = "static" ] ) // 復制當前閉包對象,綁定指定的$this對象和類作用域。 public Closure bindTo ( object $newthis [, mixed $newscope = "static" ] ) } // 類作用域,可以是對象,也可以是實例名稱什么是匿名類?
先理解以下三個例子
例1. 閉包函數都是繼承Closure類class A { public static function testA() { return function($i) { //返回匿名函數 return $i+100; }; } } function B(Closure $callback) { return $callback(200); } $a = B(A::testA()); // A::testA() 返回匿名函數,也就是閉包函數,所有閉包函數都是繼承Closure類 // print_r($a); //輸出 300例2. 將一個匿名函數綁定到一個類中。返回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 ) ) */ // 第三個參數就聲明了這個函數的可調用范圍(如果該函數要調用private) , 該參數可以是對象實例,也可以是類名 $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. 第二參數為null,代表靜態調用static
class A { private static $sfoo = 1; private $ifoo = 2; } // 要調靜態的屬性,就必須聲明static $cl1 = static function() { return A::$sfoo; }; $cl2 = function() { return $this->ifoo; }; // 第二參數為null,就代表調用static $bcl1 = Closure::bind($cl1, null, "A"); $bcl2 = Closure::bind($cl2, new A(), "A"); // 以closure對象調用靜態屬性 $bcl3 = $cl1->bindTo(null,"A"); echo $bcl1(), " ";//輸出 1 echo $bcl2(), " ";//輸出 2 echo $bcl3(); // 輸出1匿名類有什么用? 給類動態添加新方法
trait DynamicTrait { /** * 自動調用類中存在的方法 */ 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 = "這是文章內容"; }
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,并調用;第二參數起就是閉包的參數 */ echo $closure->call($three , 3); echo PHP_EOL; echo $closure->call($four , 4);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31424.html
摘要:匿名函數輸出可以直接將匿名函數進行傳遞。報錯,找不到變量之所以稱為副本,是因為通過閉包傳值到匿名函數內的變量值也是不能改變。該方法使用了一個作為回調函數。 匿名函數 // Example1 $func = function( $param ) { echo $param; }; $func( some string );//輸出:some string // Example2...
摘要:它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數錯誤的報告方式。不同于傳統的錯誤報告機制,現在大多數錯誤被作為異常拋出。 PHP7性能 7最大的亮點,應該就是性能提高了兩倍,某些測試環境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...
摘要:實例化對象里面的所在哪個類就返回哪個類。訪問的是當前類有點像因為其是繼承了的方法,而調用的。由此可見,他們的區別只有在繼承中才能體現出來,如果沒有任何繼承,那么這兩者是沒有區別的。但如果是在靜態方法內本類的話,最好還是用 以static::來調用,是在運行的那個時刻才執行綁定操作; 父類中有個方法是延遲綁定的,在子類::調用這個方法的時候它又回到調用的子類開始向上找; exampl...
摘要:通過生成器來生成關聯數組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產生的是一個,它的成員變量與函數不存在別名引用關系。關鍵字在的版本,生成器允許從其他生成器,可迭代對象或數組通過關鍵字來生成對應的值輸出 一般你在迭代一組數據的時候,需要創建一個數據,假設數組很大,則會消耗很大性能,甚至造成內存不足。 //Fatal error: Allowed memory ...
說明 魔術方法就是在特定場景下不需要調用而自動執行的方法。因為有魔術方法,所以我們的類可以寫得很靈活~ __construct #構造方法,在類被實例化時自動調用,一般用于初始化操作; __destruct #析構方法,對象被銷毀時自動調用; __clone() #克隆方法,當對象被克隆時,將會自動調用 __get($key) #屬性獲取...
閱讀 3020·2021-11-12 10:36
閱讀 4726·2021-09-22 10:57
閱讀 1558·2021-09-22 10:53
閱讀 2636·2019-08-30 15:55
閱讀 3492·2019-08-29 17:00
閱讀 3351·2019-08-29 16:36
閱讀 2462·2019-08-29 13:46
閱讀 1348·2019-08-26 11:45