Curso PHP – 3. Tipos de datos

Español

Los tipos de datos establecen el formato en que se va a almacenar, operar e intercambiar información y establecen un contrato entre las diferentes partes de su aplicación ya que define como se interpretará la información que se intercambia entre una parte y otra. En los lenguajes tipeados también constituyen reglas de validación del sistema ya que se emitirá un error al tratar de asignar un valor de un tipo de dato a otro tipo, en el caso de PHP usted puede elegir este comportamiento al intercambiar información de una parte del sistema a otra, ya que que si puede definir el tipo de dato que va recibir como parámetro, una función determinada, no así a la hora de declarar las variables.

PHP soporta 10 tipos de datos primitivos

4 escalares

  • boleanos (boolean)
  • enteros (integer)
  • punto flotante (float)
  • cadena (string)

4 compuestos:

  • arreglos (array)
  • objetos (object)
  • llamada de retorno (callable)
  • iteradores (iterator)

2 especiales:

  • recurso (resource)
  • null

seudotipos:

  • mixed
  • number
  • void
  • callable
  • array|object
  • $…

El tipo de variable no se declara explícitamente sino que es decidido en tiempo de ejecución por el interprete de PHP dependiendo del contexto en el que se emplea dicha variable. Puede obtener información del tipo de dato de una variable usando la función gettype y la función var_dump, esta última muestra el tipo de dato y el valor. Para convertir explícitamente de un tipo de dato a otro use la sintaxis (amoldamiento) valor-a-convertir no obstante en la mayoría de los casos no es necesario la conversión explícita ya que un valor será convertido automáticamente si un operador, función o estructura de control requiere un argumento de un tipo determinado.

Los amoldamientos pueden ser:

  • bool, boolean: convierte a booleano
  • int, integer: convierte a entero
  • float, double, real: convierte a punto flotante
  • array: convierte a arreglo
  • object: convierte a objeto
  • unset: convierte a null

Booleanos

