[Pregunta]: ¿Por qué me dice que la variable no está definida?

Iniciado por Leguim, 12 Diciembre 2019, 18:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Buenos días,

estoy un poco confundido ya que PHP me está diciendo que una variable no existe. (que estoy definiendo claramente)

Código (php) [Seleccionar]

<?php
$dato 
'este es el dato';

function 
Mirar()
{
echo $dato;
}

Mirar();
?>



La variable es global y está fuera de la función y luego se usa ahí...

MinusFour

Porque el scope de PHP es únicamente dentro de la función. Tendrías que poner:

Código (php) [Seleccionar]

<?php
$dato 
'este es el dato';
 
function 
Mirar()
{
        global 
$dato;
echo $dato;
}
 
Mirar();
?>


Hay algunas variables que las puedes acceder de cualquier lado (super globales) pero las demas necesitan ser tratadas cuidadosamente.

@XSStringManolo

#2
No utiliceis la keyword global. En todo caso utilizar el array $GLOBALS[$miVariable]

Por 3 motivos. El primero es la propia definición de lo que es el alcance global y el conflicto con otros lenguajes. De por si la variable definida en el código fuera de un cuerpo es global por definición PHP incluído que es del que hablo. En cambio al añadir la keyword global la haces "global" para que sea accesible desde otros cuerpos lo cual no tiene ningún sentido lógico., ya era global. Teniendo en cuenta que PHP hoy en día es utilizado conjuntamente/interactuando con otros lenguajes, crea una sintaxis poca intuitiva que puede hacer creer a desarrolladores de otros lenguajes y del propio PHP algo erroneo, que la variable no era global previamente, lo cual no es cierto.
El segundo es la eficiencia en velocidad y uso de memoria. Según tests que he estado viendo, es mucho más lento que su contraparte $GLOBALS[$miVariable].
Los scopes están diseñados para mejorar la seguridad e integridad del código y componentes externos. Si no es estrictamente necesario o conveniente modificar el scope, no debe hacerse. Está bien seguir el concepto de encapsulación aunque no se trabaje con objetos. Hace el código mucho más escalable, mantenible y menos propenso a errores.

Siguiendo los mismos criterios es más adecuado pasar la variable como argumento. O en caso de ser posible integrar la obtención de datos y su posterior destrucción (automática) en la propia función. Es decir:

Código (php) [Seleccionar]
<?php

function MirarDato()
{
$dato 'este es el dato';
echo 
$dato;
/* $dato se destruye. Se puede usar static si se desea conservar trás finalizar la ejecución o retornarlo. Por ejemplo un contador. */
}

MirarDato();
?>
No suele ser lo adecuado, pero es correcto.


Código (php) [Seleccionar]
<?php
$dato 
'este es el dato';
 
function 
Mirar($argumento)
{
echo 
$argumento;
}
 
Mirar($dato);
?>
La opción más lógica. Crear una función que sirva para mirar el contenido de su argumento. Se puede añadir manejo de errores.


Código (php) [Seleccionar]
<?php
$argumentoAPasar 
'este es el dato';
 
function 
Mirar($argumento)
{
return 
$argumento;
}
 
$dato Mirar($argumentoAPasar);
echo 
$dato;
?>
Tiene sentido si se va a trabajar con el dato y modificarlo.

#!drvy

Tambien puedes usar funciones anonimas que hereden variables.

Código (php) [Seleccionar]
<?php

$sushi 
'maki';

$eat = function($nombre) use ($sushi) {
    echo 
$nombre' se esta comiendo un '$sushi;
};

$eat('Miguel'); // Miguel se esta comiendo un maki.



De todos modos, todo esto es mala práctica, una funcion deberia tomar argumentos y tener una salida. No heredar variables ni depender de externas. Si acaso, usa OOP.

https://en.wikipedia.org/wiki/Pure_function

Saludos