PHPKonf Istanbul PHP Conference 2019 - Call for Papers

Closure::bind

(PHP 5 >= 5.4.0, PHP 7)

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

Açıklama

public static Closure Closure::bind ( Closure $işlev , object $yeninesne [, mixed $yenibağlam = "static" ] )

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

Değiştirgeler

işlev

Bağlanacak anonim işlevin adı.

yeninesne

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

yenibağlam

İ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 değiştirgede dahili bir sınıfı (nesnesini) aktarmaya izin verilmez.

Dönen Değerler

Yeni bir Closure nesnesi döner başarısızlık durumunda FALSE döner

Sürüm Bilgisi

Sürüm: Açıklama
7.0.0 yenibağlam ile artık dahili bir sınıf (nesne) belirtilemiyor, evvelce yapılabiliyordu.

Örnekler

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

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

$bcl1 Closure::bind($cl1null'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 add a note

User Contributed Notes 2 notes

up
77
Vincius Krolow
6 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
4
potherca at hotmail dot com
4 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