Este es el tipo más simple. Un booleano expresa un valor verdadero (true) o falso (false). A una variable de tipo boolean se le puede asignar las constantes true o false (estás constantes son insensibles a mayúsculas y minúsculas por tanto son valores válidos: TRUE, True, FALSE, False o cualquier combinación mayúscula/minúscula aunque es un estándar entre los desarrolladores de PHP usar siempre minúscula, también se le puede asignar el resultado de una operación matemática, lógica o el resultado de una función.

<?php
// Asignando la constante directamente
$habitable = true;
// Resultado de una operación lógica
$habitable = $planeta == 'Tierra';
$habitable = ($estrella == 'Sol') && ($numero == 3);
// Estructura de control if
if ($planeta == 'Tierra') {
    echo 'Habitable';
}
// Operación matemática
$par = $numero % 2 == 0;
function is_par($num) {
    return $num % 2 == 0;
}
// Resultado de una función
if (is_par(12)) {
    echo 'Par';
} else {
    echo 'Impar';
}

Cuando se realizan conversiones a boolean, los siguientes valores se consideran false:

  • el entero 0
  • el punto flotante 0.0
  • una cadena vacía: «», la cadena «0»
  • un arreglo vacío
  • el operador especial null
  • una variable que no esté definida

Tenga en cuenta que cuando se convierte a booleano la cadena false: (bool) 'false' y un objeto vacío: (bool) (new StdClass()) el resultado es true.

Para determinar si una variable o valor es de tipo bool use la función is_bool

<?php
is_bool(0); // false
is_bool(true); // true
is_bool(0 == ''); // true

Enteros

Los números enteros son un super conjunto de los números naturales o sea incluye los números positivos, su contrapartida negativa más el cero.

Los enteros pueden representarse en notación decimal (base 10: dígitos 0 – 9), notación hexadecimal (base 16: dígitos 0 – 9, letras A – F), notación octal (base 8: dígitos del 0 – 7), notación binaria (base 2: dígitos 0 – 1), veamos un ejemplo:

<?php
$a = 1234; // decimal
$a = -123; // decimal
$a = 0123; // octal = 83 decimal (3 x 8° + 2 x 8¹ + 1 x 8² = 3 + 16 + 64 = 83)
$a = 0x1A; // hexadecimal = 26 decimal (10 x 16° + 1 x 16¹ = 10 + 16 = 26)
$a = 0b11101; // binario = 29 decimal (1 x 2° + 0 x 2¹ + 1 x 2² + 1 + 2³ + 1 x 2⁴ = 1 + 0 + 4 + 8 + 16 = 29)

Desde el punto de vista matemático sabemos que el conjunto de los enteros es un conjunto infinito pero esto no sucede en el mundo de las computadoras donde los enteros son finitos y el tamaño máximo depende de la arquitectura (32 o 64 bits) en PHP puede determinar el tamaño mínimo y máximo que puede alcanzar un entero usando las constantes PHP_INT_MIN (disponible a partir de la version 7.0) y PHP_INT_MAX (disponible a partir de la versión 5.0) puede ver: constantes predefinidas para más información. Si el número entero sobrepasa los límites establecidos por PHP_INT_MIN y PHP_INT_MAX entonces PHP lo considera como punto flotante.

Las siguientes reglas se aplican al convertir a entero los siguientes tipos:

boolean

true = 1, false = 0

float

Cuando se convierte un float a un integer, el número será redondeado por defecto.

Si el float sobrepasa los límites establecidos por PHP_INT_MIN y PHP_INT_MAX el resultado es indefinido y no se emite ningún error ni ninguna advertencia.

cadena

Si el string no contiene ninguno de los caracteres ‘.’, ‘e’, o ‘E’, y el valor numérico está entre los límites PHP_INT_MIN y PHP_INT_MAX, el string será evaluado como un integer. En todos los demás casos será evaluado como un float.

Si el string empieza con un dato numérico válido, éste será el valor empleado. De lo contrario, el valor será 0 (cero) y se emitirá un warning.

<?php
$valor = 1 + "1";// $valor es 2
$valor = 1 + "bob3";// $valor es 1
$valor = 1 + "10 pequeños cerdos";// $valor es 11

Punto flotante

Un punto flotante es una notación cientifica que permite representar a un número real por ejemplo el precio de un producto, son representaciones válidas las siguientes:

<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;

El tamaño máximo de un punto flotante depende de la arquitectura y las constantes: PHP_FLOAT_MIN y PHP_FLOAT_MAX están disponibles partir de la versión 7.2 de PHP.

Cadena

Una cadena se relaciona con el lenguaje natural donde una letra representa un caracter, varios caracteres representan una palabra, varias palabras un oración, varias oraciones un párrafo y varios párrafos una composición. Existen 4 formas de representar a una cadena:

Comillas simple

Todo lo que esté entre comilla simple será analizado tal y como se representa, si quiere incluir una comilla simple debe anteponer el caracter \ (símbolo de escape)

<?php
echo 'Esto es una cadena sencilla';
echo 'Incluyendo una \' simple en la cadena';

Comillas dobles

Cuando una cadena está entre comillas dobles el analizador sintáctico realiza un proceso de interpolación o sea busca variables o secuencias de escape dentro de la cadena (una variable se define con el símbolo $ y una secuencia caracteres).

<?php
echo "Esto es una cadena sencilla con la secuencia de escape salto de línea\n";
$canal = 'LibreByte';
echo "Bienvenidos al canal $canal";

Heredoc

Una tercera forma de representar una cadena es mediante la sintaxis Heredoc: <<<. Después de este operador, se deberá proporcionar un identificador y justo después una nueva línea. A continuación va la cadena en si, y para cerrar la notación se pone el mismo identificador.

El identificador de cierre debe empezar en la primera columna de la nueva línea. Asimismo, el identificador debe contener solo caracteres alfanuméricos y guiones bajos, y debe empezar con un carácter alfabético o con un guión bajo.

Cuando el analizador sintáctico encuentra una notación heredoc también realiza un proceso de interpolación en busca de variables o secuencias de escape dentro de la cadena.

<?php
$blog = 'LibreByte';

echo <<<EOT
Bienvenidos a "$blog".
"$blog" es un blog/canal dedicado a la difusión del Software Libre.
EOT;

La ventaja de usar heredoc es que permite trabajar con fragmentos de cadena de una forma más cómoda y que permite usar comillas dobles sin necesidad de escaparlas.

La desventaja es que se rompe con la identación ya que no debe haber ningún espacio antes del identificador, este comportamiento cambia en PHP 7.3 el cual si permite identar el identificador de cierre.

<?php
$sql = <<<SQL
        SELECT col1, col2, col3 
        FROM table1 t1
        INNER JOIN table2 t2 ON t2.table1_id = t1.id
        SQL

Nowdoc

Un nowdoc se especifica de forma análoga a un heredoc, pero no se realiza ningún análisis dentro del nowdoc. La construcción es ideal para embeber código de PHP o grandes fragmentos de texto sin necesidad de escaparlos.

Un nowdoc se identifica con la misma secuencia empleada para heredoc, <<<, pero el identificador que le sigue está delimitado con comillas simples: <<<‘EOT’. Todas las reglas para los identificadores de heredoc también son aplicables a los identificadores de nowdoc, especialmente aquellas que se refieren al empleo del identificador de cierre.

<?php
$str = <<<'STR'
Ejemplo de un string
expandido en varias líneas
empleando la sintaxis nowdoc.
STR;

El soporte para nowdoc se añadió en PHP 5.3.0.

Análisis de variables

Cuando una cadena es representada mediante comillas dobles o mediante heredoc, las variables que haya dentro de dicho string se analizarán.

Existen dos tipos de sintaxis: una simple y otracompleja.

La sintaxis simple es la más empleada y práctica, proporciona una forma de embeber una variable, un valor de un array o una propiedad de un objecto dentro de un string con el mínimo esfuerzo.

La sintaxis compleja puede ser reconocida por las llaves que delimitan la expresión.

<?php
$table = 'table1';
$sql = <<<SQL
        SELECT col1, col2, col3
        /* Sintaxis simple */
        FROM $table t1
        /* Sintaxis compleja */
        INNER JOIN table2 t2 ON t2.{$table}_id = t1.id
        SQL;

Operaciones con cadenas

PHP permite concatenar, comparar, extraer subcadena dentro de otra cadena, determinar la posición de un caracter dentro de una cadena y más. Para más información consulte:
Cadenas de caracteres
Funciones de cadenas

Arreglos

Un arreglo es como un gavetero donde en cada gaveta podemos guardar cosas de diferentes tipos, si queremos encontrar algo dentro del gavetero podemos empezar por la primera gaveta e ir revisando una a una hasta encontrar lo que buscamos, este método funciona siempre que nuestro gavetero sea pequeño pero a medida que nuestro gavetero tiene más gavetas se hace cada vez más ineficiente, la solución sería ponerle etiquetas a cada gaveta así cada vez que buscamos algo vamos a la gaveta con la etiqueta correspondiente y encontraríamos más rápido lo buscado, también podemos establecer un determinado orden, por ejemplo alfabético, con el objetivo de acelerar la búsqueda, también dentro de una gaveta pudieramos tener gavetas más pequeña y establecer un determinado orden dentro de las mismas. Groso modo funciona los arreglos en PHP, las gavetas serían los elementos del arreglo, las etiquetas serían los índices, lo que guardamos dentro de las gavetas sería el valor del elemento y las gavetas más pequeñas un arreglo multidimensional. Un arreglo en PHP se define con la palabra clave array o con corchetes (notación corta).

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// a partir de PHP 5.4
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

// Arreglo de arreglo o arreglo multidimensional
$array = [
    [1, 2, 3, 4],
    ['A', 'B', 'C', 'D']
]

// Sintaxis alternativa
$array[] = 'A';
$array[] = 'B';
$array['nombre'] = 'Pepe';

En caso de no especificar un índice se considera el índice como númerico a partir de 0 y 1 como incremento.

La clave o índice puede ser de cualquier tipo excepto de tipo arreglo o de tipo objeto, en cuyo caso PHP lanzará una advertencia de: Illegal offset type. El valor puede ser de cualquier tipo.

PHP aplicará las siguientes reglas a la hora de operar con los índices.

  • Un cadena que contenga un entero válido será convertido a entero decimal, por ejemplo «8» será usado como 8 mientras que «08» será usado como la cadena «08», revise el tipo de datos entero para saber porque «08» no es un entero válido.

  • Un punto flotante también será convertido a entero, lo que significa que la parte fraccionaria se elimina, por ejemplo 8.7 en realidad será usado como 8.

  • Un booleano es amoldado a entero, es decir, la clave true en realidad será usada como 1 y la clave false como 0.

  • Un null será amoldado a un string vacío, es decir, la clave null sera convertida a «».

Si varios elementos en la declaración del array usan la misma clave, sólo se utilizará la última, siendo los demás valores sobrescritos.

Para acceder a un elemento de un arreglo debe usar la notación $array[indice] por ejemplo: $array[0][2] tiene el valor 3 en el ejemplo «Arreglo de arreglo»

Es posible aplicar operaciones de conjunto sobre un arreglo: suma, diferencia y unión.

Para cualquiera de los tipos: integer, float, string, boolean y resource, convertir un valor a un array resulta en un array con un solo elemento, con índice 0, y el valor del escalar que fue convertido.

Para más información sobre arreglos consultar:
Operadores para arrays

Funciones de arreglo

Objetos

Para entender que es un objeto pensemos en una plantilla, por ejemplo en el departamento de Recursos Humanos tenemos la plantilla Persona (que sería la clase), y esta plantilla tendría los siguientes datos: nombre, apellidos, fecha de nacimiento, sexo, fecha en que empezó a trabajar la persona, salario y vacaciones acumuladas (que sería una función que calcula los días acumulados en dependencia de los días trabajados y de la última fecha en que el trabajador cogió vacaciones) ahora necesitamos llenar esa información, por ejemplo: Pepe, Rodríguez, 03-04-1986, M, 02-05-2006, 790 USD y ese sería un objeto o sea una instancia de Persona, más adelante en el curso trataremos este tema con mayor detalle.

Iteradores

Un iterador es un seudotipo introducido en PHP 7.1 y se puede usar como tipo de parámetro para indicar que una función requiere un conjunto de valores, pero que no importa la forma de dicho conjunto ya que lo importante es que se pueda recorrer el conjunto de valores, pensemos en un disco de música en el cual usted puede escuchar desde la primera hasta la última pista en orden secuencial, ir a la primera o última pista, saltar a una pista determinada o abortar la escucha cuando lo desee, teniendo en cuenta lo anterior un arreglo también es de tipo iterable.

Llamadas de retorno

Vea Funciones anónimas en PHP y el video Programación avanzada en PHP – Funciones anónimas para que tenga una idea de como usar las funciones de llamada de retorno.

Recurso

Un recurso es una referencia a un sistema externo por ejemplo una conexión a una base de datos.

Null

El valor especial NULL representa una variable sin valor.

Una variable es considerada null si:

  • se le ha asignado la constante NULL.

  • no se le ha asignado un valor todavía.

  • se ha destruido con unset().

Sintaxis

<?php  
$var = null;  

La constante null es insensible a mayúsculas/minúsculas, es un estándar entre los desarrolladores usar siempre minúscula.

Véase también las funciones is_null() y unset().

Seudotipos

Los seudotipos sirven para especificar los tipos o valores que puede tener un argumento, se usan en la documentación de PHP, vea Core.php para un ejemplo y también pueden usarse en PHPDoc cuando esté documentando el código de su proyecto.

mixed

mixed indica que un parámetro puede aceptar múltiples tipos (pero no necesariamente todos).

gettype(), por ejemplo, puede aceptar todos los tipos de PHP, mientras que str_replace() sólo acepta strings y arrays.

number

number indica que un parámetro puede ser tanto un integer como un float.

callback (Llamadas de retorno)

Permite especificar que una función va a recibir un parámetro de tipo callback o callable.

array|object

array|object indica que un parámetro puede ser o un array o un object.

void

void, como tipo de retorno, significa que la función no debe devolver ningún valor. void, en una lista de parámetros, significa que la función no acepta ningún parámetro. A partir de PHP 7.1 void se puede usar para especificar el tipo de dato a retornar por una función.

$... se usa cuando una función puede tomar un número variable de argumentos.

Algunos de los seudotipos pueden usarse para especificar el tipo de parametros que va a recibir una función, ellos son: callable, array y object. Para tener más información al respecto consulte:

PHP 7 – Acelerando el desarrollo web

7 Características novedosas de PHP 7.1

5 nuevas características de PHP 7.2


YouTube video

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.