Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Ambito de variables con objetos

Estas en el tema de Ambito de variables con objetos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Gente, tengo el siguiente problema. Hace poco me pase de php4 a php5 y no consigo hacer andar un script que arme. Voy a intentar ...
  #1 (permalink)  
Antiguo 09/05/2010, 07:43
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Ambito de variables con objetos

Gente, tengo el siguiente problema. Hace poco me pase de php4 a php5 y no consigo hacer andar un script que arme.

Voy a intentar dar un ejemplo bien sencillo

tengo 2 archivos

home.php
contacto.php

y 2 archivos de diseño
cabecera.php
piedepagina.php

Lo que hace el home.php y contacto.php es

Código:
include 'cabecera.php';
...desarrollo...
include 'piedepagina.php';

Arme un objeto de metatags el cual le paso los atributos como title y keywords para que, cuando instancio el objeto me arme todos los metatags necesarios.

Este objeto lo instancio en cabecera.php

Entonces en cabecera.php quedaria algo asi

Código:
include 'objeto_metatag.php';
$title = "titulodepagina";
$keywords = "key,key,key";

<html>
   <head>
       $metatags = new MetaTags($titulo,$keywords);
       $metatags->mostrarMetaTags();
   </head>
   <body>
           .....
Y obviamente el piedepagina.php cerraria el codigo html para que en home.php y contacto.php no tenga que volver a poner los codigos html, solo pongo, por ejemplo en contacto.php el formulario para que lo rellene el usuario.


Ahora bien, resulta que en los titulos quiero ir modificandolos por pagina, es decir en home.php y en contacto.php quiero 2 titulos diferentes. Por ejemplo "Inicio - Mi pagina" y "Contacto - Mi pagina"

Cuando declaro las variables en cabecera.php no tengo problema alguno, pero cuando las declaro en home.php o contacto.php no me las reconoce.

es decir:

Código:
$title = "titulodepagina";
$keywords = "key,key,key";
include 'cabecera.php';
...desarrollo...
include 'piedepagina.php';
¿Que estoy haciendo mal?
Probe usando include, include_once, require y require_once y tuve el mismo problema con todos.

Creo que es un problema del objeto que uso, por eso lo puse en este subforo, si estoy equivocada muevanlo.

Muchas gracias
  #2 (permalink)  
Antiguo 09/05/2010, 07:57
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

Bueno si copiaste y pegaste, el error que posiblemente te produce es que estás llamando etiquetas de HTML dentro de la estructura de PHP sin haberlas encerrado en algún contructor como por ejemplo echo, print etc.
Código PHP:
Ver original
  1. <?php
  2. include 'objeto_metatag.php';
  3. $title = "titulodepagina";
  4. $keywords = "key,key,key";
  5. echo "<html>
  6.   <head>";
  7.        $metatags = new MetaTags($titulo,$keywords);
  8.        $metatags->mostrarMetaTags();
  9. echo "</head>
  10.   <body>
  11.           .....";
Y si estuvieras haciendo eso bien, no mencionas las clases (o sea el código) ni tampoco lo que hay en los include.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 09/05/2010, 08:01
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

1ero, gracias x la pronta respuesta.

2do, perdon, arme el codigo a mano aca, esta bien armado en mis archivos, los codigos simplemente los puse para ejemplificar lo que quiero hacer, pero andan bien, esta bien defina la parte php y html. No me generan ningun error.

Osea, no es un problema error de codigo. Como dije, me anda bien todo si las variables las defino en cabecera.php pero no cuando las defino en home.php o en contacto.php

Gracias nuevamente.
  #4 (permalink)  
Antiguo 09/05/2010, 08:05
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

¿Qué error te da? Si es que alguno cuando las defines en el home.php o en contacto.php
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 09/05/2010, 08:10
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

Cita:
Iniciado por abimaelrc Ver Mensaje
¿Qué error te da? Si es que alguno cuando las defines en el home.php o en contacto.php
No me da un error, es como si directamente no las hubiera definido.

Cuando pongo por ejemplo Ver codigo fuente en la pagina me queda:

