Можно ли использовать переменную при определении имени функции PHP? - PullRequest
1 голос
/ 09 ноября 2010

Я создал CMS для нашей компании, которая имеет огромное количество функций, многие из которых связаны с конкретными функциями, которые не используются на большинстве сайтов, для которых мы используем CMS.Моя цель, поэтому, состоит в том, чтобы включать скрипт функции только тогда, когда она необходима (когда функция вызывается).

Сейчас я просто вызываю каждую функцию как обычно, требуя файл, в котором находится фактическийнаходится сценарий функции, а затем вызывается вторая функция (то же имя, что и у функции, но с префиксом подчеркивания), которая содержит фактический сценарий функции.Например:

function foo($a,$b) {
    require_once "funtions-foo.php";
    return _foo($a,$b);
}

Это, однако, кажется мне немного повторяющимся.То, что я ищу, - это способ «перехватить» вызов функции, и, если его имя находится в массиве «включенных» функций, я включу правильный файл и вызову функцию.Например:

catch_function_call($function,$arg1,$arg2) {
    $array = array(
        'foo' => 'functions-foo.php',
        'bar' => 'functions-bar.php'
    );
    if($array[$function]) {
        require_once $array[$function];
        return $function($arg1,$arg2);
    }
}

Здесь я предполагаю, что функция 'catch_function_call' может каким-то образом перехватывать при вызове функции.Однако, поскольку я не знаю такой функции, моей второй мыслью было просто определить каждую из «включенных» функций с помощью переменных.Например:

$array = array(
    'foo' => 'functions-foo.php',
    'bar' => 'functions-bar.php'
);
foreach($array as $function => $file) {
    function $function($arg1,$arg2) {
        $_function = "_".$function;
        require_once $file;
        return $_function($arg1,$arg2);

    }
}

Конечно, это дает мне ошибку, поскольку я, очевидно, не могу использовать переменную в имени функции при ее определении.Любые мысли о том, как обойти это или другие решения для включения только функции, когда это необходимо?

Ответы [ 5 ]

1 голос
/ 09 ноября 2010

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

Однако это невозможно сделать в глобальном функциональном пространстве.

0 голосов
/ 09 ноября 2010

Почему включение всех файлов является такой большой проблемой?Поскольку вы, вероятно, используете APC, доступ к тяжелой файловой системе не будет проблемой.И, кроме того, поиск в хэш-таблице функций, очевидно, медленнее, если есть больше функций, но, тем не менее, это, безусловно, не будет узким местом вашего приложения.

0 голосов
/ 09 ноября 2010

Рассматривали ли вы группирование своих функций в наборы и сохранение их как статических методов в объектах.Затем вы можете использовать функцию __autoload () и перестать беспокоиться о том, когда включать.

Итак:

class Rarely_Used{

  static function foo(){}
  static function bar(){}
}

class Only_for_Managers{
  static function ohboy(){}
  static function punish(){}
}
0 голосов
/ 09 ноября 2010

Просто используйте include_once перед каждой необходимой функцией?

0 голосов
/ 09 ноября 2010

Может ли это помочь: http://php.net/manual/en/function.create-function.php?Или, может быть, превратить дизайн в ОО и использовать __call().

...