摘要:復(fù)制當(dāng)前閉包對(duì)象,綁定指定的對(duì)象和類作用域。類作用域,可以是對(duì)象,也可以是實(shí)例名稱什么是匿名類先理解以下三個(gè)例子例閉包函數(shù)都是繼承類返回匿名函數(shù)返回匿名函數(shù),也就是閉包函數(shù),所有閉包函數(shù)都是繼承類輸出例將一個(gè)匿名函數(shù)綁定到一個(gè)類中。
類結(jié)構(gòu)
Closure { /* 方法 */ // 用于禁止實(shí)例化的構(gòu)造函數(shù) __construct ( void ) // 復(fù)制一個(gè)閉包,綁定指定的$this對(duì)象和類作用域。 public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = "static" ] ) // 復(fù)制當(dāng)前閉包對(duì)象,綁定指定的$this對(duì)象和類作用域。 public Closure bindTo ( object $newthis [, mixed $newscope = "static" ] ) } // 類作用域,可以是對(duì)象,也可以是實(shí)例名稱什么是匿名類?
先理解以下三個(gè)例子
例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. 將一個(gè)匿名函數(shù)綁定到一個(gè)類中。返回Closure類
class A { public $base = 100; public function funca() { echo 2222; } } class B { private $base = 1000; } // bind : 復(fù)制一個(gè)閉包,綁定指定的$this對(duì)象和類作用域。 $f = function () { return $this->base + 3; }; print_r($f); /** * $f其實(shí)就是一個(gè)closure對(duì)象 Closure Object ( ) */ $a = Closure::bind($f, new A); print_r($a());//out: 103 print_r($a); /* * out: Closure Object ( [this] => A Object ( [base] => 100 ) ) */ // 第三個(gè)參數(shù)就聲明了這個(gè)函數(shù)的可調(diào)用范圍(如果該函數(shù)要調(diào)用private) , 該參數(shù)可以是對(duì)象實(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對(duì)象調(diào)用靜態(tài)屬性 $bcl3 = $cl1->bindTo(null,"A"); echo $bcl1(), " ";//輸出 1 echo $bcl2(), " ";//輸出 2 echo $bcl3(); // 輸出1匿名類有什么用? 給類動(dòng)態(tài)添加新方法
trait DynamicTrait { /** * 自動(dòng)調(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; } } /** * 只帶屬性不帶方法動(dòng)物類 * * @author fantasy */ class Animal { use DynamicTrait; private $dog = "汪汪隊(duì)"; } $animal = new Animal; // 往動(dòng)物類實(shí)例中添加一個(gè)方法獲取實(shí)例的私有屬性$dog $animal->getdog = function() { return $this->dog; }; echo $animal->getdog();//輸出 汪汪隊(duì)模板渲染輸出
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 = "這是文章標(biāo)題"; 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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31424.html
摘要:匿名函數(shù)輸出可以直接將匿名函數(shù)進(jìn)行傳遞。報(bào)錯(cuò),找不到變量之所以稱為副本,是因?yàn)橥ㄟ^(guò)閉包傳值到匿名函數(shù)內(nèi)的變量值也是不能改變。該方法使用了一個(gè)作為回調(diào)函數(shù)。 匿名函數(shù) // Example1 $func = function( $param ) { echo $param; }; $func( some string );//輸出:some string // Example2...
摘要:它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當(dāng)斷言失敗時(shí)拋出特定異常的能力。錯(cuò)誤和異常改變了大多數(shù)錯(cuò)誤的報(bào)告方式。不同于傳統(tǒng)的錯(cuò)誤報(bào)告機(jī)制,現(xiàn)在大多數(shù)錯(cuò)誤被作為異常拋出。 PHP7性能 7最大的亮點(diǎn),應(yīng)該就是性能提高了兩倍,某些測(cè)試環(huán)境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...
摘要:實(shí)例化對(duì)象里面的所在哪個(gè)類就返回哪個(gè)類。訪問(wèn)的是當(dāng)前類有點(diǎn)像因?yàn)槠涫抢^承了的方法,而調(diào)用的。由此可見(jiàn),他們的區(qū)別只有在繼承中才能體現(xiàn)出來(lái),如果沒(méi)有任何繼承,那么這兩者是沒(méi)有區(qū)別的。但如果是在靜態(tài)方法內(nèi)本類的話,最好還是用 以static::來(lái)調(diào)用,是在運(yùn)行的那個(gè)時(shí)刻才執(zhí)行綁定操作; 父類中有個(gè)方法是延遲綁定的,在子類::調(diào)用這個(gè)方法的時(shí)候它又回到調(diào)用的子類開(kāi)始向上找; exampl...
摘要:通過(guò)生成器來(lái)生成關(guān)聯(lián)數(shù)組下面每一行是用分號(hào)分割的字段組合,第一個(gè)字段將被用作鍵名。正常來(lái)說(shuō),產(chǎn)生的是一個(gè),它的成員變量與函數(shù)不存在別名引用關(guān)系。關(guān)鍵字在的版本,生成器允許從其他生成器,可迭代對(duì)象或數(shù)組通過(guò)關(guān)鍵字來(lái)生成對(duì)應(yīng)的值輸出 一般你在迭代一組數(shù)據(jù)的時(shí)候,需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù),假設(shè)數(shù)組很大,則會(huì)消耗很大性能,甚至造成內(nèi)存不足。 //Fatal error: Allowed memory ...
說(shuō)明 魔術(shù)方法就是在特定場(chǎng)景下不需要調(diào)用而自動(dòng)執(zhí)行的方法。因?yàn)橛心g(shù)方法,所以我們的類可以寫(xiě)得很靈活~ __construct #構(gòu)造方法,在類被實(shí)例化時(shí)自動(dòng)調(diào)用,一般用于初始化操作; __destruct #析構(gòu)方法,對(duì)象被銷毀時(shí)自動(dòng)調(diào)用; __clone() #克隆方法,當(dāng)對(duì)象被克隆時(shí),將會(huì)自動(dòng)調(diào)用 __get($key) #屬性獲取...
閱讀 3193·2021-11-12 10:36
閱讀 5082·2021-09-22 10:57
閱讀 1818·2021-09-22 10:53
閱讀 2830·2019-08-30 15:55
閱讀 3573·2019-08-29 17:00
閱讀 3435·2019-08-29 16:36
閱讀 2537·2019-08-29 13:46
閱讀 1429·2019-08-26 11:45