Código:
<html>
<TITLE></TITLE>
<META NAME="Keywords" CONTENT="">
....
Pero como dije, cuando defino las variables en cabecera.php me funciona todo correctamente

Código:
<html>
<TITLE>mipagina</TITLE>
<META NAME="Keywords" CONTENT="key,key,key">
....
Obviamente estoy dando ejemplos. Defino muchas mas variables, etc. Pero intento hacer el ejemplo lo mas sencillo posible.
  #6 (permalink)  
Antiguo 09/05/2010, 08:13
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

Bueno como te indique hay que ver que tienes declarado en las clases que mencionas. Porque así no se te puede decir mucho. Lo que sí debes verificar es si tienes activado error_reporting como E_ALL solamente para que veas todos los errores que tienes (si es que alguno).
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 09/05/2010, 16:38
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ambito de variables con objetos

abimaelrc
OK, solo un detalle. Seria mejor escapar el HTML ya que no es una buena practica imprimir HTML desde PHP.

Código PHP:
Ver original
  1. <?php
  2. include 'objeto_metatag.php';
  3.  
  4. $title = 'titulodepagina';
  5. $keywords = 'key,key,key';
  6. ?>
  7. <html>
  8.      <head>
  9.      <?php
  10.      $metatags = new MetaTags($titulo,$keywords);
  11.      echo $metatags->mostrarMetaTags();
  12.      ?>
  13.     </head>
  14.   <body>
  15.   </body>
  16. </html>
  #8 (permalink)  
Antiguo 09/05/2010, 16:57
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

Claro, eso es lo aconsejable (y lo que siempre aconsejo), pero, solo estaba asegurandome de que no haya sido que colocará todo de esa forma.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 10/05/2010, 15:58
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

Estoy usando una funcion para importar las clases, la tome de un ejemplo que se dio por aca para que al llamarlas sea mas parecido a Java y se importan como paquetes.

Encontre que si dejo de usar esa funcion y uso el comando require o include directamente me anda bien.

¿Puede ser por el hecho de que el include este dentro de una funcion, no reconozca el valor de las variables?

Estoy probando ahora definiendo en cabecera.php a las variables como globales y al parecer me esta andando.

En definitiva seria:

home.php
Código PHP:
<?php
include './configuracion/config.php'//archivo que tiene la funcion import para traer a los demas scripts
$titulo "mipagina"
$keywords "key1,key2,key3"
import "aplicacion.presentacion.cabecera" ); //me trae a cabecera que lo tengo en /aplicacion/presentacion/cabecera.php
?>
hola mundo! (que original! je!)
<?
import 
"aplicacion.presentacion.piedepagina" ); 
?>
cabecera.php
Código PHP:
<?php
import 
"aplicacion.presentacion.class_metatag.php" ); 
?>
<html>
   <head>
       <?php
       $metatags 
= new MetaTags($titulo,$keywords);
       
$metatags->mostrarMetaTags();
       
?>
   </head>
   <body>
           //.....
Es bastante raro, por lo menos para mi que no tengo mucha experiencia.

Recapitulando:
Si dejo asi como esta $titulo y $keywords no las toma como definidas.

Si en cambio las defino en cabecera.php me anda perfectamente.

Ahora bien si las defino en home.php y en cabecera.php agrego lo siguiente me anda bien:
global $titulo;
global $keywords;


Alguien me podria explicar por que si las defino en cabecera.php no hace falta que las ponga como variables globales, pero si cuando las defino en home.php.
¿Esto es una cualidad de php5?

¿La mejor solución? ¿Las defino globales o dejo de usar la funcion import?
  #10 (permalink)  
Antiguo 10/05/2010, 16:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

Bueno, sin ver lo que haz hecho en el código es bien difícil que se te pueda explicar. Pero explicando por encima, para que las funciones puedan ver las variables que están fuera de ellas, tienes que indicar las variables como globales dentro de la función
Código PHP:
Ver original
  1. $foo = 'candy';
  2. function bar(){
  3.   global $foo;
  4.   echo $foo;
  5. }
Te recomiendo que leas esta parte del manual para que tengas claro como debes trabajar con las funciones
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 10/05/2010, 16:06
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

