Как определить локальные функции в PHP? - PullRequest
7 голосов
/ 19 сентября 2011

Когда я пытаюсь сделать это:

function a()
{
    function b() { }
}

a();
a();

Я получаю Cannot redeclare b....
Когда я пытаюсь сделать это:

function a()
{
    if(!isset(b))
        function b() { }
}

a();
a();

Я получаю unexpected ), expected ....
Как я могу объявить функцию как локальную и о которой забыть, когда вернется a?Мне нужна функция, чтобы передать ее array_filter.

Ответы [ 4 ]

8 голосов
/ 19 сентября 2011

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

6 голосов
/ 06 декабря 2014

Идея «локальной функции» также называется «функция внутри функции» или « вложенная функция » ... Подсказка была на этой странице, анонимная функция , на которую ссылаются @ceejayoz и @Nexerus, но давайте объясним!

  1. В PHP существует только глобальная область для объявлений функций ;
  2. Единственная альтернатива - это использовать другой тип функции, анонимный один.

Объяснение на примерах:

  1. функция b() в function a(){ function b() {} return b(); } также является глобальной, поэтому объявление имеет тот же эффект, что и function a(){ return b(); } function b() {}.

  2. Чтобы объявить что-то вроде «функции b () в области действия a ()», единственной альтернативой является использование не b(), а ссылки $b(). Синтаксис будет примерно таким: function a(){ $b = function() { }; return $b(); }

PS: в PHP невозможно объявить «статическую ссылку», анонимная функция никогда не будет статической .

Смотри также:

3 голосов
/ 19 сентября 2011

Вы можете попробовать функцию create_function, которую имеет PHP.http://php.net/create_function

$myfunc = create_function(..., ...);
array_filter(..., $myfunc(...));
unset($myfunc);

Этот метод не требует PHP 5.3 +

0 голосов
/ 19 мая 2015

Вы можете определить локальную функцию в PHP, но вы можете объявить ее только один раз. Это может быть достигнуто путем определения и сравнения статической переменной.

Проверьте следующий пример:

<?php
function a()
{
  static $init = true;
  if ($init) {
    function b() { }
    $init = FALSE;
  }
}

a();
a();

В качестве альтернативы, проверяя, существует ли уже функция:

<?php
function a()
{
  if (!function_exists('b')) {
     function b() { }
  }
}

a();
a();
...