2012-04-12 33 views
6

Estoy tratando de hacer una función que puedo llamar de la siguiente manera,PHP uso incluyen las funciones en

view('archive', 'post.php'); 

y cuál es la función que realmente hace es esto.

include('view/archive/post.php'); 

La razón de esto es que si en el futuro me expanda el directorio para ser view/archive/another_level/post.php Yo no quiero tener que volver por todas partes en mi código y cambiar todos los caminos incluir.

Actualmente esto es lo que tengo a mi función, excepto que parece que el include está siendo llamada dentro de la función, y no ser llamado cuando la función se llama ...

function view($view, $file) 
    { 
     switch ($view) 
     { 
      case 'archive' : $view = 'archive/temp'; break; 
      case 'single' : $view = 'single';  break; 
     } 

     include(TEMPLATEPATH . "/view/{$view}/{$file}"); 
    } 

¿Cómo puedo conseguir esta función para incluir correctamente el archivo?

EDIT:

No hubo errores que se muestra. Gracias a @Ramesh por el código de comprobación de errores, ini_set('display_errors','On'), pude ver que había otros errores 'no visualizados' en el archivo incluido, que parecían haber causado que el archivo no apareciera ...

+4

no hay nada de malo en esto, debería funcionar como se esperaba ... ¿qué problema exactamente estás experimentando? – scibuff

+0

publique el mensaje de error –

+0

No obtengo un error, es solo que no se imprime nada ... – cnotethegr8

Respuesta

7

que el uso caso es explicitly documented:

Si la inclusión se produce dentro de una función en el fichero donde, a continuación, todo el código contenido en el archivo llamado se comportará como si había sido definido dentro de esta función. Por lo tanto, seguirá el alcance de la variable de esa función. Una excepción a esta regla son las constantes mágicas que son evaluadas por el analizador antes de que ocurra la inclusión.

en mi humilde opinión, es mucho más sencillo de mantener corrido de bases en constantes (que ya parece estar haciéndolo hasta cierto punto) o incluso hacer una búsqueda de sitio completo y reemplazar (que es una segunda tarea 30 en cualquier editor decente) que reescribir todos sus archivos incluidos para usar variables globales.

1

I cree que debería leer sobre el alcance variable .

http://php.net/manual/en/language.variables.scope.php

El alcance de una variable es el contexto en el que se define.

Por lo tanto, si incluye un archivo dentro de una función, tendrá su contenido disponible solo en el contexto de esa función.

1

Si bien en realidad no indica cuál es el problema exacto que tiene, sospecho que es que las variables no están disponibles para su archivo incluido. Una forma un poco horrible para solucionar parcialmente este problema es añadir esta línea antes de su declaración de include:

extract($GLOBALS); 

Esto importará todas las variables del ámbito global en su función. Sin embargo, esto no hará que la función haga exactamente lo que usted desea. Considere este código:

function some_func() { 
    $x = 2; 
    view('archive', 'post.php'); 
} 

$x = 1; 

some_func(); 

En el archivo incluido, el valor de $x será 1, no 2 tal como esperaría que/esperar. Esto se debe a que $GLOBALS solo contiene datos del ámbito global, no contiene las variables del ámbito de some_func(). No hay un mecanismo para acceder a las variables en el alcance "principal" en PHP.

El resto de esto es que el enfoque que desea usar (envolviéndolo en una función) no funcionará.

0
function view($view, $file) 
{ 
    switch ($view) 
    { 
     case 'archive' : $view = 'archive/temp'; break; 
     case 'single' : $view = 'single';  break; 
    } 

    include(TEMPLATEPATH . "/view/".$view."/".$file); 
} 

esto funciona para mí. También podría usar el include dentro de la caja o incluso mejor construir toda la url para incluir dentro de la caja cada vez.

+0

funciona, pero si desea utilizar el ámbito global desde el archivo principal, no es una solución. Pero la solución de @ sean9999 es bastante simple y útil. – Mephiztopheles

5

Aquí hay una forma en que podría resolver el problema:

cambio de la forma de llamar a su función por lo que se ve así:

include(view('archive','post')); 

y su función se vería así:

<?php 
function view($view, $file) 
{ 
    switch ($view) 
    { 
     case 'archive': $view = 'archive/temp'; break; 
     case 'single' : $view = 'single';  break; 
    } 

    return TEMPLATEPATH . "/view/{$view}/{$file}"; 
} 
?> 
+0

Buena idea. Simple, pero no me vino a la mente: D – Mephiztopheles

Cuestiones relacionadas