Cita:
Iniciado por atrianaster Ver Mensaje
abimaelrc
OK, solo un detalle. Seria mejor escapar el HTML ya que no es una buena practica imprimir HTML desde PHP.
Al margen, atrianaster, lo que estas queriendo decir que es mejor hacer:

<?
$hola = "hola";
?>
<html>
<head>
<?
$chau = "chau";
?>

Que poner el codigo html en un echo?

<?
$hola = "hola";
echo "<html><head>";
$chau = "chau";
?>

Yo generalmente uso de la primer manera, pero para que me quede de precedente. ¿Por que es mejor de la primera forma?
  #12 (permalink)  
Antiguo 10/05/2010, 16:10
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

Bueno, lo primero es que cuando lo haces de la primera forma, PHP no interpreta lo que esté fuera de las etiquetas de PHP. Segundo es también para distinguir entre código de PHP y HTML. Se te hace más fácil la lectura.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 10/05/2010, 16:45
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

Con respecto a lo de HTML y PHP, gracias por la respuesta, yo usaba el codigo separado justamente para distinguir mejor.

Ahora bien, sobre las variables globales, entiendo bien cuando definirlas globales y para que se usa, lo que todavia no me queda bien en claro es lo siguiente y voy a intentar ejemplificar.

Uniendo los codigos me quedaria algo asi:

Partiendo de home.php.

<?
include './configuracion/config.php';



//VARIABLES EN CUESTION
$titulo = "mipagina";
$keywords = "key1,key2,key3";



import ( "aplicacion.presentacion.cabecera" );

//aca tengo un include dentro de una funcion

( que dentro de cabecera tendria: )

import ( "aplicacion.presentacion.class_metatag.php" );
//aca tambien tengo otro include dentro de una funcion
//class_metatag.php simplemente es la clase para crear un objeto con los metatags
?>
<html>
<head>
<?php
$metatags = new MetaTags($titulo,$keywords);
$metatags->mostrarMetaTags();
?>
</head>
<body>


(y aca seguiria el home.php)


Yo ahora lo que no comprendo es, suponiendo que un include dentro de una funcion necesita que las variables que va a usar el script del include esten definidas como Globales.

¿Porque cuando las defino (digo definir a $titulo="mipagina";) en home.php necesitan que esten como globales en cabecera.php y no cuando las defino en cabecera.php ya que luego tambien tendre un include dentro de una funcion?

Osea, actualmente tengo esta duda, porque en un momento si necesitan estar globales y en otro no.

Tambien reanudo la pregunta que formule anteriormente para saber que opcion tomar:
¿Las defino globales o dejo de usar la funcion import?
(actualmente me tiro por la 2da posibilidad y volver a incluir los archivos directamente y con una constante que me "achique" la ruta)
  #14 (permalink)  
Antiguo 10/05/2010, 16:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ambito de variables con objetos

Cual es el código de import() puede que ahí este tu problema ya que es probable que las variables que tengas solo sean locales dentro de import() y por eso no las vez desde tu archivo principal.

Saludos.
  #15 (permalink)  
Antiguo 10/05/2010, 16:55
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

Cita:
Iniciado por GatorV Ver Mensaje
Cual es el código de import() puede que ahí este tu problema ya que es probable que las variables que tengas solo sean locales dentro de import() y por eso no las vez desde tu archivo principal.

Saludos.
Justamente y si no recuerdo mal, es tuyo ese codigo y lo modifique un poquitito con otro ejemplo que tambien lo habian usado aqui dentro del foro (quizas en mi modificacion rompi algo jejeje)


Código PHP:
define('HOME',$_SERVER[DOCUMENT_ROOT]);
define('BASE_DIR'"/nuevoproyecto");
define('APLICA',BASE_DIR."/aplicacion");
define('DOM',APLICA."/dominio/");
define('PRE',APLICA."/presentacion/");
define('PER',APLICA."/persistencia/");
define('IMG',BASE_DIR."/images/");

function 
import$class_path ) {
    
$class_path str_replace"."DIRECTORY_SEPARATOR$class_path );
    
$class_path HOME BASE_DIR DIRECTORY_SEPARATOR $class_path;
    require_once( 
$class_path.".php" );

