требовать / включать в переменную

#php

#php

Вопрос:

Я хочу запросить / включить файл и извлечь его содержимое в переменную.

test.php

 <?php
echo "seconds passed since 01-01-1970 00:00 GMT is ".time();
?>
  

index.php

 <?php
$test=require("test.php");
echo "the content of test.php is:<hr>".$test;
?>
  

Нравится file_get_contents() , но тогда он все равно должен выполнять PHP-код.
Возможно ли это?

Комментарии:

1. Возможно, но я думаю, вы захотите спросить себя (или нас, если необходимо), зачем вам это нужно, и нет ли другого способа. Вы могли бы делать всевозможные вещи (например, выполнять это с помощью exec или php yourfile.php , а затем извлекать результаты), но могли бы быть лучшие способы фактически решить вашу первоначальную проблему…

2. это просто оказалось удобным в моей ситуации. Вероятно, будет лучший способ, но мне еще предстоит его изучить. На данный момент достаточно даже просто знать о возможности, поскольку это расширяет мои знания.

3. @user746379, В вашем включенном файле просто сделайте return 'value'; . Это сработает.

Ответ №1:

Если ваш включенный файл вернул переменную…

include.php

 <?php
return 'abc';
  

…затем вы можете присвоить это переменной примерно так…

 $abc = include 'include.php';
  

В противном случае используйте буферизацию вывода.

 ob_start();
include 'include.php';
$buffer = ob_get_clean();
  

Комментарии:

1. Почему бы не использовать ob_get_clean() для получения содержимого и остановки буферизации сразу?

2. @Slava Приветствую, код был из памяти, думаю, мне нужно еще раз взглянуть на документы 🙂

3. А, ладно. Я думал, что за этим стоит что-то, чего я не знал :).

4. Хороший ответ! Я забыл о plain return в файле php.

5. Использовать return во включаемом файле просто после присвоения значения включения переменной, для меня это лучшее решение!

Ответ №2:

У меня тоже однажды была эта проблема, попробуйте что-то вроде

 <?php
function requireToVar($file){
    ob_start();
    require($file);
    return ob_get_clean();
}
$test=requireToVar($test);
?>
  

Комментарии:

1. Неправильно! ob_start() включает буферизацию вывода, ob_clean() — просто очищает буфер и оставляет буферизацию вывода включенной, что неправильно! Чтобы отключить это, используйте ob_end_clean() вместо ob_clean() . В качестве альтернативы вы можете использовать ob_get_clean() вместо обоих ob_get_contents() и ob_end_clean() . Таким образом, тело функции будет выглядеть следующим образом ob_start(); require $file; return ob_get_clean(); .

2. Также полезно знать: ob_start можно наращивать, поэтому этот метод совершенно безопасен для использования в коде, который уже находился внутри буферизованного выходного блока.

3. Также require не является функцией, поэтому скобки там избыточны.

4. Но что, если я все еще пытаюсь получить доступ к переменной? Допустим test.php имел бы сверхсложные алгоритмы, требующие большого количества вычислений. Мне нужно содержимое этого файла в моей переменной, как показано, но также я хочу получить доступ к переменным, которые создаются в моей test.php . Это означает, что сначала я должен выполнить ваш requireToVar($ifle) , а затем также включить файл как обычно, что приводит к удвоенному выполнению моего кода.

Ответ №3:

Вы можете записать во включенный файл:

 <?php
    return 'seconds etc.';
  

И в файле, из которого вы включаете:

 <?php
    $text = include('file.php'); // just assigns value returned in file
  

Комментарии:

1. Это лучшее решение для нескольких типов требований по включению файла в переменную.

2. Отличное решение, это полезно для кэширования файлов, поэтому я могу использовать включенные файлы несколько раз, не включая файлы снова, мне нужно только распечатать содержимое переменной! Я всегда использую этот подход! Спасибо!

Ответ №4:

В PHP / 7 вы можете использовать самозапускающуюся анонимную функцию для выполнения простой инкапсуляции и предотвращения загрязнения глобальной области случайными глобальными переменными:

 return (function () {
    // Local variables (not exported)
    $current_time = time();
    $reference_time = '01-01-1970 00:00';

    return "seconds passed since $reference_time GMT is $current_time";
})();
  

Альтернативный синтаксис для PHP / 5.3 был бы:

 return call_user_func(function(){
    // Local variables (not exported)
    $current_time = time();
    $reference_time = '01-01-1970 00:00';

    return "seconds passed since $reference_time GMT is $current_time";
});
  

Затем вы можете выбрать имя переменной как обычно:

 $banner = require 'test.php';
  

Комментарии:

1. Работает и в PHP5. Не уверен, требуется ли это, но я использую скобки в синтаксисе $banner = (require 'test.php');

2. @Alphh. Dev Я считаю, что это не так. Анонимные функции довольно старые, но синтаксис самостоятельного вызова (я никогда не могу вспомнить фактическое название) новее. Однако синтаксис для старых систем тоже аккуратный, поэтому я обновил ответ.

3. Да. call_user_func(function( действительно заставляет это работать в PHP5. К сожалению, я не могу вспомнить почему, но мы намеренно используем квадратные скобки вокруг (require 'file.php'); Это вызвало некоторые проблемы без них.

4. @Alphh. В документации Dev include просто говорится: «Поскольку include — это специальная языковая конструкция, круглые скобки вокруг ее аргумента не нужны. Будьте осторожны при сравнении возвращаемого значения.»

Ответ №5:

Используйте shell_exec("php test.php") . Возвращает результат выполнения.

Ответ №6:

Я думаю, eval(file_get_contents('include.php')) это поможет вам. Помните, что другой способ выполнения, подобный shell_exec, может быть отключен на вашем хостинге.

Ответ №7:

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

Редактировать

Использование echo не позволит вам делать то, что вы хотите. Но при возврате содержимого файла работа будет выполнена, как указано в руководстве — http://www.php.net/manual/en/function.include.php

Комментарии:

1. Вы уверены в этом? echo $buffer дает мне правильный контент?

2. Этот парень не знает, о чем он говорит. Включение действительно возвращает правильное содержимое.

3. Извините, я должен был выразиться яснее, заявив, что использование echo не будет работать для целей OPS. Использование return конструкции будет работать так, как указано в руководстве. Обновлено, спасибо.

Ответ №8:

Это возможно, только если требуемый или включенный php-файл возвращает что-либо (массив, объект, строку, int, переменную и т.д.)

 $var = require '/dir/file.php';
  

Но если это не php-файл, и вы хотели бы оценить содержимое этого файла, вы можете:

 <?php

function get_file($path){

    return eval(trim(str_replace(array('<?php', '?>'), '', file_get_contents($path))));
}

$var = get_file('/dir/file.php');
  

Ответ №9:

Или, может быть, что-то вроде этого

в файле include.php:

 <?php
  //include.php file
  $return .= "value1 ";
  $return .= time();
  

в каком-либо другом файле php (не имеет значения, каково содержимое этого файла):

 <?php
  // other.php file
  function() {
    $return = "Values are: ";
    include "path_to_file/include.php";

    return $return;
  }
  

возврат будет выглядеть, например, так:

 Values are: value1, 145635165
  

Дело в том, что содержимое включаемого файла имеет ту же область видимости, что и содержимое функции в примере, о котором я привел.