2016-11-28 3 views
2

У меня есть несколько файлов php для включения, и они должны действовать как функция в защищенной области. Закрытие предназначено для их загрузки (включения) и выполнения. Хотя я сталкиваюсь с каким-то странным влиянием на кодирование этих закрытий. Все файлы php заканчиваются оператором return.закрытие с включенным внутри

function myClosure() { 
    include 'file.php'; 
    return $closure;   // initialized in file.php 
}; 
$func = myClosure(); 
echo $func('1');    // echoes '2' 
echo $func('4');    // echoes '8' 

где file.php что-то вроде

<?php 
$closure = function($a) { 
    $b = $a + $a; 
    return $b; 
}; 
?> 

Это работает. Тем не менее, я хотел бы иметь функцию закрытия закрытия ($ b) '(без «возврата») в основном коде, а не во внешний файл. К сожалению, следующий не работает, как ожидалось:

function myClosure() { 
    $closure = function($a) { 
     include 'file.php'; 
    }; 
    return $closure; 
}; 
$func = myClosure(); 
echo $func('1');    // echoes null 
echo $func('4');    // echoes null 

где file.php что-то вроде

<php 
$b = $a + $a; 
return $b; 
?> 

, изменяющий включает в include_once дает то же самое для первого примера, а не для второго Пример: второе эхо не запускается. Я подозреваю, что это поведение является либо ошибкой (php 5), либо из-за незаконного трюка с include. Может быть, «возврат в коде привязан к их контексту? Буду признателен за помощь, будь то урок по чистому кодированию, будь то правильный трюк.

+0

Вы не возвращаетесь в закрытие. 'include 'file.php'' будет переводить, как вы сказали, в' ... return $ b', однако '$ clos = function ...' также имеет область действия, поэтому' return $ clos' будет фактически возвращаться null, так как это значение по умолчанию, которое дает PHP. Короче говоря, просто сделайте 'return include 'file.php'' внутри' myClosure'. – Andrew

ответ

0

Поскольку замыкания ограничены (как уже указывалось OP), вам нужно будет return внутри myClosure.

Теперь у вас есть:

function myClosure() { 
    $closure = function($a) { 
     include 'file.php'; 
    }; 
    return $closure; 
}; 

Просто измените его:

function myClosure() { 
    $closure = function($a) { 
     return include 'file.php'; 
    }; 
    return $closure; 
}; 

Вы должны получить что-то вдоль линий:

int(2) int(4) 

при условии, что вы поддерживаете

$func = myClosure(); 
var_dump($func('1')); 
var_dump($func('2')); 
+0

Я согласен и чувствую себя немного глупым, чтобы забыть об этом. Ваш пример работает с курса. Может быть, я был слишком сфокусирован на том, что «include_once», который работает в первом примере, и НЕ во втором. Мне кажется, что каждый вызов снова загрузит файл. Моя проблема возникает, чем, как избежать загрузки внешнего php-файла при каждом вызове закрытия? Я имею в виду, что голый «включить» таким образом небезопасен. –

+0

Welp, вы действительно не можете. Это цель самого включения. И поскольку вы используете закрытие, вы на самом деле ** хотите ** его включать его каждый раз, так как он ограничен. Хорошо, честно говоря, я не уверен, чего вы пытаетесь достичь здесь, но 'include' всегда беспорядочен. Возможно, если вы спросите: «Я хочу это сделать. Это лучший способ?» было бы лучше, чем вы сейчас просите. Просто мысль. – Andrew

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