Я потратил много времени на изучение javascript. Теперь я пришел в мир php и почувствовал себя потерянным вначале, когда начал изучать ООП в php. В javascript я могу привязывать/применять/вызывать внешние функции для выполнения определенной работы. я могу управлять этим поведением в php? Здесь у меня есть простой код javascript, который использует метод apply. Как я могу сделать то же самое, используя php.I знаю, что объявление класса отличается. И переменная видимость тоже есть. Я просто хочу знать, есть ли способ имитировать функцию bind/apply/call в 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);
Связывание времени звонка - особенность, очень специфичная для Javascript (не исключительно, но в значительной степени). Большинство других языков связывают контекст объекта до этого, необратимо. Лучшее, что вы можете сделать в PHP, показано в руководстве для класса Closure
, внутренней реализации для анонимных функций:
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 (и большинство традиционных языков ООП), и вы никогда не должны писать код таким образом для целей, кроме любопытства.
this
и $this
просто другая переменная. Единственное, что они делают, это неявно переносить состояние без необходимости передавать их во все функции, которые вы вызываете. В PHP он также способствует инкапсуляции, поскольку $this
может иметь значения, недоступные извне класса; что даже не с Javascript. Таким образом, нет реальной необходимости программировать таким образом. Все, что вы можете выразить с помощью (теоретического) $foo->bar->apply($baz)
, можно просто написать как $foo->bar($baz)
или bar($baz)
.