PHP 5.6.0 released

Closure::bindTo

(PHP 5 >= 5.4.0)

Closure::bindTo Duplica la closure con una nuova associazione all'oggetto e alla visibilità della classe

Descrizione

public Closure Closure::bindTo ( object $newthis [, mixed $newscope = 'static' ] )

Crea e restituisce una nuova funzione anonima come questa con lo stesso corpo e con le stesse variabili associate, ma possibilmente con un altro oggetto associato e una nuova visibilità della classe.

“L'oggetto associato” determina il valore che avrà $this nel corpo della funzione e nella “visibilità della classe” e scope represents a class which determines which private and protected members the anonymous function will be able to access. Namely, the members that will be visible are the same as if the anonymous function were a method of the class given as value of the newscope parameter.

Le closures statiche non possono avere nessun oggetto associato (il valore del parametro newthis deve essere NULL), ma questa funzione può comunque essere utilizzata per cambiare la loro visibilità..

This function will ensure that for a non-static closure, having a bound instance will imply being scoped and vice-versa. To this end, non-static closures that are given a scope but a NULL instance are made static and non-static non-scoped closures that are given a non-null instance are scoped to an unspecified class.

Nota:

Se hai soltanto intenzione di duplicare la funzione anonima, invece puoi usare la clonazione.

Elenco dei parametri

newthis

The object to which the given anonymous function should be bound, or NULL for the closure to be unbound.

newscope

The class scope to which associate the closure is to be associated, or 'static' to keep the current one. If an object is given, the type of the object will be used instead. This determines the visibility of protected and private methods of the bound object.

Valori restituiti

Restituisce un nuovo oggetto Closure creato. o FALSE in caso di fallimento

Esempi

Example #1 Esempio di Closure::bindTo()

<?php

class {
    function 
__construct($val) {
        
$this->val $val;
    }
    function 
getClosure() {
        
//restituisce la closure associata con il suo oggetto e con la sua visibilità
        
return function() { return $this->val; };
    }
}

$ob1 = new A(1);
$ob2 = new A(2);

$cl $ob1->getClosure();
echo 
$cl(), "\n";
$cl $cl->bindTo($ob2);
echo 
$cl(), "\n";
?>

Il precedente esempio visualizzerà qualcosa simile a:

1
2

Vedere anche:

add a note add a note

User Contributed Notes 4 notes

up
5
tatarynowicz at gmail dot com
1 year ago
You can do pretty Javascript-like things with objects using closure binding:

<?php
trait DynamicDefinition
{
   
    public function
__call($name, $args) {
        if (
is_callable($this->$name)) {
            return
call_user_func($this->$name, $args);
        }
        else {
            throw new \
RuntimeException("Method {$name} does not exist");
        }
    }
   
    public function
__set($name, $value) {
       
$this->$name = is_callable($value)?
           
$value->bindTo($this, $this):
           
$value;
    }
}

class
Foo {
    use
DynamicDefinition;
    private
$privateValue = 'I am private';
}

$foo = new Foo;
$foo->bar = function() {
    return
$this->privateValue;
};

// prints 'I am private'
print $foo->bar();

?>
up
8
safakozpinar at gmail dot com
2 years ago
Private/protected members are accessible if you set the "newscope" argument (as the manual says).

<?php
$fn
= function(){
    return ++
$this->foo; // increase the value
};

class
Bar{
    private
$foo = 1; // initial value
}

$bar = new Bar();

$fn1 = $fn->bindTo($bar, 'Bar'); // specify class name
$fn2 = $fn->bindTo($bar$bar); // or object

echo $fn1(); // 2
echo $fn2(); // 3
up
2
amica at php-resource dot de
2 years ago
With rebindable $this at hand it's possible to do evil stuff:

<?php
   
class A {
        private
$a = 12;
        private function
getA () {
            return
$this->a;
        }
    }
    class
B {
        private
$b = 34;
        private function
getB () {
            return
$this->b;
        }
    }
   
$a = new A();
   
$b = new B();
   
$c = function () {
        if (
property_exists($this, "a") && method_exists($this, "getA")) {
           
$this->a++;
            return
$this->getA();
        }
        if (
property_exists($this, "b") && method_exists($this, "getB")) {
           
$this->b++;
            return
$this->getB();
        }
    };
   
$ca = $c->bindTo($a, $a);
   
$cb = $c->bindTo($b, $b);
    echo
$ca(), "\n"; // => 13
   
echo $cb(), "\n"; // => 35
?>
up
-7
anthony bishopric
2 years ago
Closures can rebind their $this variable, but private/protected methods and functions of $this are not accessible to the closures.

<?php
$fn
= function(){
    return
$this->foo;
};

class
Bar{
    private
$foo = 3;
}

$bar = new Bar();

$fn = $fn->bindTo($bar);

echo
$fn(); // Fatal error: Cannot access private property Bar::$foo
To Top