--- contributors: - ["Malcolm Fell", "http://emarref.net/"] - ["Trismegiste", "https://github.com/Trismegiste"] translators: - ["Mario Pérez", "https://github.com/MarioPerezEsteso"] filename: learnphp-es.php --- Este documento explica el funcionamiento de PHP 5+. ```php ¡Hola Mundo de nuevo! 12 $int2 = -12; // => -12 $int3 = 012; // => 10 (un 0 al comienzo declara un número octal) $int4 = 0x0F; // => 15 (un 0x al comienzo declara un hexadecimal) // Floats (también conocidos como doubles) $float = 1.234; $float = 1.2e3; $float = 7E-10; // Eliminar variable unset($int1); // Operaciones aritméticas $suma = 1 + 1; // 2 $diferencia = 2 - 1; // 1 $producto = 2 * 2; // 4 $cociente = 2 / 1; // 2 // Operaciones aritméticas de escritura rápida $numero = 0; $numero += 1; // Incrementa $numero en 1 echo $numero++; // Imprime 1 (incremento después la evaluación) echo ++$numero; // Imprime 3 (incremento antes de la evaluación) $numero /= $float; // Divide y asigna el cociente a $numero // Las cadenas de caracteres deben declararse entre comillas simples $sgl_quotes = '$String'; // => '$String' // Evita utilizar comillas dobles excepto para embeber otras variables $dbl_quotes = "This is a $sgl_quotes."; // => 'This is a $String.' // Los caracteres especiales solo son válidos entre comillas dobles $escaped = "Esto contiene \t un caracter tabulador."; $unescaped = 'Esto solo contiene una barra y una t: \t'; // Rodea una variable entre corchetes si es necesario $dinero = "Tengo $${numero} en el banco."; // Desde PHP 5.3, los nowdocs pueden ser utilizados para multilíneas no interpoladas $nowdoc = <<<'END' Multi line string END; // Heredocs interpola cadenas de caracteres $heredoc = << 1, 'Dos' => 2, 'Tres' => 3); // PHP 5.4 introdujo una nueva sintaxis $asociativo = ['Uno' => 1, 'Dos' => 2, 'Tres' => 3]; echo $asociativo['Uno']; // imprime 1 // Lista literales implícitamente asignados con claves enteras $array = ['Uno', 'Dos', 'Tres']; echo $array[0]; // => "Uno" // Añadir un elemento al final de un array $array[] = 'Cuatro'; // o array_push($array, 'Cinco'); // Eliminar un elemento de un array unset($array[3]); /******************************** * Salidas por pantalla */ echo('¡Hola Mundo!'); // Imprime ¡Hola Mundo! en stdout. // Stdout es la página web si se está ejecutando en un navegador. print('!Hola Mundo!'); // Es lo mismo que echo // No es necesario el paréntesis en echo y print echo '¡Hola Mundo!'; print '¡Hola Mundo!'; $parrafo = 'parrafo'; echo 100; // Haz echo de escalares directamente echo $parrafo; // o de variables // Si las etiquetas cortas estás configuradas y tu versión de PHP es // la 5.4.0 o superior, puede utilizar la sintaxis abreviada de echo ?>

2 echo $z; // => 2 $y = 0; echo $x; // => 2 echo $z; // => 0 // Dump muestra el tipo y valor de una variable en stdout var_dump($z); // imprime int(0) // Para mostrar el valor de una variable en un formato legible para humanos print_r($array); // imprime: Array ( [0] => Uno [1] => Dos [2] => Tres ) /******************************** * Lógica */ $a = 0; $b = '0'; $c = '1'; $d = '1'; // assert lanza una advertencia si su argumento no es verdadero // Estas comparaciones siempre serán verdaderas, incluso si los tipos no son los mismos. assert($a == $b); // igualdad assert($c != $a); // desigualdad assert($c <> $a); // desigualdad alternativa assert($a < $c); assert($c > $b); assert($a <= $b); assert($c >= $d); // Los siguiente solo será verdadero si los valores coinciden y son del mismo tipo. assert($c === $d); assert($a !== $d); assert(1 === '1'); assert(1 !== '1'); // Operador 'Spaceship' (desde PHP 7) // Devuelve 0 si ambos valores son iguales // Devuelve 1 si el valor de la izquierda es mayor // Devuelve -1 si el valor de la derecha es mayor $a = 100; $b = 1000; echo $a <=> $a; // 0 porque son iguales echo $a <=> $b; // -1 porque $a < $b echo $b <=> $a; // 1 porque $b > $a // Las variables pueden ser convertidas entre tipos, dependiendo de su uso. $entero = 1; echo $entero + $entero; // => 2 $string = '1'; echo $string + $string; // => 2 (los strings son convertidos a enteros) $string = 'uno'; echo $string + $string; // => 0 // Muestra un 0 porque el operador + no puede convertir la cadena de caracteres 'uno' a un número // La conversión de tipos puede ser utilizada para tratar a una variable como otro tipo $boolean = (boolean) 1; // => true $cero = 0; $boolean = (boolean) $cero; // => false // También hay funciones dedicadas a la conversión de tipos $entero = 5; $string = strval($entero); $var = null; // Valor nulo /******************************** * Estructuras de control */ if (true) { print 'He sido imprimido'; } if (false) { print 'Yo no'; } else { print 'He sido imprimido'; } if (false) { print 'No se imprime'; } elseif(true) { print 'Sí se imprime'; } // operador ternario print (false ? 'No se imprime' : 'Sí se imprime'); // atajo para el operador ternario desde PHP 5.3 // equivalente de "$x ? $x : 'Sí'"" $x = false; print($x ?: 'Sí'); // operador 'no definido' desde php 7 $a = null; $b = 'Imprime'; echo $a ?? 'a no está definido'; // imprime 'a no está definido' echo $b ?? 'b no está definido'; // imprime 'Imprime' $x = 0; if ($x === '0') { print 'No imprime'; } elseif($x == '1') { print 'No imprime'; } else { print 'Imprime'; } // Esta sintaxis alternativa se utiliza para plantillas: ?> Esto se muestra si la evaluación es verdadera. En otro caso, se muestra esto. 2, 'coche' => 4]; // Los bucles foreach pueden iterar por arrays foreach ($ruedas as $numero_ruedas) { echo $numero_ruedas; } // Imprime "24" echo "\n"; // También se puede iterar sobre las claves, así como sobre los valores foreach ($ruedas as $vehiculo => $numero_ruedas) { echo "Un $vehiculo tiene $numero_ruedas ruedas"; } echo "\n"; $i = 0; while ($i < 5) { if ($i === 3) { break; // Sale fuera del bucle while } echo $i++; } // Imprime "012" for ($i = 0; $i < 5; $i++) { if ($i === 3) { continue; // Se salta esta iteración del bucle } echo $i; } // Imprime "0124" /******************************** * Funciones */ // Define una función con "function": function mi_funcion () { return 'Hola'; } echo mi_funcion(); // => "Hola" // Un nombre válido de función comienza con una letra o guión bajo, seguido de cualquier // número de letras, números o guiones bajos. function anadir ($x, $y = 1) { // $y es opcional y por defecto es 1 $resultado = $x + $y; return $resultado; } echo anadir(4); // => 5 echo anadir(4, 2); // => 6 // $resultado no es accesible fuera de la función // print $resultado; // Devuelve una advertencia. // Desde PHP 5.3 se pueden declarar funciones anónimas $inc = function ($x) { return $x + 1; }; echo $inc(2); // => 3 function foo ($x, $y, $z) { echo "$x - $y - $z"; } // Las funciones pueden devolver funciones function bar ($x, $y) { // Utiliza 'use' para meter variables de fuera de la función return function ($z) use ($x, $y) { foo($x, $y, $z); }; } $bar = bar('A', 'B'); $bar('C'); // Imprime "A - B - C" // Puedes llamar a funciones utilizando cadenas de caracteres $nombre_funcion = 'add'; echo $nombre_funcion(1, 2); // => 3 // Es útil para determinarl qué función ejecutar. // O, utiliza call_user_func(callable $callback [, $parameter [, ... ]]); // Puedes obtener todos los parámetros pasados a una función function parametros() { $numero_argumentos = func_num_args(); if ($numero_argumentos > 0) { echo func_get_arg(0) . ' | '; } $args_array = func_get_args(); foreach ($args_array as $key => $arg) { echo $key . ' - ' . $arg . ' | '; } } parametros('Hola', 'Mundo'); // Hola | 0 - Hola | 1 - Mundo | // Desde PHP 5.6 se puede obtener un número variable de argumentos function variable($palabra, ...$lista) { echo $palabra . " || "; foreach ($lista as $item) { echo $item . ' | '; } } variable("Separa", "Hola", "Mundo") // Separa || Hola | Mundo | /******************************** * Includes */ instanceProp = $instanceProp; } // Los métodos son declarados como funciones dentro de una clase public function miMetodo() { print 'MiClase'; } // la palabra clave final hará una función no sobreescribible final function noMePuedesSobreEscribir() { } /* * Declarar propiedades de clase o métodos como estáticos los hace accesibles sin * necesidad de instanciar la clase. Una propiedad declarada como estática no * puede ser accedida mediante una instancia de la clase, pero sí mediante un * método estático. */ public static function miMetodoEstatico() { print 'Soy estático'; } } // Las constantes de una clase siempre pueden ser accedidas estáticamente echo MiClase::MI_CONSTANTE; // Muestra 'valor'; echo MiClase::$staticVar; // Muestra 'static'; MiClase::miMetodoEstatico(); // Muestra 'Soy estático'; // Instancia una clase usando new $mi_clase = new MiClase('Una instancia'); // Los paréntesis son opcionales si no se pasa ningún argumento. // Accede a los miembros de una clase utilizando -> echo $mi_clase->propiedad; // => "public" echo $mi_clase->instanceProp; // => "Una instancia" $mi_clase->miMetodo(); // => "MiClase" // Extender clases utilizando "extends" class MiOtraClase extends MiClase { function imprimePropiedadProtegida() { echo $this->prot; } // Sobreescribe un método function miMetodo() { parent::miMetodo(); print ' > MiOtraClase'; } } $mi_otra_clase = new MiOtraClase('Propiedad de instancia'); $mi_otra_clase->imprimePropiedadProtegida(); // => Imprime "protected" $mi_otra_clase->miMetodo(); // Imprime "MiClase > MiOtraClase" final class NoMePuedesExtender { } // Puedes utilizar "métodos mágicos" para crear los getters y setters class MiClaseMapeada { private $propiedad; public function __get($key) { return $this->$key; } public function __set($key, $value) { $this->$key = $value; } } $x = new MiClaseMapeada(); echo $x->propiedad; // Utilizará el método __get() $x->propiedad = 'Algo'; // Utilizará el método __set() // Las clases pueden ser abstractas (utilizando la palabra clave abstract) o // implementando interfaces (utilizando la palabra clave implements). // Una interfaz puede ser declarada con la palabra clave interface. interface InterfazUno { public function hazAlgo(); } interface InterfazDos { public function hazOtraCosa(); } // las interfaces pueden ser extendidas interface InterfazTres extends InterfazDos { public function hazCualquierOtraCosa(); } abstract class MiClaseAbstracta implements InterfazUno { public $x = 'hazAlgo'; } class MiOtraClase extends MiClaseAbstracta implements InterfazDos { public function hazAlgo() { echo $x; } public function hazOtraCosa() { echo 'hazOtraCosa'; } } // Las clases pueden implementar más de una interfaz class CualquierOtraClase implements InterfazUno, InterfazDos { public function hazAlgo() { echo 'hazAlgo'; } public function hazOtraCosa() { echo 'hazOtraCosa'; } } /******************************** * Traits */ // Los traits están disponibles desde PHP 5.4.0 y son declarados utilizando "trait" trait MiTrait { public function miMetodoTrait() { print 'Tengo trait'; } } class MiClaseTrait { use MiTrait; } $cls = new MiClaseTrait(); $cls->miMetodoTrait(); // Imprime "Tengo trait" /******************************** * Namespaces */ // Esta sección está separada porque una declaración de namespace debe // ser la primera sentencia en un archivo. Vamos a suponer que no es el caso