CakeFest 2024: The Official CakePHP Conference

Closure::bind

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

Closure::bind Dupliziert eine Closure mit einem bestimmten gebundenen Objekt und Geltungsbereich einer Klasse

Beschreibung

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

Diese Methode ist die statische Version von Closure::bindTo(). Siehe die Dokumentation zu dieser Methode für weitere Informationen.

Parameter-Liste

closure

Die anonymen Funktionen, die gebunden werden sollen.

newThis

Das Objekt, an das die angegebene anonyme Funktion gebunden werden soll, oder null wenn die Closure nicht gebunden werden soll.

newScope

Der Geltungsbereich der Klasse, dem die Closure zugeordnet werden soll, oder 'static', um den aktuellen Bereich beizubehalten. Wenn ein Objekt angegeben wird, wird stattdessen der Typ des Objekts verwendet. Dieser bestimmt die Sichtbarkeit der protected und private Methoden des gebundenen Objekts. Es ist nicht erlaubt, eine interne Klasse (oder ein Objekt einer solchen) als Parameter zu übergeben.

Rückgabewerte

Gibt ein neues Closure-Objekt zurück oder null, wenn ein Fehler auftritt.

Beispiele

Beispiel #1 Closure::bind()-Beispiel

<?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";
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

1
2

Siehe auch

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