PHP 匿名函式bind與bindTo方法使用總結

2021-10-22 10:39:01 字數 3193 閱讀 6606

匿名函式,即乙個沒有函式名稱的函式。

$func = function ($var)

;

在定義乙個匿名函式時實際就是定義了乙個closure類的例項化物件, 這個類中有三個final的方法:

closure
類中的建構函式用於禁止例項化, 另外兩個方法bind和bindto:

closure::bind — 複製乙個閉包,繫結指定的$this物件和類作用域。

closure::bindto —複製當前閉包物件,繫結指定的$this物件和類作用域。

函式定義:

public

static closure bind (closure $closure , object $newthis [

, mixed $newscope =

'static'

]public closure bindto (object $newthis [

, mixed $newscope =

'static'

])

函式返回值:

成功則返回新的closure物件失敗則返回false

區別:

bind是靜態方法使用::呼叫,而bindto使用->呼叫。

bind接受三個引數,分別為匿名函式、要繫結類的例項化物件、類的作用域。bindto只接受兩個引數,分別為要繫結類的例項化物件、類的作用域。

除了上訴兩點區別外,在實際測試中他們所實現的最終效果都是一樣的。暫未發現其他不同。

了解了基本情況後,那麼問題來了。bind和bindto有啥用? 你可以簡單的理解為,不通過例項化物件就可以直接訪問到乙個物件內的成員,甚至是私有許可權的成員。

舉例:

class

test

}// 案例一:通過建立匿名函式, 不例項化類就訪問類中的公有成員。

$func =

function()

;$return

= $func::

bind

($func,

new test)

;$return

= closure::

bind

($func,

new test)

;//因為bind是靜態方法,所以這樣也行

$return

= $func-

>

bindto

(new test)

;echo $return()

;//執行函式,輸出ahi

// 案例二:通過建立匿名函式,不例項化類就訪問類中的公有成員和私有成員和靜態成員

$func =

function()

;$return

= $func::

bind

($func,

new test,

'test');

$return

= $func-

>

bindto

(new test,

'test');

$return

= closure::

bind

($func,

new test,

'test');

// 下面這樣也行

$return

= $func::

bind

($func,

new test,test::

class);

$return

= $func-

>

bindto

(new test,test::

class);

$return

= closure::

bind

($func,

new test,test::

class);

echo $return()

;//輸出bcahi

使用總結:

bind和bindto的使用最終效果都一樣,只是所接受的引數以及方法型別不一樣(bind是靜態方法)。

使用bind方法,第乙個引數為匿名函式,第二個引數為繫結類的例項化。第三個引數為類的作用域,預設為』static』即保持當前作用域。如果將第三個引數設為預設引數static, 則只能訪問類中的公有方法, 即函式內部只能使用$this。除非將第三個引數宣告為繫結類, 則可以訪問類中的私有方法、靜態成員,即函式內部可以使用$this、self。若將第三個引數設為null,相當於轉殖了這個類,建議直接使用clone轉殖類而不使用此方法來實現轉殖。

使用bindto方法,第乙個引數為繫結類的例項化。第二個引數為類的作用域,預設為』static』即保持當前作用域。如果將第二個引數設為預設引數static, 則只能訪問類中的公有方法, 即函式內部只能使用$this。除非將第二個引數宣告為繫結類, 則可以訪問類中的私有方法、靜態成員,即函式內部可以使用$this、self。若將第二個引數設為null,相當於轉殖了這個類,建議直接使用clone轉殖類而不使用此方法來實現轉殖。

注意繫結只是獲取類中的成員值,而不能通過繫結來直接更改值。

php7中在closure類中新增了call方法,比使用bind或bindto更加方便快捷:

class

test

}$func =

function()

;// php7之前繫結, 返回新的closure類,並使用echo輸出

$return

= $func::

bind

($func,

new test,

'test');

$return

= $func-

>

bindto

(new test,

'test');

echo $return()

;//輸出bcahi

// php7後,使用call直接輸出, 且作用域預設就在類

echo $func-

>

call

(new test)

;//輸出bcahi

匿名函式與內建函式

lambda python允許使用lambda關鍵字創造匿名函式 匿名是因為不需要一標準的def方式來宣告 乙個完整的lambda 語句 代表了乙個表示式,這個表示式的定義必須和宣告放在同一行 a lambda x,y x y print a 2,3 5 filter filter func,seq...

php匿名函式和閉包

在談閉包之前,先說一下匿名函式,匿名函式實際上相當於把函式當做變數,不需要專門去定義乙個函式。在匿名函式出現之前,如果想把函式當做變數傳遞,得用字串的形式,如下 anonymous function function normal function testanonymous func testan...

PHP 核心特性之匿名函式

提出 在匿名函式出現之前,所有的函式都需要先命名才能使用 function increment value array map increment 1,2,3 有的時候函式可能只需要使用一次,這時候使用匿名函式會使得 更加簡潔直觀,同時也避免了函式在其他地方被使用 array map functio...