Как связать `$ this` с функцией PHP? - PullRequest
0 голосов
/ 08 октября 2018

Что касается JavaScript, мы можем сделать что-то вроде этого, чтобы привязать область к желаемой функции:

function myFunction() {
    alert(this.foo);
}

var MyClass = function() {
    this.foo = 1;
};

var c = new MyClass();
myFunction.call(c); // `1`

Я хочу сделать то же самое, используя PHP.В настоящее время я вижу успешную работу, подобную этой, но это относится только к анонимным функциям:

$my_function = function() {
    var_dump($this->foo);
};

class MyClass {
    public $foo = 1;
};

$c = new MyClass();
Closure::bind($my_function, $c)();

Это не работает:

function my_function() {
    var_dump($this->foo);
}

class MyClass {
    public $foo = 1;
};

$c = new MyClass();
Closure::bind('my_function', $c)(); // :(
call_user_func([$c, 'my_function']); // :(

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Если вы используете PHP 7.1+, вы можете преобразовать любой вызываемый PHP в Closure, используя Closure::fromCallable (см. PHP: подсказка типа - разница между `Closure` и`Вызывается ` для получения некоторой информации о разнице):

$closure = Closure::fromCallable('my_function');

, в этот момент вы можете bind создать экземпляр вашего объекта и выполнить:

Closure::bind($closure, $c)();

См. https://3v4l.org/aEnSI

0 голосов
/ 08 октября 2018

Вы были близки.

Используя ваш код:

$my_function = function() {
     var_dump($this->foo);
};

class MyClass {
   public $foo = 1;
}

$c = new MyClass();

$bound =  Closure::bind($my_function, $c);

$bound();

Но нет необходимости использовать bind() статический метод.$my_function уже является callable, поэтому вы можете сделать это напрямую:

$bound = $my_function->bindTo($c);
$bound()

Вы можете увидеть обе версии, работающие здесь .

0 голосов
/ 08 октября 2018

Если вы следуете за документами , это становится:

<?php
$my_function = function() {
  var_dump($this->foo);
};

class MyClass {
  public $foo = 1;
}

$c = new MyClass();
$f = Closure::bind($my_function, $c);
$f();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...