learnxinyminutes-docs/es/php.md

823 lines
19 KiB
Markdown
Raw Normal View History

2015-10-31 10:27:29 +00:00
---
contributors:
- ["Malcolm Fell", "http://emarref.net/"]
- ["Trismegiste", "https://github.com/Trismegiste"]
translators:
- ["Mario Pérez", "https://github.com/MarioPerezEsteso"]
filename: learnphp-es.php
---
2015-10-31 14:32:24 +00:00
Este documento explica el funcionamiento de PHP 5+.
2015-10-31 10:27:29 +00:00
```php
2015-10-31 14:32:24 +00:00
<?php // El código PHP debe estar dentro de etiquetas <?php
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Si tu fichero php solo contiene código php, es una buena práctica
// omitir la etiqueta de cierre php para prevenir salidas acidentales.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Dos barras comienzan un comentario de una línea.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
# También lo hará una almohadilla, pero // es más común
2015-10-31 10:27:29 +00:00
/*
2015-10-31 14:32:24 +00:00
Escribir texto entre una barra-asterisco y asterisco-barra
crea un comentario multilínea.
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
// Utiliza "echo" o "print" para imprimir por pantalla
print('Hola '); // Imprime "Hola " sin salto de línea
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// () son opcionales para print y echo
echo "Mundo\n"; // Imprime "Mundo" con un salto de línea
// (todas las sentencias deben finalizar con un punto y coma)
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Cualquier cosa fuera de las etiquetas <?php se imprime automáticamente
2015-10-31 10:27:29 +00:00
?>
2015-10-31 14:32:24 +00:00
¡Hola Mundo de nuevo!
2015-10-31 10:27:29 +00:00
<?php
/************************************
2015-10-31 14:32:24 +00:00
* Tipos y variables
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
// Las variables comienzan con el símbolo $.
// Una variable válida comienza con una letra o guión bajo,
// seguida de cualquier cantidad de letras, números o guiones bajos.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Las variables booleanas no distinguen entre mayúsculas o minúsculas
$boolean = true; // o TRUE o True
$boolean = false; // o FALSE o False
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Enteros
2015-10-31 10:27:29 +00:00
$int1 = 12; // => 12
$int2 = -12; // => -12
2015-10-31 14:32:24 +00:00
$int3 = 012; // => 10 (un 0 al comienzo declara un número octal)
$int4 = 0x0F; // => 15 (un 0x al comienzo declara un hexadecimal)
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Floats (también conocidos como doubles)
2015-10-31 10:27:29 +00:00
$float = 1.234;
$float = 1.2e3;
$float = 7E-10;
2015-10-31 14:32:24 +00:00
// Eliminar variable
2015-10-31 10:27:29 +00:00
unset($int1);
2015-10-31 14:32:24 +00:00
// Operaciones aritméticas
$suma = 1 + 1; // 2
$diferencia = 2 - 1; // 1
$producto = 2 * 2; // 4
$cociente = 2 / 1; // 2
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// 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
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Las cadenas de caracteres deben declararse entre comillas simples
2015-10-31 10:27:29 +00:00
$sgl_quotes = '$String'; // => '$String'
2015-10-31 14:32:24 +00:00
// Evita utilizar comillas dobles excepto para embeber otras variables
2015-10-31 10:27:29 +00:00
$dbl_quotes = "This is a $sgl_quotes."; // => 'This is a $String.'
2015-10-31 14:32:24 +00:00
// 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';
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Rodea una variable entre corchetes si es necesario
$dinero = "Tengo $${numero} en el banco.";
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Desde PHP 5.3, los nowdocs pueden ser utilizados para multilíneas no interpoladas
2015-10-31 10:27:29 +00:00
$nowdoc = <<<'END'
Multi line
string
END;
2015-10-31 14:32:24 +00:00
// Heredocs interpola cadenas de caracteres
2015-10-31 10:27:29 +00:00
$heredoc = <<<END
Multi line
$sgl_quotes
END;
2015-10-31 14:32:24 +00:00
// La concatenación de cadenas de caracteres se realiza con .
echo 'Esta cadena de caracteres ' . 'está concatenada';
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Las cadenas de caracteres pueden ser pasadas como parámetros en un echo
echo 'Multiples', 'Parametros', 'Validos'; // Devuelve 'MultiplesParametrosValidos'
2015-10-31 10:27:29 +00:00
/********************************
2015-10-31 14:32:24 +00:00
* Constantes
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
// Una constante se define utilizando define()
// y nunca puede ser cambiada en tiempo de ejecución
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// un nombre válido para una constante debe comenzar con una letra o guión bajo,
// seguido por cualquier número de letras, números o guiones bajos.
define("FOO", "algo");
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// el acceso a una constante se puede realizar llamando a la variable elegida sin un símbolo de $
echo FOO; // Devuelve 'algo'
echo 'Esto imprime '.FOO; // Devuelve 'Esto imprime algo'
2015-10-31 10:27:29 +00:00
/********************************
* Arrays
*/
2015-10-31 14:32:24 +00:00
// Todos los arrays en PHP son asociativos (hashmaps),
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Los arrays asociativos son conocidos como hashmaps en algunos lenguajes.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Funciona con todas las versiones de php
$asociativo = array('Uno' => 1, 'Dos' => 2, 'Tres' => 3);
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// PHP 5.4 introdujo una nueva sintaxis
$asociativo = ['Uno' => 1, 'Dos' => 2, 'Tres' => 3];
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
echo $asociativo['Uno']; // imprime 1
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Lista literales implícitamente asignados con claves enteras
$array = ['Uno', 'Dos', 'Tres'];
echo $array[0]; // => "Uno"
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Añadir un elemento al final de un array
$array[] = 'Cuatro';
// o
array_push($array, 'Cinco');
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Eliminar un elemento de un array
2015-10-31 10:27:29 +00:00
unset($array[3]);
/********************************
2015-10-31 14:32:24 +00:00
* Salidas por pantalla
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
echo('¡Hola Mundo!');
// Imprime ¡Hola Mundo! en stdout.
// Stdout es la página web si se está ejecutando en un navegador.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
print('!Hola Mundo!'); // Es lo mismo que echo
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// No es necesario el paréntesis en echo y print
echo '¡Hola Mundo!';
print '¡Hola Mundo!';
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
$parrafo = 'parrafo';
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
echo 100; // Haz echo de escalares directamente
echo $parrafo; // o de variables
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// 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
2015-10-31 10:27:29 +00:00
?>
2015-10-31 14:32:24 +00:00
<p><?= $parrafo?></p>
2015-10-31 10:27:29 +00:00
<?php
$x = 1;
$y = 2;
2015-10-31 14:32:24 +00:00
$x = $y; // $x ahora contiene el mismo valor que $y
2015-10-31 10:27:29 +00:00
$z = &$y;
2015-10-31 14:32:24 +00:00
// $z contiene ahora una referencia a $y. Un cambio en el valor de
// $z cambiará también el valor de $y, y viceversa.
// $x sin embargo, tendrá el valor original de $y
2015-10-31 10:27:29 +00:00
echo $x; // => 2
echo $z; // => 2
$y = 0;
echo $x; // => 2
echo $z; // => 0
2015-10-31 14:32:24 +00:00
// Dump muestra el tipo y valor de una variable en stdout
var_dump($z); // imprime int(0)
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Para mostrar el valor de una variable en un formato legible para humanos
print_r($array); // imprime: Array ( [0] => Uno [1] => Dos [2] => Tres )
2015-10-31 10:27:29 +00:00
/********************************
2015-10-31 14:32:24 +00:00
* Lógica
2015-10-31 10:27:29 +00:00
*/
$a = 0;
$b = '0';
$c = '1';
$d = '1';
2015-10-31 14:32:24 +00:00
// assert lanza una advertencia si su argumento no es verdadero
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// 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
2015-10-31 10:27:29 +00:00
assert($a < $c);
assert($c > $b);
assert($a <= $b);
assert($c >= $d);
2015-10-31 14:32:24 +00:00
// Los siguiente solo será verdadero si los valores coinciden y son del mismo tipo.
2015-10-31 10:27:29 +00:00
assert($c === $d);
assert($a !== $d);
assert(1 === '1');
assert(1 !== '1');
2015-10-31 14:32:24 +00:00
// 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
2015-10-31 10:27:29 +00:00
$a = 100;
$b = 1000;
2015-10-31 14:32:24 +00:00
echo $a <=> $a; // 0 porque son iguales
echo $a <=> $b; // -1 porque $a < $b
echo $b <=> $a; // 1 porque $b > $a
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Las variables pueden ser convertidas entre tipos, dependiendo de su uso.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
$entero = 1;
echo $entero + $entero; // => 2
2015-10-31 10:27:29 +00:00
$string = '1';
2015-10-31 14:32:24 +00:00
echo $string + $string; // => 2 (los strings son convertidos a enteros)
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
$string = 'uno';
2015-10-31 10:27:29 +00:00
echo $string + $string; // => 0
2015-10-31 14:32:24 +00:00
// Muestra un 0 porque el operador + no puede convertir la cadena de caracteres 'uno' a un número
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// La conversión de tipos puede ser utilizada para tratar a una variable como otro tipo
2015-10-31 10:27:29 +00:00
$boolean = (boolean) 1; // => true
2015-10-31 14:32:24 +00:00
$cero = 0;
$boolean = (boolean) $cero; // => false
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// También hay funciones dedicadas a la conversión de tipos
$entero = 5;
$string = strval($entero);
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
$var = null; // Valor nulo
2015-10-31 10:27:29 +00:00
/********************************
2015-10-31 14:32:24 +00:00
* Estructuras de control
2015-10-31 10:27:29 +00:00
*/
if (true) {
2015-10-31 14:32:24 +00:00
print 'He sido imprimido';
2015-10-31 10:27:29 +00:00
}
if (false) {
2015-10-31 14:32:24 +00:00
print 'Yo no';
2015-10-31 10:27:29 +00:00
} else {
2015-10-31 14:32:24 +00:00
print 'He sido imprimido';
2015-10-31 10:27:29 +00:00
}
if (false) {
2015-10-31 14:32:24 +00:00
print 'No se imprime';
2015-10-31 10:27:29 +00:00
} elseif(true) {
2015-10-31 14:32:24 +00:00
print 'Sí se imprime';
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
// operador ternario
print (false ? 'No se imprime' : 'Sí se imprime');
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// atajo para el operador ternario desde PHP 5.3
// equivalente de "$x ? $x : 'Sí'""
2015-10-31 10:27:29 +00:00
$x = false;
2015-10-31 14:32:24 +00:00
print($x ?: 'Sí');
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// operador 'no definido' desde php 7
2015-10-31 10:27:29 +00:00
$a = null;
2015-10-31 14:32:24 +00:00
$b = 'Imprime';
echo $a ?? 'a no está definido'; // imprime 'a no está definido'
echo $b ?? 'b no está definido'; // imprime 'Imprime'
2015-10-31 10:27:29 +00:00
$x = 0;
if ($x === '0') {
2015-10-31 14:32:24 +00:00
print 'No imprime';
2015-10-31 10:27:29 +00:00
} elseif($x == '1') {
2015-10-31 14:32:24 +00:00
print 'No imprime';
2015-10-31 10:27:29 +00:00
} else {
2015-10-31 14:32:24 +00:00
print 'Imprime';
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
// Esta sintaxis alternativa se utiliza para plantillas:
2015-10-31 10:27:29 +00:00
?>
<?php if ($x): ?>
2015-10-31 14:32:24 +00:00
Esto se muestra si la evaluación es verdadera.
2015-10-31 10:27:29 +00:00
<?php else: ?>
2015-10-31 14:32:24 +00:00
En otro caso, se muestra esto.
2015-10-31 10:27:29 +00:00
<?php endif; ?>
<?php
2015-10-31 14:32:24 +00:00
// Utiliza el switch para tener algo más de lógica.
2015-10-31 10:27:29 +00:00
switch ($x) {
case '0':
print 'Switch does type coercion';
2015-10-31 14:32:24 +00:00
break; // Debes incluir un break para no seguir con los casos 'Dos' y 'Tres'
case 'Dos':
case 'Tres':
// Hacer algo si la variables es 'Dos' o 'Tres'
2015-10-31 10:27:29 +00:00
break;
default:
2015-10-31 14:32:24 +00:00
// Hacer algo por defecto
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
// Los bucles While, do...while y for te serán familiares
2015-10-31 10:27:29 +00:00
$i = 0;
while ($i < 5) {
echo $i++;
2015-10-31 14:32:24 +00:00
}; // Imprime "01234"
2015-10-31 10:27:29 +00:00
echo "\n";
$i = 0;
do {
echo $i++;
2015-10-31 14:32:24 +00:00
} while ($i < 5); // Imprime "01234"
2015-10-31 10:27:29 +00:00
echo "\n";
for ($x = 0; $x < 10; $x++) {
echo $x;
2015-10-31 14:32:24 +00:00
} // Imprime "0123456789"
2015-10-31 10:27:29 +00:00
echo "\n";
2015-10-31 14:32:24 +00:00
$ruedas = ['bicicleta' => 2, 'coche' => 4];
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Los bucles foreach pueden iterar por arrays
foreach ($ruedas as $numero_ruedas) {
echo $numero_ruedas;
} // Imprime "24"
2015-10-31 10:27:29 +00:00
echo "\n";
2015-10-31 14:32:24 +00:00
// 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";
2015-10-31 10:27:29 +00:00
}
echo "\n";
$i = 0;
while ($i < 5) {
if ($i === 3) {
2015-10-31 14:32:24 +00:00
break; // Sale fuera del bucle while
2015-10-31 10:27:29 +00:00
}
echo $i++;
2015-10-31 14:32:24 +00:00
} // Imprime "012"
2015-10-31 10:27:29 +00:00
for ($i = 0; $i < 5; $i++) {
if ($i === 3) {
2015-10-31 14:32:24 +00:00
continue; // Se salta esta iteración del bucle
2015-10-31 10:27:29 +00:00
}
echo $i;
2015-10-31 14:32:24 +00:00
} // Imprime "0124"
2015-10-31 10:27:29 +00:00
/********************************
2015-10-31 14:32:24 +00:00
* Funciones
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
// Define una función con "function":
function mi_funcion () {
return 'Hola';
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
echo mi_funcion(); // => "Hola"
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// 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.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
function anadir ($x, $y = 1) { // $y es opcional y por defecto es 1
$resultado = $x + $y;
return $resultado;
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
echo anadir(4); // => 5
echo anadir(4, 2); // => 6
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// $resultado no es accesible fuera de la función
// print $resultado; // Devuelve una advertencia.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Desde PHP 5.3 se pueden declarar funciones anónimas
2015-10-31 10:27:29 +00:00
$inc = function ($x) {
return $x + 1;
};
echo $inc(2); // => 3
function foo ($x, $y, $z) {
echo "$x - $y - $z";
}
2015-10-31 14:32:24 +00:00
// Las funciones pueden devolver funciones
2015-10-31 10:27:29 +00:00
function bar ($x, $y) {
2015-10-31 14:32:24 +00:00
// Utiliza 'use' para meter variables de fuera de la función
2015-10-31 10:27:29 +00:00
return function ($z) use ($x, $y) {
foo($x, $y, $z);
};
}
$bar = bar('A', 'B');
2015-10-31 14:32:24 +00:00
$bar('C'); // Imprime "A - B - C"
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// 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 [, ... ]]);
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Puedes obtener todos los parámetros pasados a una función
function parametros() {
$numero_argumentos = func_num_args();
if ($numero_argumentos > 0) {
2015-10-31 10:27:29 +00:00
echo func_get_arg(0) . ' | ';
}
$args_array = func_get_args();
foreach ($args_array as $key => $arg) {
echo $key . ' - ' . $arg . ' | ';
}
}
2015-10-31 14:32:24 +00:00
parametros('Hola', 'Mundo'); // Hola | 0 - Hola | 1 - Mundo |
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Desde PHP 5.6 se puede obtener un número variable de argumentos
function variable($palabra, ...$lista) {
echo $palabra . " || ";
foreach ($lista as $item) {
2015-10-31 10:27:29 +00:00
echo $item . ' | ';
}
}
2015-10-31 14:32:24 +00:00
variable("Separa", "Hola", "Mundo") // Separa || Hola | Mundo |
2015-10-31 10:27:29 +00:00
/********************************
* Includes
*/
<?php
2015-10-31 14:32:24 +00:00
// Los ficheros PHP incluidos deben comenzar también con la etiqueta de <?php
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
include 'mi-fichero.php';
// El código de mi-fichero.php ya está disponible en el entorno actual.
// Si el fichero no puede ser incluido (por ejemplo porque no se ha encontrado),
// se muestra una advertencia.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
include_once 'mi-fichero.php';
// Si el código del fichero mi-fichero.php ya ha sido incluido, ya no se
// incluirá de nuevo. Este previene errores por múltiples declaraciones.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
require 'mi-fichero.php';
require_once 'mi-fichero.php';
// Es lo mismo que el include(), pero require() causará un error fatal si el archivo
// no ha podido ser incluido.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Contenido de mi-include.php:
2015-10-31 10:27:29 +00:00
<?php
2015-10-31 14:32:24 +00:00
return 'Cualquier cosa.';
// acabar archivo
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Los include y require también pueden devolver un valor.
$valor = include 'mi-include.php';
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Los archivos son incluidos en función de la ruta data o, si ninguna ruta es
// especificada se utilizará la directiva de configuración de include_path. Si el
// fichero no se encuentra en el include_path, include comprobará la ruta del código
// que lo llama antes de fallar.
2015-10-31 10:27:29 +00:00
/* */
/********************************
2015-10-31 14:32:24 +00:00
* Clases
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
// Las clases son definidas con la palabra clave class
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
class MiClase
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
const MI_CONSTANTE = 'valor'; // Una constante
2015-10-31 10:27:29 +00:00
static $staticVar = 'static';
2015-10-31 14:32:24 +00:00
// Las variables estáticas y su visibilidad
2015-10-31 10:27:29 +00:00
public static $publicStaticVar = 'publicStatic';
2015-10-31 14:32:24 +00:00
// Accesible solo dentro de su clase
2015-10-31 10:27:29 +00:00
private static $privateStaticVar = 'privateStatic';
2015-10-31 14:32:24 +00:00
// Accesible desde la clase y las subclases
2015-10-31 10:27:29 +00:00
protected static $protectedStaticVar = 'protectedStatic';
2015-10-31 14:32:24 +00:00
// Las propiedades deben declarar su visibilidad
public $propiedad = 'public';
2015-10-31 10:27:29 +00:00
public $instanceProp;
2015-10-31 14:32:24 +00:00
protected $prot = 'protected'; // Accesible desde la clase y las subclases
private $priv = 'private'; // Accesible solo desde la clase
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Crear un constructor con __construct
2015-10-31 10:27:29 +00:00
public function __construct($instanceProp) {
2015-10-31 14:32:24 +00:00
// Accede a las variables de la instancia con $this
2015-10-31 10:27:29 +00:00
$this->instanceProp = $instanceProp;
}
2015-10-31 14:32:24 +00:00
// Los métodos son declarados como funciones dentro de una clase
public function miMetodo()
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
print 'MiClase';
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
// la palabra clave final hará una función no sobreescribible
final function noMePuedesSobreEscribir()
2015-10-31 10:27:29 +00:00
{
}
/*
2015-10-31 14:32:24 +00:00
* 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.
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
public static function miMetodoEstatico()
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
print 'Soy estático';
2015-10-31 10:27:29 +00:00
}
}
2015-10-31 14:32:24 +00:00
// Las constantes de una clase siempre pueden ser accedidas estáticamente
echo MiClase::MI_CONSTANTE; // Muestra 'valor';
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
echo MiClase::$staticVar; // Muestra 'static';
MiClase::miMetodoEstatico(); // Muestra 'Soy estático';
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Instancia una clase usando new
$mi_clase = new MiClase('Una instancia');
// Los paréntesis son opcionales si no se pasa ningún argumento.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Accede a los miembros de una clase utilizando ->
echo $mi_clase->propiedad; // => "public"
echo $mi_clase->instanceProp; // => "Una instancia"
$mi_clase->miMetodo(); // => "MiClase"
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Extender clases utilizando "extends"
class MiOtraClase extends MiClase
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
function imprimePropiedadProtegida()
2015-10-31 10:27:29 +00:00
{
echo $this->prot;
}
2015-10-31 14:32:24 +00:00
// Sobreescribe un método
function miMetodo()
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
parent::miMetodo();
print ' > MiOtraClase';
2015-10-31 10:27:29 +00:00
}
}
2015-10-31 14:32:24 +00:00
$mi_otra_clase = new MiOtraClase('Propiedad de instancia');
$mi_otra_clase->imprimePropiedadProtegida(); // => Imprime "protected"
$mi_otra_clase->miMetodo(); // Imprime "MiClase > MiOtraClase"
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
final class NoMePuedesExtender
2015-10-31 10:27:29 +00:00
{
}
2015-10-31 14:32:24 +00:00
// Puedes utilizar "métodos mágicos" para crear los getters y setters
class MiClaseMapeada
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
private $propiedad;
2015-10-31 10:27:29 +00:00
public function __get($key)
{
return $this->$key;
}
public function __set($key, $value)
{
$this->$key = $value;
}
}
2015-10-31 14:32:24 +00:00
$x = new MiClaseMapeada();
echo $x->propiedad; // Utilizará el método __get()
$x->propiedad = 'Algo'; // Utilizará el método __set()
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// 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.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
interface InterfazUno
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
public function hazAlgo();
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
interface InterfazDos
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
public function hazOtraCosa();
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
// las interfaces pueden ser extendidas
interface InterfazTres extends InterfazDos
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
public function hazCualquierOtraCosa();
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
abstract class MiClaseAbstracta implements InterfazUno
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
public $x = 'hazAlgo';
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
class MiOtraClase extends MiClaseAbstracta implements InterfazDos
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
public function hazAlgo()
2015-10-31 10:27:29 +00:00
{
echo $x;
}
2015-10-31 14:32:24 +00:00
public function hazOtraCosa()
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
echo 'hazOtraCosa';
2015-10-31 10:27:29 +00:00
}
}
2015-10-31 14:32:24 +00:00
// Las clases pueden implementar más de una interfaz
class CualquierOtraClase implements InterfazUno, InterfazDos
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
public function hazAlgo()
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
echo 'hazAlgo';
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
public function hazOtraCosa()
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
echo 'hazOtraCosa';
2015-10-31 10:27:29 +00:00
}
}
/********************************
* Traits
*/
2015-10-31 14:32:24 +00:00
// Los traits están disponibles desde PHP 5.4.0 y son declarados utilizando "trait"
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
trait MiTrait
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
public function miMetodoTrait()
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
print 'Tengo trait';
2015-10-31 10:27:29 +00:00
}
}
2015-10-31 14:32:24 +00:00
class MiClaseTrait
2015-10-31 10:27:29 +00:00
{
2015-10-31 14:32:24 +00:00
use MiTrait;
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
$cls = new MiClaseTrait();
$cls->miMetodoTrait(); // Imprime "Tengo trait"
2015-10-31 10:27:29 +00:00
/********************************
* Namespaces
*/
2015-10-31 14:32:24 +00:00
// 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
2015-10-31 10:27:29 +00:00
<?php
2015-10-31 14:32:24 +00:00
// Por defecto, las clases existen en el namespace global y pueden ser llamadas
// explícitamente con una contrabarra.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
$cls = new \MiClase();
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// Estableder el namespace para un archivo
namespace Mi\Namespace;
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
class MiClase
2015-10-31 10:27:29 +00:00
{
}
2015-10-31 14:32:24 +00:00
// (de otro archivo)
$cls = new Mi\Namespace\MiClase;
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// O de otro namespace.
namespace Mi\Otro\Namespace;
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
use Mi\Namespace\MiClase;
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
$cls = new MiClase();
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
// O se puede asignar un ales al namespace
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
namespace Mi\Otro\Namespace;
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
use Mi\Namespace as OtroNamespace;
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
$cls = new OtroNamespace\MiClase();
2015-10-31 10:27:29 +00:00
/**********************
* Late Static Binding
*
*/
2015-10-31 14:32:24 +00:00
class ClasePadre {
public static function quien() {
echo "Soy una " . __CLASS__ . "\n";
2015-10-31 10:27:29 +00:00
}
public static function test() {
2015-10-31 14:32:24 +00:00
// Auto referencia a la clase en la que el método está definido
self::quien();
// Referencia estáticamente a la clase donde el método ha sido llamado
static::quien();
2015-10-31 10:27:29 +00:00
}
}
2015-10-31 14:32:24 +00:00
ClasePadre::test();
2015-10-31 10:27:29 +00:00
/*
2015-10-31 14:32:24 +00:00
Soy una ClasePadre
Soy una ClasePadre
2015-10-31 10:27:29 +00:00
*/
2015-10-31 14:32:24 +00:00
class ClaseHija extends ClasePadre {
public static function quien() {
echo "Pero soy una " . __CLASS__ . "\n";
2015-10-31 10:27:29 +00:00
}
}
2015-10-31 14:32:24 +00:00
ClaseHija::test();
2015-10-31 10:27:29 +00:00
/*
2015-10-31 14:32:24 +00:00
Soy una ClasePadre
Pero soy una ClaseHija
2015-10-31 10:27:29 +00:00
*/
/**********************
2015-10-31 14:32:24 +00:00
* Manejo de errores
2015-10-31 10:27:29 +00:00
*
*/
2015-10-31 14:32:24 +00:00
// Una simple gestión de errores puede ser realizada con un bloque try catch
2015-10-31 10:27:29 +00:00
try {
2015-10-31 14:32:24 +00:00
// Haz algo
2015-10-31 10:27:29 +00:00
} catch (Exception $e) {
2015-10-31 14:32:24 +00:00
// Maneja la excepción
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
// Cuando se utilicen bloques try catch en un entorno con namespaces hay que
// usar lo siguiente
2015-10-31 10:27:29 +00:00
try {
2015-10-31 14:32:24 +00:00
// Haz algo
2015-10-31 10:27:29 +00:00
} catch (\Exception $e) {
2015-10-31 14:32:24 +00:00
// Maneja la excepción
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
// Excepciones personalizadas
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
class MiExcepcion extends Exception {}
2015-10-31 10:27:29 +00:00
try {
2015-10-31 14:32:24 +00:00
$condicion = true;
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
if ($condicion) {
throw new MiExcepcion('Ha pasado algo');
2015-10-31 10:27:29 +00:00
}
2015-10-31 14:32:24 +00:00
} catch (MiExcepcion $e) {
// Manejar la excepción
2015-10-31 10:27:29 +00:00
}
```
2015-10-31 14:32:24 +00:00
## Más información
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
Visita la [documentación oficial de PHP](http://www.php.net/manual/) para más referencias
y apoyo de la comunidad.
2015-10-31 10:27:29 +00:00
2015-10-31 14:32:24 +00:00
Si estás interesado en buenas prácticas, visita
2015-10-31 10:27:29 +00:00
[PHP The Right Way](http://www.phptherightway.com/).
2015-10-31 14:32:24 +00:00
Si vienes de un lenguaje con una buena gestión de paquetes, visita
2015-10-31 10:27:29 +00:00
[Composer](http://getcomposer.org/).
2015-10-31 14:32:24 +00:00
Para estándares comunes, visita el PHP Framework Interoperability Group
2015-10-31 10:27:29 +00:00
[PSR standards](https://github.com/php-fig/fig-standards).