Я пытаюсь передать переменную в файл include . Мой хост изменил версию PHP, и теперь любое решение, которое я пытаюсь сделать, не работает.
Кажется, я пробовал все, что мог найти. Я уверен, что это самая простая вещь!
Переменная должна быть установлена и оценена из первого вызывающего файла (это фактически $_SERVER['PHP_SELF']
, и ему нужно вернуть путь к этому файлу, а не включенному second.php
).
ОПЦИЯ ОДИН
В первом файле:
global $variable; $variable = "apple"; include('second.php');
Во втором файле:
echo $variable;
ВАРИАНТ ДВА
В первом файле:
function passvariable(){ $variable = "apple"; return $variable; } passvariable();
ВАРИАНТ ТРЕХ
$variable = "apple"; include "myfile.php?var=$variable"; // and I tried with http: and full site address too. $variable = $_GET["var"] echo $variable
Ничто из этого не работает для меня. Версия PHP – 5.2.16.
Что мне не хватает?
Благодаря!
Вариант 3 невозможен – вы получите обработанный вывод файла .php, точно так же, как если бы вы набрали этот URL-адрес в своем браузере. Если вместо этого вы получили необработанный PHP-код (как вам хотелось бы), тогда будет открыт весь исходный код вашего сайта, что, как правило, не очень хорошо.
Вариант 2 не имеет большого смысла – вы бы скрывали переменную в функции и подвергались переменной области PHP. У вас также должно быть $var = passvariable()
где-то, чтобы получить эту переменную «внутри» для «снаружи», и вы вернетесь к квадрату.
Вариант 1 является наиболее практичным. include()
будет в основном slurp в указанном файле и выполнить его прямо там, как если бы код в файле был буквально частью родительской страницы. Это похоже на глобальную переменную, которую большинство людей здесь нахмуривают, но с помощью семантики синтаксического анализа PHP эти два идентичны:
$x = 'foo'; include('bar.php');
а также
$x = 'foo'; // contents of bar.php pasted here
Вы можете использовать функцию extract ()
Drupal использует его в своей функции theme ().
Здесь это функция рендеринга с аргументом $variables
.
function includeWithVariables($filePath, $variables = array(), $print = true) { $output = NULL; if(file_exists($filePath)){ // Extract the variables to a local namespace extract($variables); // Start output buffering ob_start(); // Include the template file include $filePath; // End buffering and return its contents $output = ob_get_clean(); } if ($print) { print $output; } return $output; }
./index.php:
includeWithVariables('header.php', array('title' => 'Header Title'));
./header.php:
<h1><?php echo $title; ?></h1>
Учитывая, что включенный statment в php на самом базовом уровне берет код из файла и вставляет его туда, где вы его назвали, и тот факт, что в руководстве по включению указывается следующее:
Когда файл включен, код, который он содержит, наследует область изменения строки, в которой происходит включение. Любые переменные, доступные в этой строке в вызывающем файле, будут доступны в вызываемом файле с этой точки вперед.
Эти вещи заставляют меня думать, что существует многообразная проблема. Также вариант № 3 никогда не будет работать, потому что вы не перенаправляете на second.php
вы просто включаете его, а опция номер 2 – это просто странная работа. Самый простой пример включения stat в php:
vars.php <?php $color = 'green'; $fruit = 'apple'; ?> test.php <?php echo "A $color $fruit"; // A include 'vars.php'; echo "A $color $fruit"; // A green apple ?>
Учитывая, что вариант номер один является самым близким к этому примеру (хотя и более сложным он должен быть), и он не работает, это заставляет меня думать, что вы допустили ошибку в заявлении include (неправильный путь относительно корня или аналогичного выпуск).
Что касается вопроса OP, в частности «Переменная должна быть задана и оценена из первого вызывающего файла (это фактически« $ _SERVER ['PHP_SELF'] », и ему необходимо вернуть путь к этому файлу, а не второй. PHP) «.
Это скажет вам, какой файл включен в файл. Поместите это во включенный файл.
$includer = debug_backtrace(); echo $includer[0]['file'];
У меня такая же проблема, вы можете использовать массив $ GLOBALS.
$GLOBALS["variable"] = "123"; include ("my.php");
Он также должен выполнить это:
$myvar = "123"; include ("my.php"); .... echo $GLOBALS["myvar"];
Хорошего дня.
Согласно php docs (см. $ _SERVER ) $ _SERVER ['PHP_SELF'] является «именем текущего исполняемого скрипта».
Оператор INCLUDE включает и оценивает указанный «файл» и «содержащийся в нем код наследует область переменной строки, на которой происходит включение» (см. ВКЛЮЧЕНИЕ ).
Я полагаю, что $ _SERVER ['PHP_SELF'] вернет имя файла 1-го файла, даже если он используется кодом в 'second.php'.
Я проверил это со следующим кодом, и он работает как ожидалось ($ phpSelf – это имя первого файла).
// In the first.php file // get the value of $_SERVER['PHP_SELF'] for the 1st file $phpSelf = $_SERVER['PHP_SELF']; // include the second file // This slurps in the contents of second.php include_once('second.php'); // execute $phpSelf = $_SERVER['PHP_SELF']; in the secod.php file // echo the value of $_SERVER['PHP_SELF'] of fist file echo $phpSelf; // This echos the name of the First.php file.
Я обнаружил, что параметром include должен быть весь путь к файлу, а не относительный путь или частичный путь для этого.
Это сработало для меня. Чтобы обернуть содержимое второго файла в функцию, выполните следующие действия:
<?php include("secondFile.php"); echoFunction("message");
в<?php include("secondFile.php"); echoFunction("message");
<?php function echoFunction($variable) { echo $variable; }
PHP 5.2.0 добавляет директиву allow-url-include
(по умолчанию 0
, необходимо изменить на 1
в php.ini
), что означает, что вы можете передать полный http:
URL-адрес в оператор include
.
Добавляя переменную как строку запроса к этому URL-адресу, вы можете передать переменную во включенный файл, хотя и с некоторой потерей производительности:
include 'http://www.myservername.com/includes/second.php?variable=apple';
Конечно, вам также нужно настроить second.php
для обработки $_GET['variable']
и применить его к выходу.
Сделай это:
$checksum = "my value"; header("Location: recordupdated.php?checksum=$checksum");