Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将“$this”绑定到PHP函数?_Php_Oop_Closures - Fatal编程技术网

如何将“$this”绑定到PHP函数?

如何将“$this”绑定到PHP函数?,php,oop,closures,Php,Oop,Closures,对于JavaScript,我们可以这样做将作用域绑定到所需函数: function myFunction() { alert(this.foo); } var MyClass = function() { this.foo = 1; }; var c = new MyClass(); myFunction.call(c); // `1` 我想用PHP做同样的事情。目前,我看到的成功工作是这样的,但这只适用于匿名函数: $my_function = function() {

对于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)();

// Or…
// $my_function->call($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']); // :(
如果您遵循,则会变成:

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

class MyClass {
  public $foo = 1;
}

$c = new MyClass();
$f = Closure::bind($my_function, $c);
$f();
如果您遵循,则会变成:

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

class MyClass {
  public $foo = 1;
}

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

如果您使用的是PHP7.1+,则可以使用将任何可调用的PHP转换为
闭包
(有关差异的一些信息,请参阅):

此时,您可以将对象实例添加到其中并执行:

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

请参见

如果您使用的是PHP7.1+,则可以使用将任何可调用的PHP转换为
闭包
(有关差异的一些信息,请参见):

此时,您可以将对象实例添加到其中并执行:

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

参见

这可能有点离题,但问这样一个问题似乎合乎逻辑:为什么要尝试做同样的事情?PHP不是Javascript(对此我很高兴),你的问题没有多大意义。可能是因为你有问题X,你认为你可以用JavaScript解决方案Y来解决,但你不知道如何用PHP解决。这不起作用,因为Javascript!==PHP。那么,问一个X而不是Y的解决方案怎么样?@KIKOSoftware@steros所以我尝试在(比如)WordPress中创建一个PHP钩子函数,但是它总是缺少函数调用中的
这个
范围,除非我在函数参数中定义了它。我认为这更像是一种API风格,希望能够使用常见的OOP方法实现。当然,对于这样的事情。这可能有点离题,但问这样一个问题似乎是合乎逻辑的:为什么要尝试做同样的事情?PHP不是Javascript(对此我很高兴),你的问题没有多大意义。可能是因为你有问题X,你认为你可以用JavaScript解决方案Y来解决,但你不知道如何用PHP解决。这不起作用,因为Javascript!==PHP。那么,问一个X而不是Y的解决方案怎么样?@KIKOSoftware@steros所以我尝试在(比如)WordPress中创建一个PHP钩子函数,但是它总是缺少函数调用中的
这个
范围,除非我在函数参数中定义了它。我认为这更像是一种API风格,希望能够使用常见的OOP方法实现。当然,对于类似的事情。谢谢。它甚至可以在不检查输入是闭包还是函数的情况下使用匿名函数<代码>结束::fromCallable($my_函数)
谢谢。它甚至可以在不检查输入是闭包还是函数的情况下使用匿名函数<代码>闭包::fromCallable($my\u函数)