Como veras, saque algo de tu codigo y ademas agregue algunas constantes para facilitar las rutas. Ese seria el config.php
  #16 (permalink)  
Antiguo 10/05/2010, 16:59
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

El problema es que mantienes locales las variables en la función y no puedes ver las variables externas porque no las tienes indicadas como globales.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #17 (permalink)  
Antiguo 10/05/2010, 17:02
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

Cita:
Iniciado por abimaelrc Ver Mensaje
El problema es que mantienes locales las variables en la función y no puedes ver las variables externas porque no las tienes indicadas como globales.
Si, eso es lo que imagine y por eso las defini como globales, pero ahora lo q no entiendo por que cuando estan "creadas" las variables en cabecera.php no necesito ponerlas como globales si luego las voy a usar en class_metatags que ese archivo tambien lo estoy incluyendo dentro de una funcion.
  #18 (permalink)  
Antiguo 10/05/2010, 17:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

Ok, pero para ver si es error de la función o del código que tengas creado, porque mejor no lo creas directamente usando require_once.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #19 (permalink)  
Antiguo 10/05/2010, 17:17
 
Fecha de Ingreso: mayo-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Ambito de variables con objetos

Cita:
Iniciado por abimaelrc Ver Mensaje
Ok, pero para ver si es error de la función o del código que tengas creado, porque mejor no lo creas directamente usando require_once.
Si, como decia mas arriba, cuando uso require_once, require, include o include_once me anda bien.

Me gusto mucho la forma de incluir el codigo de la funcion import, me parecio mucho muy prolija y ademas tengo un poco de experiencia en Java y me senti mucho mas comoda con ese codigo para importar, es mas, estaba pensando en ampliarlo para poder usar xxx.xxxxx.* para traer "librerias" completas.


Al principio pense que mi error era por utilizar objetos de php5 y estaba cometiendo un error con eso, ahora veo que el error esta por el ambito de las variables con la funcion import. Pero igualmente sigo con esa duda (sobre todo para saber en futuros codigos) de porque si logicamente en un momento no es necesario definir las variables como globales, en otro momento si es necesario, si practicamente el desarrollo es el mismo.

Lo que conclui es lo siguiente:
cuando incluyo el codigo de cabecera.php con la funcion import esta tomando todo ese codigo como una funcion y por eso no lee las variables fuera de ese "funcion".
Igualemente me sigue generando la duda es porque no sucede lo mismo cuando las creo en cabecera.php y llamo mediante la funcion import a la clase metatags

Osea, si en los 2 lugares sucederia lo mismo ya me dejaria de molesta con esto (jejejejej), pero intento buscarle la logica de porque en cada momento es diferente y no la comprendo.
  #20 (permalink)  
Antiguo 10/05/2010, 17:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ambito de variables con objetos

Para la forma como tu quieres hacerlo, lo más que veo que se puede hacer es así
Código PHP:
Ver original
  1. <?php
  2. define('HOME',$_SERVER[DOCUMENT_ROOT]);
  3. define('BASE_DIR', "/nuevoproyecto");
  4. define('APLICA',BASE_DIR."/aplicacion");
  5. define('DOM',APLICA."/dominio/");
  6. define('PRE',APLICA."/presentacion/");
  7. define('PER',APLICA."/persistencia/");
  8. define('IMG',BASE_DIR."/images/");
  9.  
  10. function import( $class_path ){
  11.     $class_path = str_replace( ".", DIRECTORY_SEPARATOR, $class_path );
  12.     $class_path = HOME . BASE_DIR . DIRECTORY_SEPARATOR . $class_path;
  13.     return $class_path . '.php';
  14. }
  15. require_once(import('aplicacion.presentacion.cabecera'));
Que en realidad es un paso más, pero se trabaja como tu quieres.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #21 (permalink)  
Antiguo 10/05/2010, 23:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ambito de variables con objetos

Lo que puedes hacer es dentro de tus archivos PHP que "importas" usar $GLOBALS['la_var_que_quieras'] para que PHP lea las variables desde el ámbito global y no desde el local.

Saludos.

Etiquetas: ambito, objetos, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:16.