2015-08-13 2 views
2

У меня возникла проблема с вызовом анонимного метода в другом анонимном методе.Один анонимный вызов метода другим методом в php

<?php 
    $x = function($a) 
    { 
     return $a; 
    }; 
    $y = function() 
    { 
     $b = $x("hello world a"); 
     echo $b; 
    }; 
    $y(); 
?> 

Ошибка:

Notice: Undefined variable: x in C:\xampp\htdocs\tsta.php on line 7

Fatal error: Function name must be a string in C:\xampp\htdocs\tsta.php on line 7

ответ

4

Добавить use к вашей $y функции, то объем $y функции будет видеть $x переменную:

$y = function() use ($x){ 
    $b = $x("hello world a"); 
    echo $b; 
}; 
+0

Спасибо @arbogast, но если в $ y возвращается несколько нет. массивов, но я хочу получить доступ только к определенному массиву, как это сделать? например: var_dump ($ y); и вывод: object (Closure) # 3 (2) {["static"] => array (3) {["a"] => & array (2) {["foc"] => int (2), ["roc"] => int (4)} ["c"] => & array (2) {["foc"] => int (2), ["roc"] => int (4)} [ a "] => & array (2) {[" foc "] => int (2), [" roc "] => int (4)} i доступ к массиву 'b' в моем случае. Надеюсь, ты поймешь. Спасибо – Albertestein

+0

@Albertestein Я не совсем понимаю вас. В вашем примере функция $ y ничего не возвращает, нет оператора return, поэтому он возвращает NULL по умолчанию. – arbogastes

+0

К сожалению, у меня есть некоторые изменения в коде, я упоминаю это. array (1) {["x"] => объект (закрытие) # 1 (2) {["static"] => массив (1) {["arr"] => array (6) {[0] => int (1) [1] => int (2) [2] => int (3) [3] => int (4) [4] => int (5) [5] => int (6)}} ["parameter"] => array (1) {["$ a"] => string (10) ""}}} } ... – Albertestein

-1

Вы должны использовать анонимные функции в одном блоке.

<?php 

$y = function(){ 
    $x = function($a){ 
     return $a; 
    }; 
    $b = $x("hello world a"); 
    echo $b; 
}; 
$y(); 

Удачи !!

0

Ответы на ответы @argobast и @ hiren-raiyani действительны. Самый общий - первый, но последний более подходит, если единственным потребителем первой анонимной функции является второй (т. Е. $ X используется только $ y).

Другой вариант (это изменение подписи функции $ y) - это передать анон. функции в качестве аргумента функции:

<?php 

$x = function($a) 
{ 
    return $a; 
}; 

$y = function(Closure $x) 
{ 
    $b = $x('hello world a'); 
    echo $b; 
}; 

$y($x); 

Такого рода «инъекции зависимостей» кажется немного чист меня, вместо того, чтобы иметь скрытую зависимость от $ х с «использованием», но выбор за вами ,

Смежные вопросы