Tipos
PHP Manual

Cadenas

Un string es una serie de caracteres, y por lo tanto, un caracter es lo mismo que un byte. Es decir, hay exactamente 256 diferentes caracteres posibles. Esto implica tambien que PHP no tiene soporte nativo para Unicode. Consulte utf8_encode() y utf8_decode() para informarse de la funcionalidad básica de Unicode.

Note: No existe problema alguno para que un string sea muy grande. PHP no impone ningún límite para el tamaño de un string; el único límite es la memoria disponible en el ordenador donde se está ejecutando PHP.

Sintaxis

Un string literal puede ser especificado de cuatro formas diferentes:

Comillas simples

La manera más sencilla de especificar un string es encerrarlo entre comillas simples (el caracter ').

Para especificar una comilla simple literal, escápela mediante una barra invertida (\). Para especificar una barra invertida literal antes de una comilla simple, o al final de un string, se debe indicar de forma doble (\\). Tenga en cuenta que intentar escapar cualquier otro caracter tambien mostrará la barra invertida.

Note: A diferencia de las sintaxis double-quoted y heredoc, las variables y las sentencias de escape para caracteres especiales no se expandirán cuando están incluidas dentro de strings con comillas simples.

<?php
echo 'Esto es una cadena sencilla';

echo 
'Tambien puede incluir nuevas líneas en 
cadenas de esta forma ya que es
correcto hacerlo así'
;

// Resultado: Arnold una vez dijo: "I'll be back"
echo 'Arnold una vez dijo: "I\'ll be back"';

// Resultado: Ha borrado C:\*.*?
echo 'Ha borrado C:\\*.*?';

// Resultado: Ha borrado C:\*.*?
echo 'Ha borrado C:\*.*?';

// Resultado: Esto no se expandirá: \n una nueva línea
echo 'Esto no se expandirá: \n una nueva línea';

// Resultado: Las variables $tampoco se $expandiran
echo 'Las variables $tampoco se $expandiran';
?>

Comillas dobles

Si un string está encerrado entre comillas dobles ("), PHP interpretará más sentencias de escape como caracteres especiales:

Caracteres escapados
Sentencia Significado
\n avance de línea (LF o 0x0A (10) en ASCII)
\r retorno de carro (CR o 0x0D (13) en ASCII)
\t tabulador horizontal (HT o 0x09 (9) en ASCII)
\v tabulador vertical (VT o 0x0B (11) en ASCII) (desde PHP 5.2.5)
\f avance de página (FF o 0x0C (12) en ASCII) (desde PHP 5.2.5)
\\ barra invertida
\$ signo del dólar
\" comillas dobles
\[0-7]{1,3} la secuencia de caracteres que coincida con la expresión regular es un caracter en notación octal
\x[0-9A-Fa-f]{1,2} la secuencia de caracteres que coincida con la expresión regular es un caracter en notación hexadecimal

Al igual que en la delimitación de strings mediante comillas simples, escapar cualquier otro caracter puede dar lugar a que se muestre tambien la barra invertida. Antes de PHP 5.1.1, la barra invertida en \{$var} no se mostraba.

La característica más importante de entrecomillar strings mediante comillas dobles es el hecho que los nombres de las variables son expandidos. Consulte string parsing para más detalles.

Heredoc

Una tercera forma de delimitar strings es mediante la sintaxis heredoc: <<<. Después de este operador, se deberá ofrecer un identificador y después una nueva línea. A continuación va el propio string, 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 seguir las mismas reglas de nomenclatura de las etiquetas en PHP: debe contener solo caracteres alfanuméricos y guiones bajos, y debe empezar con un caracter alfabético o un guión bajo.

Warning

Es muy importante señalar que la línea con el identificador de cierre no debe contener ningún caracter, excepto posiblemente un punto y coma (;). Esto significa en particular que el identificador no debe usar sangría, y que no deben existir ningún espacio ni tabulación antes o después del punto y coma. Es muy importante darse cuenta que el primer caracter antes del identificador de cierre debe ser un salto de línea definida por el sistema operativo local. En los sistemas UNIX sería \n, al igual que en Max OS X. El delimitador de cierre (posiblemente seguido de un punto y coma) también debe ser seguido de un salto de línea.

Se se rompe esta regla y el identificador de cierre no está "limpio", no será considerado como un identificador de cierre, y PHP continuará buscando uno. Si no se encuentra ningún identificador de cierre antes del final del fichero, se producirá un error de análisis en la última línea.

Heredocs tampoco pueden ser empleados para inicializar las propiedades de una clase. Desde PHP 5.3, esta limitación solo concierne a los heredocs conteniendo variables.

Example #1 Ejemplo no válido

<?php
class foo {
    public 
$bar = <<<EOT
bar
EOT;
}
?>

El texto heredoc se comporta como un string entre comillas dobles, pero sin tener comillas dobles. Esto significa que las comillas en Heredoc no necesitan ser escapadas, pero los caracteres escapados indicados arriba se pueden seguir empleando. Las variables son expandidas, y se debe tener el mismo cuidado dentro de un Heredoc cuando se quieren expresar variables complejas, al igual que en los strings.

Example #2 Ejemplo de Heredoc string quoting example

<?php
$str 
= <<<EOD
Ejemplo de una cadena
expandida en varias líneas
empleando la sintaxis heredoc.
EOD;

/* Un ejemplo más complejo con variables. */
class foo
{
    var 
$foo;
    var 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

$foo = new foo();
$name 'MiNombre';

echo <<<EOT
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de 
{$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41
EOT;
?>

El resultado del ejemplo sería:

Mi nombre es "MiNombre". Estoy escribiendo un poco de Foo.
Ahora, estoy escribiendo un poco de Bar2.
Esto debe mostrar una 'A' mayúscula: A

Tambien se puede emplear la sintaxis Heredoc para pasar datos como argumento de una función:

Example #3 Ejemplo de Heredoc como argumentos

<?php
var_dump
(array(<<<EOD
foobar!
EOD
));
?>

Desde PHP 5.3.0 es posible inicializar variables estáticas y propiedades/constantes de clase mediante la sintaxis Heredoc:

Example #4 Usando Heredoc para inicializar valores estáticos

<?php
// Variables estáticas
function foo()
{
    static 
$bar = <<<LABEL
Nada aqui dentro...
LABEL;
}

// Propiedades/Constantes de clase
class foo
{
    const 
BAR = <<<FOOBAR
Ejemplo de constante
FOOBAR;

    public 
$baz = <<<FOOBAR
Ejemplo de propiedad
FOOBAR;
}
?>

PHP 5.3.0 tambien introdujo la posibilidad en Heredoc de emplear las comillas dobles en declaraciones:

Example #5 Empleando comillas dobles en Heredoc

<?php
echo <<<"FOOBAR"
Hola Mundo!
FOOBAR;
?>

Note:

El soporte para Heredoc se añadió en PHP 4.

Nowdoc

Nowdocs son a las cadenas con comillas simples lo mismo que Heredoc lo es a las comillas dobles. Una cadena nowdoc se especifica de forma análoga a la heredoc, pero no se realiza ningún análisis dentro de nowdoc. Esta construcción es ideal para embeber codigo PHP o grandes fragmentos de texto sin necesidad de escaparlo. Comparte algunas características comunes con la construcción SGML <![CDATA[ ]]>, donde se declara un fragmento de texto que no debe ser analizado.

Una cadena nowdoc se identifica con la misma sintaxis <<< usada para heredocs, pero el identificar que le sigue esta encerrado entre comillas simples, por ejemplo <<<'EOT'. Todas las reglas para los identificadores heredoc también son apicables a los identificadores nowdoc, especialmente aquellas que se refieren al empleo del identificador de cierre.

Example #6 Ejemplo de entrecomillado de cadenas Nowdoc

<?php
$str 
= <<<'EOD'
Ejemplo de una cadena
expandida en varias líneas
empleando la sintaxis nowdoc.
EOD;

/* Un ejemplo más complejo con variables. */
class foo
{
    public 
$foo;
    public 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

$foo = new foo();
$name 'MiNombre';

echo <<<'EOT'
Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41
EOT;
?>

El resultado del ejemplo sería:

Mi nombre es "$name". Estoy escribiendo un poco de $foo->foo.
Ahora, estoy escribiendo un poco de {$foo->bar[1]}.
Esto debe mostrar una 'A' mayúscula: \x41

Note:

A diferencia de heredocs, nowdocs pueden ser usados en cuaquier contexto de datos estáticos. Un ejemplo típica es la inicialización de propiedades o constantes en una clase:

Example #7 Ejemplo de datos estáticos

<?php
class foo {
    public 
$bar = <<<'EOT'
bar
EOT;
}
?>

Note:

El soporte de Nowdoc se añadió en PHP 5.3.0.

Análisis de variables

Cuando un string es especificado mediante comillas dobles o mediante sintaxis heredoc, las variables dentro de dicha cadena son analizadas.

Existen dos tipos de sintaxis: una simple y otra compleja. La sintaxis simple es la más empleada y conveniente. Proporciona una forma de incluir una variable, un valor de un array o una propiedad de un object dentro de un string con el mínimo esfuerzo.

La sintaxis compleja fue introducida en PHP 4, y puede ser reconocida por las llaves que encierran la expresión.

Sintaxis simple

Si se encuentra un signo de dólar ($), el analizador ávidamente cogerá el mayor número de símbolos para formar un nombre de variable válido. Encerrar el nombre de la variable entre llaves permite especificar explícitamente el final del nombre.

<?php
$cerveza 
'Heineken';
echo 
"El sabor de '$cerveza' es genial"// funciona; "'" es un caracter inválido para el nombre de una variable
echo "Bebió algunas $cervezas";   // no funciona; 's' es un caracter válido para un nombre de variable pero la variable es "$cerveza"
echo "Bebió algunas ${cerveza}s"// funciona
echo "Bebió algunas {$cerveza}s"// funciona
?>

De forma parecida, el índice de un array o la propiedad de un object puede ser analizado. Con los índices de los arrays, el corchete de cierre (]) marca el final del índice. La misma regla se puede aplicar a las propiedades de los objetos y a las variables simples.

<?php
// Estos ejemplos son específicos sobre el uso de arrays dentro de cadenas.
// Siempre entrecomille las cadenas de las claves de los arrays cuando se 
// encuentre fuera de una cadena, y no emplee {llaves}.

// Muestra todos los errores
error_reporting(E_ALL);

$frutas = array('fresa' => 'rojo''platano' => 'amarillo');

// Funciona, pero nótese que funcionará diferente fuera de una cadena
echo "Un plátano es $fruits[platano].";

// Funciona
echo "Un plátano es {$frutas['platano']}.";

// Funciona, pero PHP busca primero una constante llamada platano, como se describe posteriormente.
echo "Un plátano es {$frutas[platano]}.";

// No funciona, use llaves. Da como resultado un error de análisis.
echo "Un plátano es $frutas['platano'].";

// Funciona
echo "Un plátano es " $frutas['platano'] . ".";

// Funciona
echo "Este cuadrado tiene $square->width metros de lado.";

// No funciona. Como solución emplee la sintaxis compleja.
echo "Este cuadrado tiene $square->width00 centímetros de lado.";
?>

Para casos más complejos se debe emplear la sintaxis compleja.

Sintaxis compleja (llaves)

Esta sintaxis no se llama compleja poque sea compleja de aplicar, sino porque permite el empleo de expresiones complejas.

De hecho, cualquier valor en el espacio de nombre puede ser incluido en un string mediante esta sintaxis. Simplemente, escriba la expresión de la misma forma que lo haría fuera de un string, y despues encierrela entre { y }. Como { no puede ser escapado, esta sintaxis solo puede ser reconocida cuando despues de { sigue $. Emplee {\$ para obtener un {$ literal. Unos ejemplos para clarificar:

<?php
// Muestra todos los errores
error_reporting(E_ALL);

$great 'fantastico';

// No funciona, resultado: Esto es { fantastico}
echo "Esto es { $great}";

// Funciona, resultado: Esto es fantastico
echo "Esto es {$great}";
echo 
"Esto es ${great}";

// Funciona
echo "Este cuadrado tiene {$square->width}00 centímetros de lado."

// Funciona
echo "Funciona: {$arr[4][3]}";

// No funciona por la misma razón que $foo[bar] es incorrecto fuera de una cadena.
// En otras palabras, funcionaría pero solo porque PHP primero busca por una constante
// llamada foo; un error del nivel E_NOTICE (constante no definida) puede ser lanzado.
echo "No funciona: {$arr[foo][3]}"

// Funciona. Cuando se usan arrays multidimensionales, siempre emplee llaves encerrando 
// los arrays cuando se encuentre dentro de una cadena
echo "Funciona: {$arr['foo'][3]}";

// Funciona.
echo "Funciona: " $arr['foo'][3];

echo 
"Tambien funciona: {$obj->values[3]->name}";

echo 
"Este es el valor de la variable llamada $name{${$name}}";

echo 
"Este es el valor de la variable llamada por el valor de retorno de getName(): {${getName()}}";

echo 
"Este es el valor de la variable llamada por el valor de retorno de \$object->getName(): {${$object->getName()}}";
?>

Tambien es posible acceder a las propiedades de una clase empleando variables dentro de cadenas empleando esta sintaxis.

<?php
class foo {
    var 
$bar 'Soy bar.';
}

$foo = new foo();
$bar 'bar';
$baz = array('foo''bar''baz''quux');
echo 
"{$foo->$bar}\n";
echo 
"{$foo->$baz[1]}\n";
?>

El resultado del ejemplo sería:


Soy bar.
Soy bar.

Note:

Funciones, llamadas a métodos, variables estáticas de clases y constantes de clases dentro de {$} funcionan desde PHP 5. Sin embargo, el valor accedido puede ser interpretado como el nombre de la variable en el ámbito en el que la cadena está definida. Empleando llaves simples ({}) no servirá para acceder al valor de retorno de las funciones o métodos, constantes o variables estáticas de clases.

<?php
// Muestra todos los errores.
error_reporting(E_ALL);

class 
beers {
    const 
softdrink 'rootbeer';
    public static 
$ale 'ipa';
}

$rootbeer 'A & W';
$ipa 'Alexander Keith\'s';

// Funciona; resultado: Me gusta una A & W
echo "Me gusta una {${beers::softdrink}}\n";

// Tambien funciona; resultado: Me gusta una Alexander Keith's
echo "Me gusta una {${beers::$ale}}\n";
?>

Acceso a cadenas y modificacion por caracteres

Los caracteres dentro de strings puede ser accedidos y modificados especificando la posición de caracter deseado (en base a la posición cero del primer caracter del string) empleando los corchetes de array, como en $str[42]. Piense en este caso que un string se comporta como un array de caracteres. Las funciones substr() y substr_replace() pueden ser empleados para extraer y reemplazar más de un caracter.

Note: Los strings tambien pueden ser accedidos mediante llaves, como en $str{42}, con el mismo fin. Sin embargo, la sintaxis ha sido deprecada desde PHP 5.3.0. Emplee corchetes en su lugar, como en $str[42].

Warning

Escribir fuera del rango es compensado rellenando la cadena con espacios. Los tipos distintos de enteros son convertidos a enteros. Las compensaciones fuera de rango emiten E_NOTICE. Las compensaciones negativas emiten E_NOTICE en la escritura pero en la lectura obtienen una cadena vacía. Solo se emplea el primer caracter de una cadena asignada. La asignación de una cadena vacía asigna un bye NUL.

Example #8 Algunos ejemplos de cadenas

<?php
// Obtención del primer caracter de una cadena
$str 'Esto es un test.';
$first $str[0];

// Obtención del tercer caracter de una cadena
$third $str[2];

// Obtención del último caracter de una cadena
$str 'Esto sigue siendo un test.';
$last $str[strlen($str)-1]; 

// Modificación del último caracter de una cadena
$str 'Mira el mar';
$str[strlen($str)-1] = 'e';

?>

Note:

El acceso a variables de otros tipos usando [] o {} devuelve de forma silenciosa NULL.

Funciones y operadores útiles

Los strings pueden ser concatenados empleando el operador '.' (punto). Fíjese que el operador '+' (suma) no servirá para concatenar. Consulte String operators para más información.

Hay una serie de funciones útiles para la manipulación de string.

Consulte la sección de funciones de cadena para funciones generales, y las funciones de expresiones regulares o las funciones de expresiones regulares compatibles con Perl para funcionalidades avanzadas de búsqueda y sustitución.

Tambien existen funciones para cadenas URL, y funciones para encriptar/desencriptar cadenas (mcrypt y mhash).

Finalmente, tambien existen las funciones para el tipo caracter.

Conversión a cadena

Un valor puede convertirse a una string mediante el forzado (string) o la función strval(). La conversión automática a string tiene lugar en el contexto de una expresióin que necesita un string. Esto ocurre cuando se utilizan las funciones echo() o print(), o cuando una variables es comparada con un string. Las secciones sobre tipos y Manipulación de tipos pueden ayudarle a enterderlo con más claridad. Consulte tambien la función settype().

El valor TRUE del tipo boolean es convertido en el string "1". El valor FALSE del tipo boolean es convertido en el string "" (la cadena vacía). Esto permite la conversión en ambos sentidos entre los valores de los tipos boolean y string.

Un integer o float es convertido en un string representando textualmente el número (incluyendo la parte exponencial para los floats. Los números de punto flotante pueden ser convertidos mediante la notación exponencial (4.1E+6).

Note:

El caracter para el punto decimal se define en el script de configuración regional (categoría LC_NUMERIC). Consulte la función setlocale().

Los arrays siempre se convierten en un string "Array". Debido a esto, tanto echo() y print() no pueden pos si mismo mostrar el contenido de un array. Para ver un elemento individualmente, utilice una construcción como echo $arr['foo']. Mire los trucos en la parte inferior para mostrar el contenido por completo.

Los objects en PHP 4 siempre se convierten en un string "Object". Para mostrar los valores de las propiedades de un objeto para depuración, mire los parrafos siguientes. Para obtener el nombre de la clase del objeto emplée la función get_class(). A partir de PHP 5 se puede emplear el método __toString.

Los resources siempre se convierten en strings mediante la estructura "Resource id #1", donde 1 es el número único asignado al resource por PHP en tiempo de ejecución. No debe confiar en esta estructura, ya que está sujeto a cambios. Para obtener el tipo del resource emplee la función get_resource_type().

NULL siempre es convertido a una cadena vacía.

Como se ha indicada anteriormente, la conversión directa de un array, object o resource a un string no proporciona información útil acerca del valor, más alla de su tipo. Consulte las funciones print_r() y var_dump() para obtener maneras más efectivas de inspeccionar el contenido de estos tipos.

La mayoría de los valores de PHP pueden ser convertidos a strings para su almacenamiento permanente. Este método se denomina serialización, y es realizado mediante la función serialize(). Si la máquina PHP está contruida con soporte de WDDX, los valores de PHP tambien pueden ser serializacos como texto XML correctamente formateado.

Conversión de cadenas a números

Cuando una string es evaluada en un contexto numérico, el valor resultante y el tipo se determina como se explica a continuación.

Si el string no contiene ninguno de los caracteres '.', 'e', o 'E' y el valor numérico está entre los límites del tipo entero (como se define en PHP_INT_MAX), la string será evaluada como un integer. En todos los demas casos será evaluado como un float.

El valor es dado por la parte inicial del string. Si el string empieza con un número válido, éste será el valor usado. De otra forma, el valor será 0 (cero). Se considera número válido a un sigo opcional, seguido de uno o mñas digitos (opcionalmente puede contener un punto decimal), seguido de un exponente opcional El exponente es una 'e' o 'E' seguido de uno o más dígitos.

<?php
$foo 
"10.5";                // $foo es float (11.5)
$foo "-1.3e3";              // $foo es float (-1299)
$foo "bob-1.3e3";           // $foo es integer (1)
$foo "bob3";                // $foo es integer (1)
$foo "10 Small Pigs";       // $foo es integer (11)
$foo "10.2 Little Piggies"// $foo es float (14.2)
$foo "10.0 pigs " 1;          // $foo es float (11)
$foo "10.0 pigs " 1.0;        // $foo es float (11)     
?>

Para más información sobre esta conversión, consulte la página del manual UNIX correspondiente a strtod(3).

Para probar cualquiera de los ejemplos en esta sección, copie y pegue los ejemplos e incluya la siguiente línea para ver que está ocurriendo:

<?php
echo "\$foo==$foo; tipo es " gettype ($foo) . "<br />\n";
?>

No espere obtener el código de un caracter convirtiendolo a un entero, como ocurre en C. Emplee las funciones ord() y chr() para convertir entre código ASCII y caracteres.


Tipos
PHP Manual