成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【modernPHP專題(9)】匿名類

ninefive / 706人閱讀

摘要:復制當前閉包對象,綁定指定的對象和類作用域。類作用域,可以是對象,也可以是實例名稱什么是匿名類先理解以下三個例子例閉包函數(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: 1003
3. 第二參數(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

相關(guān)文章

  • modernPHP專題(8)】匿名函數(shù)和閉包

    摘要:匿名函數(shù)輸出可以直接將匿名函數(shù)進行傳遞。報錯,找不到變量之所以稱為副本,是因為通過閉包傳值到匿名函數(shù)內(nèi)的變量值也是不能改變。該方法使用了一個作為回調(diào)函數(shù)。 匿名函數(shù) // Example1 $func = function( $param ) { echo $param; }; $func( some string );//輸出:some string // Example2...

    junnplus 評論0 收藏0
  • modernPHP專題(1)】php7常用特性整理

    摘要:它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數(shù)錯誤的報告方式。不同于傳統(tǒng)的錯誤報告機制,現(xiàn)在大多數(shù)錯誤被作為異常拋出。 PHP7性能 7最大的亮點,應該就是性能提高了兩倍,某些測試環(huán)境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...

    Render 評論0 收藏0
  • modernPHP專題(6)】的延遲綁定(后期綁定)

    摘要:實例化對象里面的所在哪個類就返回哪個類。訪問的是當前類有點像因為其是繼承了的方法,而調(diào)用的。由此可見,他們的區(qū)別只有在繼承中才能體現(xiàn)出來,如果沒有任何繼承,那么這兩者是沒有區(qū)別的。但如果是在靜態(tài)方法內(nèi)本類的話,最好還是用 以static::來調(diào)用,是在運行的那個時刻才執(zhí)行綁定操作; 父類中有個方法是延遲綁定的,在子類::調(diào)用這個方法的時候它又回到調(diào)用的子類開始向上找; exampl...

    adam1q84 評論0 收藏0
  • modernPHP專題(7)】生成器語法

    摘要:通過生成器來生成關(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 ...

    jackwang 評論0 收藏0
  • modernPHP專題(12)】魔術(shù)方法小結(jié)

    說明 魔術(shù)方法就是在特定場景下不需要調(diào)用而自動執(zhí)行的方法。因為有魔術(shù)方法,所以我們的類可以寫得很靈活~ __construct #構(gòu)造方法,在類被實例化時自動調(diào)用,一般用于初始化操作; __destruct #析構(gòu)方法,對象被銷毀時自動調(diào)用; __clone() #克隆方法,當對象被克隆時,將會自動調(diào)用 __get($key) #屬性獲取...

    hearaway 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<