匿名函式,即乙個沒有函式名稱的函式。
$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...