Как передать ambit / scope функции в php? - PullRequest
0 голосов
/ 16 мая 2018

Функция myA класса A вызывает функцию myB класса B, которая выполняет импорт:

class A
{
  function myA()
  {
    // ambit variables of myA and class B here like:
    // $foo = "bar";
    // ...

    $B = new B();
    $B->myB();
  }
}

class B
{
  function myB()
  {
    // ambit variables of myB and class B here like:
    // $hello = "there";
    // ...

    return include("file.php");
  }
}

То, что я хочу, это то, что когда импорт выполняется, ambit/ область видимости класса A и функция myA учитываются для импортируемого скрипта вместо рамок / области действия класса B и функции myB, тогда PHP-код file.php может знать о переменной$foo функции myA.

Как мне это сделать?

Спасибо!

1 Ответ

0 голосов
/ 21 мая 2018

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

class A
{
  function myA()
  {
    // ambit variables of myA and class B here like:
    $foo = "bar";
    $myLocalVars = ['foo' => $bar];

    $B = new B();
    $B->myB($this, $myLocalVars);
  }
}

class B
{
  function myB($classAmbit, $localVars)
  {
    $closure = function () use ($localVars)
    {
      // With extract any local var from caller's ambit is now accesible here
      extract($localVars);

      return include("file.php");
    }

    // With Closure::bind, the $this from caller is now accesible in the closure,
    // also any of their members, i.e protected, private and public members
    $closureBinded = Closure::bind ($closure, $classAmbit, get_class($classAmbit));

    return $closureBinded();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...