Closure::bind

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Closure::bind Belli bir bağlı nesne ve sınıf bağlamıyla bir closure nesnesini kopyalar.

Açıklama

public static Closure::bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure

Bu yöntem Closure::bindTo() yönteminin statik sürümüdür. Daha fazla bilgi için bu yöntemin belgesine bakınız.

Bağımsız Değişkenler

closure

Bağlanacak anonim işlevin adı.

newThis

Anonim işleve bağlaması için verilen nesne ya da bağın kaldırılması için null.

newScope

İlişkili closure'un ilişkilendirileceği sınıf bağlamı ya da ilişkili olanı tutmak için 'static'. Bir nesne belirtilirse bu nesnenin sınıfı geçerli olur. Bu, bağlı nesnenin protected ve private yöntemlerinin görünürlüğünü saptamaya yarar. Bu bağımsız değişkende dahili bir sınıfı (nesnesini) aktarmaya izin verilmez.

Dönen Değerler

Yeni Closure nesnesi ile döner, başarısızlık durumunda null döner.

Örnekler

Örnek 1 - Closure::bind() örneği

<?php
class A {
private static
$sfoo = 1;
private
$ifoo = 2;
}
$cl1 = static function() {
return
A::$sfoo;
};
$cl2 = function() {
return
$this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo
$bcl1(), "\n";
echo
$bcl2(), "\n";
?>

Yukarıdaki örnek şuna benzer bir çıktı üretir:

1
2

Ayrıca Bakınız

add a note

User Contributed Notes 2 notes

up
96
Vincius Krolow
11 years ago
With this class and method, it's possible to do nice things, like add methods on the fly to an object.

MetaTrait.php
<?php
trait MetaTrait
{

private
$methods = array();

public function
addMethod($methodName, $methodCallable)
{
if (!
is_callable($methodCallable)) {
throw new
InvalidArgumentException('Second param must be callable');
}
$this->methods[$methodName] = Closure::bind($methodCallable, $this, get_class());
}

public function
__call($methodName, array $args)
{
if (isset(
$this->methods[$methodName])) {
return
call_user_func_array($this->methods[$methodName], $args);
}

throw
RunTimeException('There is no method with the given name to call');
}

}
?>

test.php
<?php
require 'MetaTrait.php';

class
HackThursday {
use
MetaTrait;

private
$dayOfWeek = 'Thursday';

}

$test = new HackThursday();
$test->addMethod('when', function () {
return
$this->dayOfWeek;
});

echo
$test->when();

?>
up
9
potherca at hotmail dot com
9 years ago
If you need to validate whether or not a closure can be bound to a PHP object, you will have to resort to using reflection.

<?php

/**
* @param \Closure $callable
*
* @return bool
*/
function isBindable(\Closure $callable)
{
$bindable = false;

$reflectionFunction = new \ReflectionFunction($callable);
if (
$reflectionFunction->getClosureScopeClass() === null
|| $reflectionFunction->getClosureThis() !== null
) {
$bindable = true;
}

return
$bindable;
}
?>
To Top