2011-05-20 6 views
6

He leído muchos, muchos hilos sobre esto y todavía no puedo entenderlo.PHP 5 - El alcance de la variable incluye archivos sin clases o funciones

Aquí es mi cuestión básica:

header.php incluye un archivo llamado navigation.php. Dentro de navigation.php, se definen $previous y $next. Usando declaraciones de eco, he verificado que tienen valores.

A continuación, header.php incluye un archivo llamado backnext.php. Necesito backnext.php para conocer los valores de $previous y $next. Si los declaro como global en la parte superior de backnext.php, no obtengo errores, pero las declaraciones echo muestran que están vacíos. Si no lo hago, obtengo un error de undefined variable.

¿Dónde exactamente necesito declararlos como global para tener backnext.php poder leer sus valores correctamente?

Ninguno de estos archivos está utilizando funciones o clases.

+0

es navigation.php definitivamente incluido antes de backnext? – Fosco

+0

puede mostrar en un bloque de código exactamente el oder en el que se colocó (en header.php) sé que lo explicó pero es más fácil de visualizar de esa manera – Neal

+0

@Fosco - sí. @Neal - Yo estaba tratando de evitar la publicación de más de 300 líneas de código, pero estoy de acuerdo con usted y puede darle una oportunidad en la versión condensada: 'code' header.php: ... incluyen' ../ ../includes/navigation.php '; // 1er eco anterior echo $ previous; ... echo '

'; // include '../../includes/leftnavbar/backnext.php'; echo '
'; // segundo eco anterior echo $ anterior ... navigation.php ... $ = $ m anterior [ "$ p"]; ... backnext.php ... // 3er eco anterior echo "previous is $ previous"; ... 'code' 1st dice index.php, 2nd dice index.php, 3rd dice que previous is, no value. – user762985

Respuesta

8

Si ninguno de estos archivos tienen funciones o clases luego $prev y $next se encuentran en el ámbito global y debe ser visto por todos sus archivos de inclusión y que no es necesario utilizar la palabra clave global.

Parece que el orden de sus inclusiones puede ser un poco incorrecto.

Actualización:

Si he entendido bien que tener algo como esto:

header.php:

<?php 
echo "In header.php\n"; 

require_once("navigation.php"); 
require_once("backnext.php"); 

echo "Also seen in header.php:\n"; 
echo "prev=$prev\n"; 
echo "next=$next\n"; 
?> 

navigation.php:

<?php 
echo "In navigation.php\n"; 
$prev = "Hello World#1"; 
$next = "Hello World#2"; 
echo "Exiting navigation.php\n"; 
?> 

backnext.php:

<?php 
echo "In backnext.php\n"; 
echo "prev=$prev\n"; 
echo "next=$next\n"; 
echo "Exiting backnext.php\n"; 
?> 

Si me quedo esta me sale:

 
In header.php 
In navigation.php 
Exiting navigation.php 
In backnext.php 
prev=Hello World#1 
next=Hello World#2 
Exiting backnext.php 
Also seen in header.ph 
prev=Hello World#1 
next=Hello World#2 

backnext.php es capaz de ver tanto $prev y $next.

+0

@watcher - Puedo hacer eco de $ previo y $ siguiente directamente antes y directamente después de mi inclusión de backnext.php, por lo que no, no se borran. La única vez que no puedo hacerles eco es desde ese archivo. – user762985

1

Creo que probablemente haya un error lógico en alguna parte donde el contenido de las variables se borre, o como @Kev señaló que el flujo de ejecución es incorrecto. Aquí hay un código de prueba:

del archivo: prueba.php

<?php 
    $test = "Hi!"; 
    require_once 'test2.php'; 
    require_once 'test3.php'; 
?> 

del archivo: test2.php

<?php 
    echo("Test 2: " . $test . "<br/>"); 
?> 

del archivo: test3.php

<?php 
    echo("Test 3: " . $test . "<br/>"); 
?> 

Esto produce la salida:

Test 2: Hi! 
Test 3: Hi! 

lo que demuestra que la variable $test está en el ámbito mundial, y debería estar disponible a cualquier secuencia de comandos después de que se ha definido.

PS- No confíe en los usuarios de SO para proporcionar su material de referencia. Ir directamente a la fuente: Variable Scope - PHP Manual primer párrafo de esa página se lee:

El ámbito de una variable es el contexto dentro del cual se define. Para la mayoría de las variables de todas las variables PHP solo tienen un único ámbito. Este alcance único abarca archivos incluidos y necesarios como .

Editar

Prueba esto en header.php y ver lo que sucede:

<?php 
    include 'navigation.php'; 
    echo($previous . " ; " . $next . "<br/>"); 
    include 'backnext.php'; 
    echo($previous . " ; " . $next . "<br/>"); 
?> 

Si no obtiene el mismo resultado en ambas ocasiones, entonces hay un problema en backnext.php donde las variables están siendo barridos Si produce la misma salida, mueva los ecos dentro de backnext.php en la parte superior e inferior. Lógicamente no es realmente moviéndolos, pero puede seguir moviéndolos más y más juntos hasta que encuentre dónde está el problema.

+0

@Kev - Estoy de acuerdo. Ellos deberían. Sin embargo, el orden es como lo describí anteriormente. – user762985

+0

De acuerdo, lo tengo ... pero no lo entiendo. Cuando publiqué el código anterior, cambié la ruta de acceso a backnext.php desde absoluto usando BASE_URL a relativo, ya que está allí, y ahora funciona. Como definitivamente estaba incluido el archivo, estoy confundido sobre por qué la ruta absoluta/relativa causó este problema? – user762985

Cuestiones relacionadas