Variable de paso de PHP para incluir


81

Estoy intentando pasar una variable a un archivo de inclusión . Mi host cambió la versión de PHP y ahora cualquier solución que pruebe no funciona.

Creo que probé todas las opciones que pude encontrar. ¡Seguro que es lo más sencillo!

La variable debe establecerse y evaluarse desde el primer archivo que llama (en realidad $_SERVER['PHP_SELF'], y debe devolver la ruta de ese archivo, no el incluido second.php).

OPCION UNO

En el primer archivo:

global $variable;
$variable = "apple";
include('second.php');

En el segundo archivo:

echo $variable;

OPCION DOS

En el primer archivo:

function passvariable(){
    $variable = "apple";
    return $variable;
}
passvariable();

OPCION TRES

$variable = "apple";
include "myfile.php?var=$variable"; // and I tried with http: and full site address too.


$variable = $_GET["var"]
echo $variable

Ninguno de estos funciona para mí. La versión de PHP es 5.2.16.

¿Qué me estoy perdiendo?

¡Gracias!


2
¿Intentaste definir una constante?
Oussama Jilal

6
no tiene que pasar variables para incluir archivos. su servidor web simplemente cargará el código de sus archivos cuando los incluya como si hubiera escrito ese código desde el archivo de inclusión en su otro archivo.
Leon Kramer

¿Podrías aclarar 'Ninguno de estos trabajos'? Los mensajes de error también serán útiles ... Y, AFAIK, el código incluido se ejecuta dentro del mismo contexto, por globallo que no es necesario; su primera opción debería funcionar bien.
raina77ow

Como dijeron otros, include () es como pegar el código allí, continúa la ejecución del código como si estuviera en el mismo archivo. No tiene que encontrar una manera de incluir la variable en el archivo de inclusión, simplemente puede escribirla antes de include () (si es necesario).
adrianTNT

Respuestas:


48

Puede utilizar la función extract ()
Drupal usa, en su función theme ().

Aquí hay una función de renderizado con un $variablesargumento.

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>

También puede usar este método agregando el indicador EXTR_REFS a la función de extracción (consulte php.net/manual/en/function.extract.php ) para que cuando pase una variable con referencia: array( 'title' => &$title )el $ title se pueda cambiar dentro del archivo incluido .
Mauro Mascia

No creo que esto funcione en versiones posteriores de PHP, digamos 7.3
Robert Moskal

45

La opción 3 es imposible: obtendría la salida renderizada del archivo .php, exactamente como lo haría si ingresara esa URL en su navegador. Si en su lugar obtuviera código PHP sin procesar (como le gustaría), entonces TODO el código fuente de su sitio quedaría expuesto, lo cual generalmente no es algo bueno.

La opción 2 no tiene mucho sentido: estaría ocultando la variable en una función y estaría sujeto al alcance de la variable de PHP. También tendrías que tener$var = passvariable() lugar para llevar esa variable "interior" al "exterior", y punto de .

La opción 1 es la más práctica. include()básicamente absorberá el archivo especificado y lo ejecutará allí mismo, como si el código en el archivo fuera literalmente parte de la página principal. Parece una variable global, que la mayoría de la gente desaprueba aquí, pero según la semántica de análisis de PHP, estas dos son idénticas:

$x = 'foo';
include('bar.php');

y

$x = 'foo';
// contents of bar.php pasted here

11

Teniendo en cuenta que una declaración de inclusión en php en el nivel más básico toma el código de un archivo y lo pega en el lugar donde lo llamó y el hecho de que el manual de inclusión establece lo siguiente:

Cuando se incluye un archivo, el código que contiene hereda el ámbito de la variable de la línea en la que se produce la inclusión. Cualquier variable disponible en esa línea en el archivo de llamada estará disponible dentro del archivo llamado, a partir de ese momento.

Estas cosas me hacen pensar que hay un problema diferente en conjunto. Además, la opción número 3 nunca funcionará porque no está redirigiendo a second.phpque solo la está incluyendo y la opción número 2 es una solución extraña. El ejemplo más básico de la declaración de inclusión en php es:

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

?>

Teniendo en cuenta que la opción número uno es la más cercana a este ejemplo (aunque más complicada de lo que debería ser) y no está funcionando, me hace pensar que cometió un error en la declaración de inclusión (la ruta incorrecta en relación con la raíz o similar problema).


¿Quizás he confundido el orden de las cosas? La estructura es, de hecho: main.php $ variable = $ _SERVER ['PHP_SELF']; include = ' side.com/footer.php ; footer.php: echo $ variable; Todo el archivo incluido no contiene la variable, simplemente le hace algo. En todas las opciones que probé, la salida está en blanco o incluye $ _SERVER ['PHP_SELF'] del footer.php y no main.php. ¿Es esto diferente?
user1590646

