как привязать это к внешней функции в php

0

Я потратил много времени на изучение 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);
  • 0
    Реализация JS - это что-то необычное, что должно жить только там и не должно быть перенесено на другие языки. Кодирование идиоматически означает, что вы кодируете, используя идиомы языка, который вы используете. PS: к счастью это невозможно сделать в php
  • 1
    что такого удачного в этом, если это невозможно ??
Показать ещё 6 комментариев
Теги:

1 ответ

4
Лучший ответ

Связывание времени звонка - особенность, очень специфичная для 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).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню