Cadenas

Un string es una serie de caracteres, donde un carácter es el mismo que un byte. Esto significa que PHP solo admite un conjunto de 256 caracteres y, por lo tanto, no ofrece soporte nativo para Unicode. Ver los detalles del tipo string.

Nota: En versiones de 32 bits, un string puede ser tan grande como 2 Go (2147483647 bytes máximo)

Sintaxis

Un string literal puede ser especificado de cuatro maneras diferentes :

Entre comillas simples

La manera más simple de especificar un string es encerrarlo entre comillas simples (el carácter ').

Para especificar una comilla simple literal, escápela con una barra invertida (\). Para especificar una barra invertida literal, duplíquela (\\). Todas las demás apariciones de la barra invertida serán tratadas como una barra invertida literal : esto significa que las demás secuencias de escape que pueda conocer, tales como \r o \n, serán emitidas literalmente como se especificó en lugar de tener un significado especial.

Nota: A diferencia de las comillas dobles y sintaxis heredoc, las variables y las secuencias de escape para los caracteres especiales no serán no expandidas cuando se encuentren en strings entre comillas simples.

Ejemplo #1 Variantes de sintaxis

<?php
echo 'esto es un string simple', PHP_EOL;

echo
'También puede tener nuevas líneas integradas en
los strings de esta manera, porque es admisible hacerlo.'
, PHP_EOL;

// Muestra : Arnold dijo una vez : "Volveré"
echo 'Arnold dijo una vez : "Volveré"', PHP_EOL;

// Muestra : ¿Ha eliminado C:\*.* ?
echo '¿Ha eliminado C:\\*.* ?', PHP_EOL;

// Muestra : ¿Ha eliminado C:\*.* ?
echo '¿Ha eliminado C:\*.* ?', PHP_EOL;

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

// Muestra : Las variables no $s\'expandirán $tampoco
echo 'Las variables no $s\'expandirán $tampoco', PHP_EOL;
?>

Entre comillas dobles

Si el string está encerrado entre comillas dobles ("), PHP interpretará las siguientes secuencias de escape para caracteres especiales :

Caracteres escapados
Secuencia Significado
\n retorno 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)
\v tabulación vertical (VT o 0x0B (11) en ASCII)
\e escape (ESC o 0x1B (27) en ASCII)
\f avance de formulario (FF o 0x0C (12) en ASCII)
\\ barra invertida
\$ signo de dólar
\" comilla doble
\[0-7]{1,3} Octal : la secuencia de caracteres correspondiente a la expresión regular [0-7]{1,3} es un carácter en notación octal (por ejemplo, "\101" === "A"), que se desborda silenciosamente para ajustarse a un byte (por ejemplo, "\400" === "\000")
\x[0-9A-Fa-f]{1,2} Hexadecimal : la secuencia de caracteres correspondiente a la expresión regular [0-9A-Fa-f]{1,2} es un carácter en notación hexadecimal (por ejemplo, "\x41" === "A")
\u{[0-9A-Fa-f]+} Unicode : la secuencia de caracteres correspondiente a la expresión regular [0-9A-Fa-f]+ es un punto de código Unicode, que será emitido en el string bajo la representación UTF-8 de ese punto de código. Las llaves son requeridas en la secuencia. Por ejemplo, "\u{41}" === "A"

Al igual que con los strings entre comillas simples, escapar cualquier otro carácter también imprimirá la barra invertida.

La característica más importante de los strings entre comillas dobles es el hecho de que los nombres de variables serán expandidos. Ver la interpolación de strings para más detalles.

Heredoc

Una tercera manera de delimitar los strings es la sintaxis heredoc : <<<. Después de este operador, se proporciona un identificador, luego una nueva línea. El string en sí sigue, luego el mismo identificador nuevamente para cerrar la cita.

El identificador de cierre puede ser sangrado por espacios o tabulaciones, en cuyo caso la sangría será eliminada de todas las líneas en el string doc. Antes de PHP 7.3.0, el identificador de cierre debe comenzar en la primera columna de la línea.

Además, el identificador de cierre debe seguir las mismas reglas de nomenclatura que cualquier otra etiqueta en PHP : debe contener solo caracteres alfanuméricos y guiones bajos, y debe comenzar con un carácter no numérico o un guión bajo.

Ejemplo #2 Ejemplo básico de Heredoc a partir de PHP 7.3.0

<?php
// sin sangría
echo <<<END
a
b
c
\n
END;

// 4 espacios de sangría
echo <<<END
a
b
c
END;

Salida del ejemplo anterior en PHP 7.3:

      a
     b
    c

  a
 b
c

Si el identificador de cierre está sangrado más que cualquier línea del cuerpo, entonces se levantará un ParseError :

Ejemplo #3 El identificador de cierre no debe estar sangrado más que ninguna línea del cuerpo

<?php
echo <<<END
a
b
c
END;

Salida del ejemplo anterior en PHP 7.3:

Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4

Si el identificador de cierre está sangrado, también se pueden usar tabulaciones, sin embargo, las tabulaciones y los espacios no deben mezclarse en cuanto a la sangría del identificador de cierre y la sangría del cuerpo (hasta el identificador de cierre). En uno de estos casos, se levantará un ParseError. Estas restricciones de espacio se han incluido porque mezclar espacios y tabulaciones para la sangría perjudica la legibilidad.

Ejemplo #4 Diferente sangría para el cuerpo (espacios) identificador de cierre

<?php
// Todo el código siguiente no funciona.

// diferente sangría para el cuerpo (espacios) marcador de fin (tabulaciones)
{
echo <<<END
a
END;
}

// mezcla de espacios y tabulaciones en el cuerpo
{
echo <<<END
a
END;
}

// mezcla de espacios y tabulaciones en el marcador de fin
{
echo <<<END
a
END;
}

Salida del ejemplo anterior en PHP 7.3:

Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8

El identificador de cierre para el string del cuerpo no es requerido para ser seguido de un punto y coma o un salto de línea. Por ejemplo, el siguiente código está permitido a partir de PHP 7.3.0 :

Ejemplo #5 Continuación de una expresión después de un identificador de cierre

<?php
$values
= [<<<END
a
b
c
END, 'd e f'];
var_dump($values);

Salida del ejemplo anterior en PHP 7.3:

array(2) {
  [0] =>
  string(11) "a
  b
    c"
  [1] =>
  string(5) "d e f"
}
Advertencia

Si el identificador de cierre se encontró al comienzo de una línea, entonces no importa si formaba parte de otra palabra, puede considerarse como el identificador de cierre y provocar un ParseError.

Ejemplo #6 El identificador de cierre en el cuerpo del string tiende a provocar un ParseError

<?php
$values
= [<<<END
a
b
END ING
END
, 'd e f'];

Salida del ejemplo anterior en PHP 7.3:

Parse error: syntax error, unexpected identifier "ING", expecting "]" in example.php on line 5

Para evitar este problema, es seguro seguir la regla simple : no elegir como identificador de cierre si aparece en el cuerpo del texto.

Advertencia

Antes de PHP 7.3.0, es muy importante tener en cuenta que la línea que contiene el identificador de cierre no debe contener ningún otro carácter, excepto un punto y coma (;). Esto significa sobre todo que el identificador no puede estar sangrado, y no debe haber espacios o tabulaciones antes o después del punto y coma. También es importante darse cuenta de que el primer carácter antes del identificador de cierre debe ser un salto de línea tal como se define por el sistema operativo local. Es \n en los sistemas UNIX, incluyendo macOS. El delimitador de cierre también debe ser seguido de un salto de línea.

Si se infringe esta regla y el identificador de cierre no es "limpio", no se considerará como un identificador de cierre, y PHP continuará buscando uno. Si no se encuentra un identificador de cierre adecuado antes del final del archivo actual, se producirá un error de análisis en la última línea.

Ejemplo #7 Ejemplo no válido, antes de PHP 7.3.0

<?php
class foo {
public
$bar = <<<EOT
bar
EOT;
}
// El identificador no debe estar sangrado
?>

Ejemplo #8 Ejemplo válido, incluso antes de PHP 7.3.0

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

Los heredocs que contienen variables no pueden usarse para inicializar propiedades de clase.

El texto heredoc se comporta exactamente como un string entre comillas dobles, sin las comillas. Esto significa que las comillas dentro de un heredoc no necesitan ser escapadas, pero los códigos de escape mencionados anteriormente aún pueden ser utilizados. Las variables se expanden, pero se debe tener el mismo cuidado al expresar variables complejas dentro de un heredoc que para los strings.

Ejemplo #9 Ejemplo de cita de string heredoc

<?php
$str
= <<<EOD
Ejemplo de string
extendiéndose en varias líneas
usando la sintaxis heredoc.
EOD;

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

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

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

echo <<<EOT
Mi nombre es "$name". Estoy imprimiendo $foo->foo.
Ahora, imprimo
{$foo->bar[1]}.
Esto debería imprimir una 'A' mayúscula : \x41
EOT;
?>

El resultado del ejemplo sería:

Mi nombre es "MyName". Estoy imprimiendo Foo.
Ahora, imprimo Bar2.
Esto debería imprimir una 'A' mayúscula : A

También es posible usar la sintaxis heredoc para pasar datos a los argumentos de función :

Ejemplo #10 Heredoc en los ejemplos de argumentos

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

Es posible inicializar variables estáticas y propiedades/constantes de clase usando la sintaxis heredoc :

Ejemplo #11 Uso de Heredoc para inicializar valores estáticos

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

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

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

El identificador de apertura del Heredoc puede eventualmente ser encerrado entre comillas dobles :

Ejemplo #12 Uso de comillas dobles en el Heredoc

<?php
echo <<<"FOOBAR"
¡Hola mundo!
FOOBAR;
?>

Nowdoc

Los nowdocs son para los strings entre comillas simples lo que los heredocs son para los strings entre comillas dobles. Un nowdoc se especifica de manera similar a un heredoc, pero no se realiza ninguna interpolación de string dentro de un nowdoc. La construcción es ideal para integrar código PHP u otros bloques de texto voluminosos sin necesidad de escapar. Comparte algunas características con la construcción SGML <![CDATA[ ]]>, en el sentido de que declara un bloque de texto que no está destinado a ser analizado.

Un nowdoc se identifica por la misma secuencia <<< utilizada para los heredocs, pero el identificador que sigue está encerrado entre comillas simples, por ejemplo <<<'EOT'. Todas las reglas para los identificadores heredoc se aplican también a los identificadores nowdoc, en particular las que se refieren a la aparición del identificador de cierre.

Ejemplo #13 Ejemplo de cita de string nowdoc

<?php
echo <<<'EOD'
Ejemplo de string extendiéndose en varias líneas
usando la sintaxis nowdoc. Las barras invertidas siempre se tratan literalmente,
es decir \\ y \'.
EOD;

El resultado del ejemplo sería:

Ejemplo de string extendiéndose en varias líneas
usando la sintaxis nowdoc. Las barras invertidas siempre se tratan literalmente,
es decir \\ y \'.

Ejemplo #14 Ejemplo de cita de string nowdoc con variables

<?php
class foo
{
public
$foo;
public
$bar;

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

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

echo <<<'EOT'
Mi nombre es "$name". Estoy imprimiendo $foo->foo.
Ahora, imprimo {$foo->bar[1]}.
Esto no debería imprimir una 'A' mayúscula : \x41
EOT;
?>

El resultado del ejemplo sería:

Mi nombre es "$name". Estoy imprimiendo $foo->foo.
Ahora, imprimo {$foo->bar[1]}.
Esto no debería imprimir una 'A' mayúscula : \x41

Ejemplo #15 Ejemplo de datos estáticos

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

Interpolación de strings

Cuando un string se especifica entre comillas dobles o con heredoc, las variables pueden ser sustituidas en su interior.

Existen dos tipos de sintaxis : una básica y una avanzada. La sintaxis básica es la más común y la más práctica. Ofrece una manera de incorporar una variable, un valor array o una propiedad objeto en un string con un mínimo de esfuerzo.

Sintaxis básica

Si se encuentra un signo de dólar ($), los caracteres que le siguen y que pueden ser utilizados en un nombre de variable serán interpretados como tales y sustituidos.

<?php
$juice
= "manzana";

echo
"Ha bebido un poco de $juice jugo." . PHP_EOL;

?>

El resultado del ejemplo sería:

Ha bebido un poco de manzana jugo.

Formalmente, la estructura para la sintaxis de sustitución de variable básica es la siguiente :

Ejemplo #16 Interpolación de strings

string-variable::
     variable-name   (offset-or-property)?
   | ${   expression   }

offset-or-property::
     offset-in-string
   | property-in-string

offset-in-string::
     [   name   ]
   | [   variable-name   ]
   | [   integer-literal   ]

property-in-string::
     ->  name

variable-name::
     $   name

name::
     [a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*

Advertencia

La sintaxis ${ expression } está deprecada desde PHP 8.2.0, ya que puede ser interpretada como variables de variables :

<?php
const foo = 'bar';
$foo = 'foo';
$bar = 'bar';
var_dump("${foo}");
var_dump("${(foo)}");
?>

Salida del ejemplo anterior en PHP 8.2:

Deprecado : Usar ${var} en strings está deprecado, use {$var} en su lugar en el archivo en la línea 6

Deprecado : Usar ${expr} (variables de variables) en strings está deprecado, use {${expr}} en su lugar en el archivo en la línea 9
string(3) "foo"
string(3) "bar"

El resultado del ejemplo sería:

string(3) "foo"
string(3) "bar"
La sintaxis de interpolación de string avanzada debería usarse en su lugar.

Nota: Si no es posible formar un nombre válido, el signo de dólar se mantendrá tal cual en el string :

<?php
echo "No se ha producido ninguna interpolación $ n\n";
echo
"No se ha producido ninguna interpolación $\n n\n";
echo
"No se ha producido ninguna interpolación $2 n\n";
?>

El resultado del ejemplo sería:

No se ha producido ninguna interpolación $  n
No se ha producido ninguna interpolación $
 n
No se ha producido ninguna interpolación $2 n

Ejemplo #17 Interpolación del valor de la primera dimensión de un array o de una propiedad

<?php
$juices
= array("manzana", "naranja", "string_key" => "violeta");

echo
"Ha bebido un poco de $juices[0] jugo.";
echo
PHP_EOL;
echo
"Ha bebido un poco de $juices[1] jugo.";
echo
PHP_EOL;
echo
"Ha bebido un poco de $juices[string_key] jugo.";
echo
PHP_EOL;

class
A {
public
$s = "string";
}

$o = new A();

echo
"Valor del objeto : $o->s.";
?>

El resultado del ejemplo sería:

Ha bebido un poco de manzana jugo.
Ha bebido un poco de naranja jugo.
Ha bebido un poco de violeta jugo.
Valor del objeto : string.

Nota: La clave del array debe estar sin comillas, y por lo tanto no es posible referenciar una constante como clave con la sintaxis básica. Use la sintaxis avanzada en su lugar.

Desde PHP 7.1.0, los índices numéricos negativos también son soportados.

Ejemplo #18 Índices numéricos negativos

<?php
$string
= 'string';
echo
"El carácter en el índice -2 es $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo
"Cambiar el carácter en el índice -3 a o da $string.", PHP_EOL;
?>

El resultado del ejemplo sería:

El carácter en el índice -2 es n.
Cambiar el carácter en el índice -3 a o da strong.

Para todo lo que es más complejo, la sintaxis avanzada debe ser utilizada.

Sintaxis avanzada (sintaxis de llaves)

La sintaxis avanzada permite la interpolación de variables con accesores arbitrarios.

Cualquier variable escalar, elemento de array o propiedad de objeto (static o no) con una representación string puede ser incluida a través de esta sintaxis. La expresión se escribe de la misma manera que la que aparecería fuera de la string, luego se encierra entre { y }. Dado que { no puede ser escapado, esta sintaxis solo será reconocida cuando el $ siga inmediatamente al {. Use {\$ para obtener un {$. Aquí hay algunos ejemplos para aclarar :

Ejemplo #19 Sintaxis con llaves

<?php
const DATA_KEY = 'const-key';
$great = 'fantástico';
$arr = [
'1',
'2',
'3',
[
41, 42, 43],
'key' => 'Valor indexado',
'const-key' => 'Clave con un signo menos',
'foo' => ['foo1', 'foo2', 'foo3']
];

// No funcionará, muestra : This is { fantastic}
echo "Esto es { $great}";

// Funciona, muestra : This is fantastic
echo "Esto es {$great}";

class
Square {
public
$width;

public function
__construct(int $width) { $this->width = $width; }
}

$square = new Square(5);

// Funciona
echo "Este cuadrado mide {$square->width}00 centímetros de ancho.";

// Funciona, las claves entre comillas solo funcionan con la sintaxis de llaves
echo "Esto funciona : {$arr['key']}";

// Funciona
echo "Esto funciona : {$arr[3][2]}";

echo
"Esto funciona : {$arr[DATA_KEY]}";

// Al usar arrays multidimensionales, use siempre llaves alrededor de los arrays
// cuando estén dentro de strings
echo "Esto funciona : {$arr['foo'][2]}";

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

echo
"Esto funciona : {$obj->$staticProp}";

// No funcionará, muestra : C:\directory\{fantastic}.txt
echo "C:\directory\{$great}.txt";

// Funciona, muestra : C:\directory\fantastic.txt
echo "C:\\directory\\{$great}.txt";
?>

Nota: Dado que esta sintaxis permite expresiones arbitrarias, es posible usar variables de variables en la sintaxis avanzada.

Acceso y modificación de string por carácter

Los caracteres en los strings pueden ser accedidos y modificados especificando el desplazamiento basado en cero del carácter deseado después del string usando corchetes array, como en $str[42]. Piense en un string como un array de caracteres para este propósito. Las funciones substr() y substr_replace() pueden ser utilizadas cuando se desea extraer o reemplazar más de un carácter.

Nota: Desde PHP 7.1.0, los desplazamientos de string negativos también son soportados. Estos especifican el desplazamiento desde el final del string. Anteriormente, los desplazamientos negativos emitían E_NOTICE para la lectura (produciendo un string vacío) y E_WARNING para la escritura (dejando el string intacto).

Nota: Antes de PHP 8.0.0, los strings también podían ser accedidos usando llaves, como en $str{42}, para el mismo propósito. Esta sintaxis de llaves ha sido deprecada desde PHP 7.4.0 y ya no es soportada desde PHP 8.0.0.

Advertencia

Escribir en un desplazamiento fuera de alcance llena el string con espacios. Los tipos no enteros se convierten en enteros. Un tipo de desplazamiento ilegal emite E_WARNING. Solo se utiliza el primer carácter de un string asignado. Desde PHP 7.1.0, asignar un string vacío genera un error fatal. Anteriormente, esto asignaba un byte NULL.

Advertencia

Internamente, los strings PHP son arrays de bytes. En consecuencia, acceder o modificar un string usando corchetes de array no es seguro para los multi-bytes, y no debería hacerse más que con strings en codificación de un solo byte como ISO-8859-1.

Nota: Desde PHP 7.1.0, aplicar el operador de índice vacío a un string vacío genera un error fatal. Anteriormente, el string vacío se convertía silenciosamente en un array.

Ejemplo #20 Algunos ejemplos de strings

<?php
// Obtener el primer carácter de un string
$str = 'Esto es una prueba.';
$first = $str[0];
var_dump($first);

// Obtener el tercer carácter de un string
$third = $str[2];
var_dump($third);

// Obtener el último carácter de un string.
$str = 'Esto sigue siendo una prueba.';
$last = $str[strlen($str)-1];
var_dump($last);

// Modificar el último carácter de un string
$str = 'Mira el mar';
$str[strlen($str)-1] = 'e';
var_dump($str);
?>

Los desplazamientos de string deben ser enteros o strings que se asemejan a enteros, de lo contrario se emitirá una advertencia.

Ejemplo #21 Ejemplo de desplazamientos de string ilegales

<?php
$str
= 'abc';

foreach (
$keys as $keyToTry) {
var_dump(isset($str[$keyToTry]));

try {
var_dump($str[$keyToTry]);
} catch (
TypeError $e) {
echo
$e->getMessage(), PHP_EOL;
}

echo
PHP_EOL;
}
?>

El resultado del ejemplo sería:

bool(true)
string(1) "b"

bool(false)
Cannot access offset of type string on string

bool(false)
Cannot access offset of type string on string

bool(false)

Warning: Illegal string offset "1x" in Standard input code on line 10
string(1) "b"

Nota:

Acceder a variables de otros tipos (con la excepción de arrays o objetos que implementen las interfaces apropiadas) usando [] o {} devuelve silenciosamente null.

Nota:

Los caracteres en los literales de string pueden ser accedidos usando [] o {}.

Nota:

Acceder a caracteres en literales de string usando la sintaxis {} ha sido deprecado en PHP 7.4. Esto ha sido eliminado en PHP 8.0.

Funciones y operadores útiles

Los strings pueden ser concatenados usando el operador '.' (punto). Tenga en cuenta que el operador '+' (adición) no funcionará no para esto. Consulte los operadores de string para más información.

Hay varias funciones útiles para la manipulación de strings.

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

También hay funciones para strings de URL, y funciones para cifrar/descifrar strings (Sodium y Hash).

Finalmente, consulte también las funciones de tipo de carácter.

Conversión a string

Un valor puede ser convertido en string usando el cast (string) o la función strval(). La conversión a string se realiza automáticamente en el contexto de una expresión donde se necesita un string. Esto ocurre al usar las funciones echo o print, o cuando una variable se compara con un string. Las secciones sobre Tipos y Type Juggling aclararán lo que sigue. Vea también la función settype().

Un valor bool true se convierte en el string "1". El bool false se convierte en "" (el string vacío). Esto permite una conversión de ida y vuelta entre los valores bool y string.

Un int o float se convierte en un string que representa el número textualmente (incluyendo la parte exponente para los float). Los números de punto flotante pueden ser convertidos usando la notación exponente (4.1E+6).

Nota:

A partir de PHP 8.0.0, el carácter de la coma decimal es siempre un punto ("."). Antes de PHP 8.0.0, el carácter de la coma decimal se define en la configuración regional del script (categoría LC_NUMERIC). Consulte la función setlocale().

Los arrays siempre se convierten en el string "Array"; por lo tanto, echo y print no pueden por sí solos mostrar el contenido de un array. Para mostrar un solo elemento, use una construcción como echo $arr['foo']. Consulte a continuación consejos sobre la visualización de todo el contenido.

Para convertir objetos en strings, debe usarse el método mágico __toString.

Los recursos siempre se convierten en strings con la estructura "Resource id #1", donde 1 es el número de recurso asignado al recurso por PHP en la ejecución. Aunque la estructura exacta de este string no debe considerarse como confiable y está sujeta a cambios, siempre será única para un recurso dado durante la duración de la ejecución de un script (es decir, una solicitud web o un proceso CLI) y no será reutilizada. Para obtener el tipo de un recurso, use la función get_resource_type().

null siempre se convierte en un string vacío.

Como se indicó anteriormente, convertir directamente un array, un objeto o un recurso en string no proporciona información útil sobre el valor más allá de su tipo. Consulte las funciones print_r() y var_dump() para formas más eficaces de inspeccionar el contenido de estos tipos.

La mayoría de los valores PHP también pueden ser convertidos en strings para un almacenamiento permanente. Este método se llama serialización y se realiza mediante la función serialize().

Detalles del tipo string

El string en PHP se implementa como un array de bytes y un entero que indica la longitud del búfer. No tiene información sobre cómo estos bytes se traducen en caracteres, dejando esta tarea al programador. No hay limitaciones sobre los valores que puede tener el string; en particular, los bytes de valor 0 (« bytes NUL ») están permitidos en cualquier lugar del string (sin embargo, algunas funciones, llamadas en este manual no ser « seguras para binarios », pueden pasar los strings a bibliotecas que ignoran los datos después de un byte NUL).

Esta naturaleza del tipo string explica por qué no hay un tipo « byte » distinto en PHP – los strings toman este rol. Las funciones que no devuelven datos textuales – por ejemplo, datos arbitrarios leídos de un socket de red – devolverán strings de todos modos.

Dado que PHP no dicta una codificación específica para los strings, uno podría preguntarse cómo se codifican los literales de string. Por ejemplo, el string "á" ¿es equivalente a "\xE1" (ISO-8859-1), "\xC3\xA1" (UTF-8, forma C), "\x61\xCC\x81" (UTF-8, forma D) o cualquier otra representación posible? La respuesta es que el string se codificará de la manera en que está codificado en el archivo de script. Así, si el script está escrito en ISO-8859-1, el string se codificará en ISO-8859-1 y viceversa. Sin embargo, esto no se aplica si Zend Multibyte está habilitado; en ese caso, el script puede estar escrito en una codificación arbitraria (que se declara explícitamente o se detecta) y luego se convierte en una cierta codificación interna, que luego será la codificación utilizada para los literales de string. Tenga en cuenta que hay algunas restricciones sobre la codificación del script (o sobre la codificación interna, si Zend Multibyte está habilitado) – esto generalmente significa que esta codificación debe ser un superconjunto compatible de ASCII, como UTF-8 o ISO-8859-1. Tenga en cuenta, sin embargo, que las codificaciones dependientes del estado donde los mismos valores de bytes pueden ser utilizados en estados de desplazamiento iniciales y no iniciales pueden ser problemáticas.

Por supuesto, para ser útiles, las funciones que operan sobre texto pueden necesitar hacer ciertas suposiciones sobre cómo está codificado el string. Desafortunadamente, hay mucha variación en esto en las funciones de PHP :

  • Algunas funciones suponen que el string está codificado en un (cualquier) conjunto de caracteres de un byte, pero no necesitan interpretar estos bytes como caracteres específicos. Este es el caso, por ejemplo, de substr(), strpos(), strlen() o strcmp(). Otra forma de pensar en estas funciones es que operan sobre búferes de memoria, es decir, que funcionan con bytes y desplazamientos de bytes.
  • Otras funciones reciben la codificación del string, suponiendo eventualmente un valor predeterminado si no se proporciona tal información. Este es el caso de htmlentities() y la mayoría de las funciones en la extensión mbstring.
  • Otras usan la configuración regional actual (ver setlocale()), pero funcionan byte a byte.
  • También pueden simplemente suponer que el string usa una codificación específica, generalmente UTF-8. Este es el caso de la mayoría de las funciones en la extensión intl y en la extensión PCRE (en este último caso, solo cuando se usa el modificador u).

En última instancia, esto significa que escribir programas correctos usando Unicode depende de evitar cuidadosamente las funciones que no funcionarán y que muy probablemente corromperán los datos, y usar en su lugar las funciones que se comportan correctamente, generalmente provenientes de las extensiones intl y mbstring. Sin embargo, usar funciones capaces de manejar las codificaciones Unicode es solo el comienzo. Independientemente de las funciones que proporcione el lenguaje, es esencial conocer la especificación Unicode. Por ejemplo, un programa que asume que solo hay mayúsculas y minúsculas hace una suposición incorrecta.

add a note

User Contributed Notes 13 notes

up
106
gtisza at gmail dot com
13 years ago
The documentation does not mention, but a closing semicolon at the end of the heredoc is actually interpreted as a real semicolon, and as such, sometimes leads to syntax errors.

This works:

<?php
$foo
= <<<END
abcd
END;
?>

This does not:

<?php
foo
(<<<END
abcd
END;
);
// syntax error, unexpected ';'
?>

Without semicolon, it works fine:

<?php
foo
(<<<END
abcd
END
);
?>
up
26
BahmanMD
2 years ago
In PHP 8.2 using ${var} in strings is deprecated, use {$var} instead:

<?php
$juice
= "apple";

// Valid. Explicitly specify the end of the variable name by enclosing it in braces:
echo "He drank some juice made of {$juice}s.";
?>
up
25
lelon at lelon dot net
20 years ago
You can use the complex syntax to put the value of both object properties AND object methods inside a string. For example...
<?php
class Test {
public
$one = 1;
public function
two() {
return
2;
}
}
$test = new Test();
echo
"foo {$test->one} bar {$test->two()}";
?>
Will output "foo 1 bar 2".

However, you cannot do this for all values in your namespace. Class constants and static properties/methods will not work because the complex syntax looks for the '$'.
<?php
class Test {
const
ONE = 1;
}
echo
"foo {Test::ONE} bar";
?>
This will output "foo {Test::one} bar". Constants and static properties require you to break up the string.
up
16
Ray.Paseur sometimes uses Gmail
6 years ago
md5('240610708') == md5('QNKCDZO')

This comparison is true because both md5() hashes start '0e' so PHP type juggling understands these strings to be scientific notation. By definition, zero raised to any power is zero.
up
16
og at gams dot at
18 years ago
easy transparent solution for using constants in the heredoc format:
DEFINE('TEST','TEST STRING');

$const = get_defined_constants();

echo <<<END
{$const['TEST']}
END;

Result:
TEST STRING
up
10
steve at mrclay dot org
16 years ago
Simple function to create human-readably escaped double-quoted strings for use in source code or when debugging strings with newlines/tabs/etc.

<?php
function doubleQuote($str) {
$ret = '"';
for (
$i = 0, $l = strlen($str); $i < $l; ++$i) {
$o = ord($str[$i]);
if (
$o < 31 || $o > 126) {
switch (
$o) {
case
9: $ret .= '\t'; break;
case
10: $ret .= '\n'; break;
case
11: $ret .= '\v'; break;
case
12: $ret .= '\f'; break;
case
13: $ret .= '\r'; break;
default:
$ret .= '\x' . str_pad(dechex($o), 2, '0', STR_PAD_LEFT);
}
} else {
switch (
$o) {
case
36: $ret .= '\$'; break;
case
34: $ret .= '\"'; break;
case
92: $ret .= '\\\\'; break;
default:
$ret .= $str[$i];
}
}
}
return
$ret . '"';
}
?>
up
3
greenbluemoonlight at gmail dot com
4 years ago
<?php
\\Example # 10 Simple Syntax - Solution for the last "echo" line.

class people {
public
$john = "John Smith";
public
$jane = "Jane Smith";
public
$robert = "Robert Paulsen";

public
$smith = "Smith";
}

$people = new people();

echo
"$people->john then said hello to $people->jane.".PHP_EOL;
echo
"$people->john's wife greeted $people->robert.".PHP_EOL;
echo
"$people->robert greeted the two $people->smiths";
\
\Won't work
\\Outputs: Robert Paulsen greeted the two

/**Solution:**\

echo "$people->robert greeted the two $people->smith\x08s";

\\Will work
\\Outputs: Robert Paulsen greeted the two Smiths

?>
up
9
atnak at chejz dot com
21 years ago
Here is a possible gotcha related to oddness involved with accessing strings by character past the end of the string:

$string = 'a';

var_dump($string[2]); // string(0) ""
var_dump($string[7]); // string(0) ""
$string[7] === ''; // TRUE

It appears that anything past the end of the string gives an empty string.. However, when E_NOTICE is on, the above examples will throw the message:

Notice: Uninitialized string offset: N in FILE on line LINE

This message cannot be specifically masked with @$string[7], as is possible when $string itself is unset.

isset($string[7]); // FALSE
$string[7] === NULL; // FALSE

Even though it seems like a not-NULL value of type string, it is still considered unset.
up
6
php at richardneill dot org
12 years ago
Leading zeroes in strings are (least-surprise) not treated as octal.
Consider:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x is $x, y is $y"; //prints "x is 123, y is 83"
in other words:
* leading zeros in numeric literals in the source-code are interpreted as "octal", c.f. strtol().
* leading zeros in strings (eg user-submitted data), when cast (implicitly or explicitly) to integer are ignored, and considered as decimal, c.f. strtod().
up
6
chAlx at findme dot if dot u dot need
16 years ago
To save Your mind don't read previous comments about dates ;)

When both strings can be converted to the numerics (in ("$a" > "$b") test) then resulted numerics are used, else FULL strings are compared char-by-char:

<?php
var_dump
('1.22' > '01.23'); // bool(false)
var_dump('1.22.00' > '01.23.00'); // bool(true)
var_dump('1-22-00' > '01-23-00'); // bool(true)
var_dump((float)'1.22.00' > (float)'01.23.00'); // bool(false)
?>
up
3
necrodust44 at gmail dot com
11 years ago
String conversion to numbers.

Unfortunately, the documentation is not correct.

«The value is given by the initial portion of the string. If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero).»

It is not said and is not shown in examples throughout the documentation that, while converting strings to numbers, leading space characters are ignored, like with the strtod function.

<?php
echo " \v\f \r 1234" + 1; // 1235
var_export ("\v\f \r 1234" == "1234"); // true
?>

However, PHP's behaviour differs even from the strtod's. The documentation says that if the string contains a "e" or "E" character, it will be parsed as a float, and suggests to see the manual for strtod for more information. The manual says

«A hexadecimal number consists of a "0x" or "0X" followed by a nonempty sequence of hexadecimal digits possibly containing a radix character, optionally followed by a binary exponent. A binary exponent consists of a 'P' or 'p', followed by an optional plus or minus sign, followed by a nonempty sequence of decimal digits, and indicates multiplication by a power of 2.»

But it seems that PHP does not recognise the exponent or the radix character.

<?php
echo "0xEp4" + 1; // 15
?>

strtod also uses the current locale to choose the radix character, but PHP ignores the locale, and the radix character is always 2E. However, PHP uses the locale while converting numbers to strings.

With strtod, the current locale is also used to choose the space characters, I don't know about PHP.
up
0
franko at email dot com
27 days ago
<?php
function doubleQuote($str) {
$ret = '"';
for (
$i = 0, $l = strlen($str); $i < $l; ++$i) {
$o = ord($str[$i]);
if (
$o < 31 || $o > 126) {
switch (
$o) {
case
9: $ret .= '\t'; break;
case
10: $ret .= '\n'; break;
case
11: $ret .= '\v'; break;
case
12: $ret .= '\f'; break;
case
13: $ret .= '\r'; break;
default:
$ret .= '\x' . str_pad(dechex($o), 2, '0', STR_PAD_LEFT);
}
} else {
switch (
$o) {
case
36: $ret .= '\$'; break;
case
34: $ret .= '\"'; break;
case
92: $ret .= '\\\\'; break;
default:
$ret .= $str[$i];
}
}
}
return
$ret . '"';
}
?>
up
2
headden at karelia dot ru
15 years ago
Here is an easy hack to allow double-quoted strings and heredocs to contain arbitrary expressions in curly braces syntax, including constants and other function calls:

<?php

// Hack declaration
function _expr($v) { return $v; }
$_expr = '_expr';

// Our playground
define('qwe', 'asd');
define('zxc', 5);

$a=3;
$b=4;

function
c($a, $b) { return $a+$b; }

// Usage
echo "pre {$_expr(1+2)} post\n"; // outputs 'pre 3 post'
echo "pre {$_expr(qwe)} post\n"; // outputs 'pre asd post'
echo "pre {$_expr(c($a, $b)+zxc*2)} post\n"; // outputs 'pre 17 post'

// General syntax is {$_expr(...)}
?>
To Top