5

En lo que respecta a la pregunta del OP, específicamente "La variable debe establecerse y evaluarse desde el primer archivo de llamada (en realidad es '$ _SERVER [' PHP_SELF ']', y debe devolver la ruta de ese archivo, no el segundo incluido. php) ".

Esto le dirá qué archivo incluyó el archivo. Coloque esto en el archivo incluido.

$includer = debug_backtrace();
echo $includer[0]['file'];

Basado en los comentarios del OP en su pregunta "La variable debe establecerse y evaluarse desde el primer archivo que llama (en realidad es '$ _SERVER [' PHP_SELF ']', y debe devolver la ruta de ese archivo, no el segundo incluido. php) ". Necesita averiguar cuál es la ruta del archivo que incluyó second.php.
Jeremy1026

Célebre. (no está claro a partir de su respuesta, por favor aclárelo ["ya que OP quiere obtener el nombre del archivo original bla, bla, bla"]).
Madara's Ghost

5

Tengo el mismo problema aquí, puede usar la matriz $ GLOBALS.

$GLOBALS["variable"] = "123";
include ("my.php");

También debería ejecutarse haciendo esto:

$myvar = "123";
include ("my.php");

....

echo $GLOBALS["myvar"];

Que tengas un buen día.


4

OPCIÓN 1 funcionó para mí, en PHP 7, y seguro que también funciona en PHP 5. Y la declaración de alcance global no es necesaria para el archivo incluido para el acceso a las variables, los archivos incluidos o "requeridos" son parte del script, solo asegúrese de hacer el "incluir" DESPUÉS de la declaración de la variable. ¿Quizás tiene alguna configuración incorrecta con las variables de alcance global en su PHP.ini?

Pruebe en el primer archivo:

  <?php 
  $myvariable="from first file";
  include ("./mysecondfile.php"); // in same folder as first file LOLL
  ?>

mysecondfile.php

  <?php 
  echo "this is my variable ". $myvariable;
  ?>

Debería funcionar ... si no solo intenta reinstalar PHP.


3

Me encontré con este problema en el que tenía un archivo que establece variables basadas en los parámetros GET. Y ese archivo no se pudo actualizar porque funcionaba correctamente en otra parte de un gran sistema de administración de contenido. Sin embargo, quería ejecutar ese código a través de un archivo de inclusión sin que los parámetros estuvieran realmente en la cadena de URL. La solución simple es que puede configurar las variables GET en el primer archivo como lo haría con cualquier otra variable.

En vez de:

include "myfile.php?var=apple";

Podría ser:

$_GET['var'] = 'apple';
include "myfile.php";

1

Según php docs (ver $ _SERVER ) $ _SERVER ['PHP_SELF'] es el "nombre de archivo del script que se está ejecutando actualmente".

La instrucción INCLUDE "incluye y evalúa el archivo" especificado y "el código que contiene hereda el alcance de la variable de la línea en la que ocurre la inclusión" (consulte INCLUDE ).

Creo que $ _SERVER ['PHP_SELF'] devolverá el nombre de archivo del primer archivo, incluso cuando lo use el código en el 'second.php'.

Probé esto con el siguiente código y funciona como se esperaba ($ phpSelf es el nombre del primer archivo).

// 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.

0

Puede ejecutar todo en "second.php" agregando variable con jQuery

<div id="first"></div>

<script>
$("#first").load("second.php?a=<?php echo $var?>")
</scrpt>

0

Sé que esta es una pregunta antigua, pero me encontré con ella ahora y vi que nadie mencionó esto. así que escribiéndolo.

La opción uno, si se modifica así, también debería funcionar.

El original

opcion uno

En el primer archivo:

global $variable; 
$variable = "apple"; 
include('second.php'); 

En el segundo archivo:

echo $variable;

RETOCAR

En el primer archivo:

$variable = "apple"; 
include('second.php');

En el segundo archivo:

global $variable;
echo $variable;

-1

Descubrí que el parámetro de inclusión debe ser la ruta completa del archivo, no una ruta relativa o una ruta parcial para que esto funcione.


1
No, eso es incorrecto. Las rutas relativas funcionan bien en include's. Solo tienes que asegurarte de que estás asumiendo un comienzo correcto "relativo a qué".
Peter Bowers

-2

Esto funcionó para mí: para envolver el contenido del segundo archivo en una función, de la siguiente manera:

firstFile.php

<?php
    include("secondFile.php");

    echoFunction("message");

secondFile.php

<?php
    function echoFunction($variable)
    {
        echo $variable;
    }

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.