我花了很多时间学习javascript。现在我来到php世界,当我开始在php中学习OOP时,我觉得有点迷失。在javascript中我可以绑定/应用/调用外部函数来做一些具体的如何在PHP中管理这种行为?这里我有简单的javascript代码,它使用apply方法。我怎么能用php做同样的事情。我知道类的声明是不同的。变量可见性也在那里。我只想要要知道有没有办法模仿php中的绑定/应用/调用功能?
js代码位于::
之下function Person(name,haircolor){
this.name=name;
this.haircolor=haircolor;
}
function display(){
console.log(this.name+' has '+this.haircolor+' hair.');
}
var person1=new Person('zami','black');
display.apply(person1);
答案 0 :(得分:4)
调用时绑定是一种非常特殊于Javascript的特性(不仅仅是,但在很大程度上)。大多数其他语言在此之前绑定对象上下文,这是不可逆转的。您在PHP中可以做的最好的事情显示在the manual for the Closure
class,匿名函数的内部实现:
class A {
function __construct($val) {
$this->val = $val;
}
function getClosure() {
//returns closure bound to this object and scope
return function() { return $this->val; };
}
}
$ob1 = new A(1);
$ob2 = new A(2);
$cl = $ob1->getClosure();
echo $cl(); // 1
$cl = $cl->bindTo($ob2);
echo $cl(); // 2
无法将函数/闭包绑定到任意对象;最多可以将它绑定到它所引用的同一个类的其他实例。也可以通过ReflectionMethod::invoke
执行此操作。但同样,它真的不是PHP(和大多数传统的OOP语言)的工作方式,你不应该以这种方式编写代码而不是好奇。
this
和$this
只是另一个变量。他们唯一做的就是隐式携带状态而不需要将它们传递给你调用的所有函数。在PHP中,它进一步有助于封装,因为$this
可以具有无法从类外部访问的值;这甚至不是Javascript的情况。因此,没有真正的需要以这种方式编程。您可以使用(理论上的)$foo->bar->apply($baz)
表达的任何内容,您也可以写为$foo->bar($baz)
或bar($baz)
。