Un valor string es una serie de caracteres. En PHP,
un caracter es lo mismo que un byte, es decir, hay exactamente 256
tipos de caracteres diferentes. Esto implica también que
PHP no tiene soporte nativo de Unicode. Vea
utf8_encode() y
utf8_decode() para conocer sobre el soporte
Unicode.
Nota:
El que una cadena se haga muy grande no es un problema. PHP no
impone límite práctico alguno sobre el
tamaño de las cadenas, así que no hay ninguna
razón para preocuparse sobre las cadenas largas.
La forma más simple de especificar una cadena sencilla es
rodearla de comillas simples (el caracter ').
Para especificar una comilla sencilla literal, necesita
escaparla con una barra invertida (\), como
en muchos otros lenguajes. Si una barra invertida necesita
aparecer antes de una comilla sencilla o al final de la cadena,
necesitará doblarla. Note que si intenta escapar
cualquier otro caracter, ¡la barra invertida será
impresa también! De modo que, por lo general, no hay
necesidad de escapar la barra invertida misma.
Nota:
En PHP 3, se generará una advertencia de nivel
E_NOTICE cuando esto ocurra.
Nota:
A diferencia de las otras dos sintaxis, las variables y secuencias de
escape para caracteres especiales no
serán expandidas cuando ocurren al interior de cadenas
entre comillas sencillas.
<?php echo 'esta es una cadena simple';
echo 'También puede tener saltos de línea embebidos en las cadenas de esta forma, ya que es válido';
// Imprime: Arnold dijo una vez: "I'll be back" echo 'Arnold dijo una vez: "I\'ll be back"';
// Imprime: Ha eliminado C:\*.*? echo 'Ha eliminado C:\\*.*?';
// Imprime: Ha eliminado C:\*.*? echo 'Ha eliminado C:\*.*?';
// Imprime: Esto no va a expandirse: \n una nueva linea echo 'Esto no va a expandirse: \n una nueva linea';
// Imprime: Las variables no se $expanden $tampoco echo 'Las variables no se $expanden $tampoco'; ?>
Si la cadena se encuentra rodeada de comillas dobles ("), PHP
entiende más secuencias de escape para caracteres
especiales:
Tabla 6-1. Caracteres escapados
secuencia
significado
\n
alimentación de línea (LF o 0x0A (10) en
ASCII)
\r
retorno de carro (CR o 0x0D (13) en ASCII)
\t
tabulación horizontal (HT o 0x09 (9) en
ASCII)
\\
barra invertida
\$
signo de dólar
\"
comilla-doble
\[0-7]{1,3}
la secuencia de caracteres que coincide con la
expresión regular es un caracter en notación
octal
\x[0-9A-Fa-f]{1,2}
la secuencia de caracteres que coincide con la
expresión regular es un caracter en notación
hexadecimal
Nuevamente, si intenta escapar cualquier otro caracter,
¡la barra invertida será impresa también!
Pero la característica más importante de las
cadenas entre comillas dobles es el hecho de que los nombres de
variables serán expandidos. Vea procesamiento de
cadenas para más detalles.
Otra forma de delimitar cadenas es mediante el uso de la
sintaxis heredoc ("<<<"). Debe indicarse un
identificador después de la secuencia
<<<, luego la cadena, y luego el
mismo identificador para cerrar la cita.
El identificador de cierre debe comenzar en
la primera columna de la línea. Asimismo, el
identificador usado debe seguir las mismas reglas que cualquier
otra etiqueta en PHP: debe contener solo caracteres
alfanuméricos y de subrayado, y debe iniciar con un
caracter no-dígito o de subrayado.
Aviso
Es muy importante notar que la línea con el
identificador de cierre no contenga otros caracteres, excepto
quizás por un punto-y-coma
(;). Esto quiere decir en especial que el
identificador no debe usar sangría,
y no debe haber espacios o tabuladores antes o después
del punto-y-coma. Es importante también notar que el
primer caracter antes del identificador de cierre debe ser un
salto de línea, tal y como lo defina su sistema
operativo. Esto quiere decir \r en
Macintosh, por ejemplo.
Si esta regla es rota y el identificador de cierre no es
"limpio", entonces no se considera un identificador de cierre y
PHP continuará en busca de uno. Si, en tal caso, no se
encuentra un identificador de cierre apropiado, entonces un
error del analizador sintáctico resultará con el
número de línea apuntando al final del script.
El texto heredoc se comporta tal como una cadena entre comillas
dobles, sin las comillas dobles. Esto quiere decir que no
necesita escapar tales comillas en sus bloques heredoc, pero aun
puede usar los códigos de escape listados
anteriormente. Las variables son expandidas, aunque debe tenerse
el mismo cuidado cuando se expresen variables complejas al
interior de un segmento heredoc, al igual que con otras cadenas.
Ejemplo 6-2. Ejemplo de uso de una cadena heredoc
<?php $cadena = <<<FIN Ejemplo de una cadena que se extiende por varias líneas usando la sintaxis heredoc. FIN;
/* Un ejemplo mas complejo, con variables. */ class foo { var $foo; var $bar;
echo <<<FIN Mi nombre es "$nombre". Estoy imprimiendo algo de $foo->foo. Ahora, estoy imprimiendo algo de {$foo->bar[1]}. Esto debería imprimir una letra 'A' mayúscula: \x41 FIN; ?>
Cuando una cadena es especificada en comillas dobles o al
interior de un bloque heredoc, las variables son interpretadas
en su interior.
Existen dos tipos de sintaxis: una simple y
una compleja. La
sintaxis simple es la más común y
conveniente. Esta ofrece una forma de interpretar una variable,
un valor array, o una propiedad de un
object.
La sintaxis compleja fue introducida en PHP 4, y puede
reconocerse por las llaves que rodean la expresión.
Si un signo de dólar ($) es
encontrado, el analizador sintáctico tomará
ambiciosamente tantos lexemas como le sea posible para formar
un nombre de variable válido. Rodee el nombre de la
variable de llaves si desea especificar explícitamente
el final del nombre.
<?php $cerveza = 'Heineken'; echo "El sabor de varias $cerveza's es excelente"; // funciona, "'" no es un caracter valido para nombres de variables echo "Tomó algunas $cervezas"; // no funciona, 's' es un caracter valido para nombres de variables echo "Tomó algunas ${cerveza}s"; // funciona echo "Tomó algunas {$cerveza}s"; // funciona ?>
De forma similar, puede hacer que un índice de un
array o una propiedad de un object
sean interpretados. En el caso de los índices de
matrices, el corchete cuadrado de cierre (])
marca el final del índice. Para las propiedades de
objetos, se aplican las mismas reglas de las variables simples,
aunque con las propiedades de objetos no existe un truco como
el que existe con las variables.
<?php // Estos ejemplos son especificos al uso de matrices al interior de // cadenas. Cuando se encuentre por fuera de una cadena, siempre rodee // de comillas las claves tipo cadena de su matriz, y no use // {llaves} por fuera de cadenas tampoco.
// Mostremos todos los errores error_reporting(E_ALL);
Esta no es llamada compleja porque la sintaxis sea compleja,
sino porque es posible incluir expresiones complejas de esta
forma.
De hecho, de esta forma puede incluir cualquier valor que sea
parte del espacio de nombres al interior de
cadenas. Simplemente escriba la expresión en la misma
forma que lo haría si se encontrara por fuera de una
cadena, y luego la ubica entre { y }. Ya que no es posible
escapar '{', esta sintaxis será reconocida
únicamente cuando el caracter $ se encuentra
inmediatamente después de {. (Use "{\$" o "\{$" para
obtener una secuencia literal "{$"). Algunos ejemplos para
aclarar el asunto:
<?php // Mostremos todos los errores error_reporting(E_ALL);
$genial = 'fantástico';
// No funciona, imprime: Esto es { fantástico} echo "Esto es { $genial}";
// Funciona, imprime: Esto es fantástico echo "Esto es {$genial}"; echo "Esto es ${genial}";
// Funciona echo "Este cuadro tiene {$cuadro->ancho}00 centímetros de ancho.";
// Esto esta mal por la misma razon por la que $foo[bar] esta mal por // fuera de una cadena. En otras palabras, aun funciona pero ya que // PHP busca primero una constante llamada foo, genera un error de // nivel E_NOTICE (constante indefinida). echo "Esto esta mal: {$matriz[foo][3]}";
// Funciona. Cuando se usan matrices multi-dimensionales, use siempre // llaves alrededor de las matrices al interior de cadenas echo "Esto funciona: {$matriz['foo'][3]}";
Los caracteres al interior de una cadena pueden ser consultados
y modificados al especificar el desplazamiento, comenzando en
cero, del caracter deseado después de la cadena entre
llaves.
Nota:
Para efectos de compatibilidad con versiones anteriores, aun
puede usar corchetes tipo matriz para el mismo
propósito. Sin embargo, esta sintaxis es obsoleta a
partir de PHP 4.
Ejemplo 6-3. Algunos ejemplos de cadenas
<?php // Obtener el primer caracter de una cadena $cadena = 'Esta es una prueba.'; $primer = $cadena{0};
// Obtener el tercer caracter de una cadena $tercer = $cadena{2};
// Obtener el ultimo caracter de una cadena. $cadena = 'Esta es tambien una prueba.'; $ultimo = $cadena{strlen($cadena)-1};
// Modificar el ultimo caracter de una cadena $cadena = 'Observe el mar'; $cadena{strlen($cadena)-1} = 'l';
Las cadenas pueden ser concatenadas usando el operador '.'
(punto). Note que el operador '+' (adición) no funciona
para este propósito. Por favor refiérase a la
sección Operadores de cadena
para más información.
Existen bastantes funciones útiles para la
modificación de cadenas.
Vea la sección de funciones de
cadena para consultar funciones de uso general, o las
funciones de expresiones regulares para búsquedas y
reemplazos avanzados (en dos sabores: Perl y POSIX
extendido).
Es posible convertir un valor a una cadena usando el moldeamiento
(string), o la función
strval(). La conversión a cadena se
realiza automáticamente para usted en el contexto de una
expresión cuando se necesita una cadena. Esto ocurre
cuando usa las funciones echo() o
print(), o cuando compara el valor de una
variable con una cadena. El contenido de las secciones del manual
sobre Tipos y Manipulación de
Tipos ayudan a aclarar este hecho. Vea también
settype().
Un valor booleanTRUE es convertido a la cadena
"1", el valor FALSE se representa como
"" (una cadena vacía). De esta forma,
usted puede convertir de ida y vuelta entre valores booleanos y
de cadena.
Un número integer o de punto flotante
(float) es convertido a una cadena que representa el
número con sus dígitos (incluyendo la parte del
exponente para los números de punto flotante).
Las matrices son siempre convertidas a la cadena
"Array", de modo que no puede volcar los
contenidos de un valor array con
echo() o print() para ver
lo que se encuentra en su interior. Para ver un elemento, usted
tendría que hacer algo como echo
$arr['foo']. Vea más adelante algunos consejos
sobre el volcado/vista del contenido completo.
Los objetos son convertidos siempre a la cadena
"Object". Si quisiera imprimir los valores de
variables miembro de un object para efectos de
depuración, lea los parágrafos siguientes. Si
quiere conocer el nombre de clase del cual un objeto dado es
instancia, use get_class().
Los recursos son siempre convertidos a cadenas con la estructura
"Resource id #1" en donde 1
es el número único del valor resource
asignado por PHP durante tiempo de ejecución. Si quisiera
obtener el tipo del recurso, use
get_resource_type().
NULL se convierte siempre a una cadena vacía.
Como puede apreciar, el imprimir matrices, objetos o recursos no
le ofroce información útil sobre los valores
mismos. Consulte las funciones print_r() y
var_dump() para conocer mejores formas de
imprimir valores para depuración.
También puede convertir valores PHP a cadenas y
almacenarlas permanentemente. Este método es conocido como
seriación, y puede ser efectuado con la función
serialize(). También puede seriar
valores PHP a estructuras XML, si cuenta con soporte WDDX en su configuración de PHP.
Cuando una cadena es evaluada como un valor numérico, el
valor resultante y su tipo son determinados como sigue.
La cadena será evaluada como un float si
contiene cualquier caracter entre '.', 'e', o 'E'. De otra forma,
evaluará como un entero.
El valor es dado por la porción inicial de la cadena. Si
la cadena comienza con datos numéricos válidos,
éstos serán el valor usado. De lo contrario, el
valor será 0 (cero). Un signo opcional es considerado un
dato numérico válido, seguido por uno o más
dígitos (que pueden contener un punto decimal), seguidos
por un exponente opcional. El exponente es una 'e' o 'E' seguida
de uno o más dígitos.
Para más información sobre esta conversión,
vea la página del manual Unix sobre strtod(3).
Si quisiera probar cualquiera de los ejemplos presentados en esta
sección, puede cortar y pegar los ejemplos e insertar la
siguiente línea para verificar por sí mismo lo que
está sucediendo:
<?php echo "\$foo==$foo; tipo es " . gettype ($foo) . "<br />\n"; ?>
No espere obtener el código de un caractar
convirtiéndolo a un entero (como lo haría en C, por
ejemplo). Use las funciones ord() y
chr() para convertir entre códigos de
caracter y caracteres.