Y digo conceptos básicos porque están reflejados en las primeras páginas del manual, sin embargo no siempre son conocidos ni mucho menos usados, y es una pena, porque nos ahorraríamos muchas líneas de código y muchos tiempo depurando errores. Me gustaría empezar con dos propiedades básicas:
1º Una variable no definida es igual a NULL
Si a dicha variable se le asigna un valor, esta se convierte al tipo asignado por tanto:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Esto imprime NULL var_dump($expresion); // Esto imprime int(25) $expresion = 25; var_dump($expresion); // Esto imprime string(7) "abcd..." $expresion = 'abcd...'; var_dump($expresion); // Esto imprime object(stdClass)#1 (1) { ["foo"]=> string(11) "Hello World" } $miClase->foo = "Hello world"; var_dump($miClase); |
2º El ampersand (alternativa gráfica) sirve para referenciar una variable.
1 2 3 4 5 6 7 |
$foo = 'Hola'; $bar = &$foo; // Esto imprime "Hola", puesto que ahora $bar referencia a $foo echo $bar; |
Y ahora, si hicieramos:
1 2 3 4 5 6 |
$bar = 'Adios'; // Esto imprime "Adios" porque al cambiar el valor de $bar cambia el valor de $foo. echo $foo; |
Diría (y espero no estar equivocándome) que esto es lo más parecido a un puntero que podemos encontrar en PHP.
3º Variables que son variables (aquí es donde se lía parda)
1 2 3 4 5 6 |
$a = 'Hola'; $$a = 'mundo'; echo $a.' '.$$a; // Imprime "Hola mundo" echo "$a $$a"; // Imprime "Hola $Hola" porque imprime un $ y a continuación $a. echo "$a ${$a}"; // Imprime "Hola mundo" |
¿Qué hemos hecho? Pues… con $$a = ‘mundo’, hemos declarado una variable $Hola = ‘mundo’. De hecho si hacemos un «echo $Hola» mostraría «mundo». A priori puede parecer una curiosidad, poco más pero la verdad es que puede ser útil. Por ejemplo, dependiendo de un parámetro que muestre nuestra página en ingles o en castellano:
1 2 3 4 5 6 7 8 |
$miclase = new StdClass(); $miclase->eng = "Hello World"; $miclase->sp = "Hola Mundo"; $request = (isset($_GET['language'])) ? "eng" : "sp"; echo "{$miclase->$request}"; |
En este caso si language = sp imprimiría un «Hola Mundo» y si fuera eng imprimiría un «Hello World».
Hasta podemos definir una clase dependiendo de lo que nos venga, es peligroso, por supuesto, pero… ¡podemos hacerlo!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class sp extends stdClass { var $saludo = '¡Hola Mundo!'; var $despedida = '¡Adios!'; function getSaludo() { return $this->saludo; } function getDespedida() { return $this->despedida; } } class eng extends stdClass { var $saludo = 'Hello World!'; var $despedida = 'Goodbye!'; function getSaludo() { return $this->saludo; } function getDespedida() { return $this->despedida; } } $miClase = (isset($_GET['language'])) ? "eng" : "sp"; $foo = new $miClase(); echo "Nuevo {$foo->getSaludo()}"; |
Y por último, una curiosidad, podemos poner tantos «$» como nos dé la gana a una variable por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$Bar = "a"; $Foo = "Bar"; $World = "Foo"; $Hello = "World"; $a = "Hello"; echo $a; // Imprime "Hello" echo $$a; // Imprime "World" echo $$$a; // Imprime "Foo" echo $$$$a; // Imprime "Bar" echo $$$$$a; // Imprime "a" echo $$$$$$a; // Imprime "Hello" echo $$$$$$$a; // Imprime "World" |
Y así hasta el infinito y más allá
Comments are closed.