Entre comillas simples
La manera más simple de especificar un string es encerrarlo entre
comillas simples (el caracter '
).
Para especificar una comilla simple literal, escápela con un antislash
(\
). Para especificar un antislash literal, duplícalo
(\\
). Todas las demás ocurrencias del antislash serán tratadas
como un antislash literal: esto significa que otras secuencias de escape que usted
podría conocer, tales como \r
o \n
,
serán salidas literalmente como se especifica 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 caracteres especiales no serán extendidas
cuando se encuentren en strings entre comillas simples.
Ejemplo #1 Variantes de sintaxis
<?php
echo 'esto es un string simple', PHP_EOL;
echo 'Usted puede también tener nuevas líneas integradas
en los strings de esta manera, ya que
es aceptable hacerlo.', PHP_EOL;
// Muestra: Arnold dijo una vez: "Volveré"
echo 'Arnold dijo una vez: "Volveré"', PHP_EOL;
// Muestra: ¿Usted ha borrado C:\*.*?
echo '¿Usted ha borrado C:\\*.* ?', PHP_EOL;
// Muestra: ¿Usted ha borrado C:\*.*?
echo '¿Usted ha borrado C:\*.* ?', PHP_EOL;
// Muestra: Esto no se extenderá: \n una nueva línea
echo 'Esto no se\'extenderá: \n una nueva línea', PHP_EOL;
// Muestra: Las variables no $se\'extienden $tampoco
echo 'Las variables no $se\'extienden $tampoco', PHP_EOL;
?>
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 mismo sigue, luego
el mismo identificador nuevamente para cerrar la cita.
El identificador de cierre puede estar indentado con espacios o tabulaciones, en cuyo caso
la indentación 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 nombramiento que cualquier
otro 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 indentación
echo <<<END
a
b
c
\n
END;
// 4 espacios de indentación
echo <<<END
a
b
c
END;
Salida del ejemplo anterior en PHP 7.3:
Si el identificador de cierre está indentado más que cualquier línea del cuerpo, entonces se levantará un ParseError:
Ejemplo #3 El identificador de cierre no debe estar indentado más que cualquier 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á indentado, las tabulaciones también pueden ser utilizadas, sin embargo,
las tabulaciones y los espacios no deben mezclarse en cuanto a
la indentación del identificador de cierre y la indentación del cuerpo
(hasta el identificador de cierre). En cualquiera de estos casos, se levantará un ParseError.
Estas restricciones de espacio han sido incluidas porque mezclar espacios y tabulaciones para la indentación perjudica la legibilidad.
Ejemplo #4 Indentación diferente para el cuerpo (espacios) identificador de cierre
<?php
// Todo el código siguiente no funciona.
// indentación diferente 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 es 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 ha sido encontrado al principio de una línea, entonces
no importa si formaba parte de otra palabra, puede ser considerado
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 una palabra que aparezca en el cuerpo del texto
como identificador de cierre.
Advertencia
Antes de PHP 7.3.0, es muy importante señalar 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 principalmente que el identificador
no puede estar indentado, 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 en 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 esta regla se viola y el identificador de cierre no está "limpio", no será
considerado como un identificador de cierre, y PHP continuará buscando uno. Si un
identificador de cierre adecuado no se encuentra antes del final del archivo
actual, se producirá un error de análisis en la última línea.
Ejemplo #7 Ejemplo inválido, antes de PHP 7.3.0
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
// El identificador no debe estar indentado
?>
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 ser utilizados 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 en un heredoc no necesitan ser escapadas, pero los códigos de escape mencionados anteriormente pueden seguir siendo utilizados. Las variables son desarrolladas, pero debe tenerse 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
que se extiende sobre múltiples 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, estoy imprimiendo {$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, estoy imprimiendo Bar2.
Esto debería imprimir una 'A' mayúscula: A
También es posible utilizar la sintaxis heredoc para pasar datos a los argumentos de función:
Ejemplo #10 Heredoc en ejemplos de argumentos
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
Es posible inicializar variables estáticas y propiedades/constantes de clase utilizando 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 ninguna interpolación de string es realizada dentro de un nowdoc. La construcción es ideal para integrar código PHP o 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 es identificado 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 aquellas concernientes a la apariencia del identificador de cierre.
Ejemplo #13 Ejemplo de cita de string nowdoc
<?php
echo <<<'EOD'
Ejemplo de string que se extiende sobre múltiples líneas
usando la sintaxis nowdoc. Las barras invertidas son siempre tratadas literalmente,
es decir \\ y \'.
EOD;
El resultado del ejemplo sería:
Ejemplo de string que se extiende sobre múltiples líneas
usando la sintaxis nowdoc. Las barras invertidas son siempre tratadas 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, estoy imprimiendo {$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, estoy imprimiendo {$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 es especificado entre comillas dobles o con heredoc,
las variables pueden ser sustituidas dentro.
Existen dos tipos de sintaxis: una
básica y una
avanzada.
La sintaxis básica es la más común y práctica. Ofrece un medio para incorporar una variable,
un valor array o una propiedad objeto en un string con un mínimo de esfuerzo.
Sintaxis básica
Si un signo de dólar ($
) es encontrado, los caracteres que lo siguen y que pueden ser utilizados en un nombre de variable serán interpretados como tales y sustituidos.
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:
La sintaxis de interpolación de string
avanzada debería ser utilizada en su lugar.
Nota:
Si no es posible formar un nombre válido, el signo de dólar
tal cual en el string:
Ejemplo #17 Interpolación del valor de la primera dimensión de un array o propiedad
<?php
$juices = array("manzana", "naranja", "string_key" => "violet");
echo "Él bebió un poco de $juices[0] jugo.";
echo PHP_EOL;
echo "Él bebió un poco de $juices[1] jugo.";
echo PHP_EOL;
echo "Él bebió 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:
Él bebió un poco de manzana jugo.
Él bebió un poco de naranja jugo.
Él bebió un poco de violet jugo.
Valor del objeto: string.
Nota:
La clave del array debe ser no citada, y por lo tanto no es posible
referenciar una constante como clave con la sintaxis básica. Utilice 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 accesorios arbitrarios.
Cualquier variable escalar, elemento de array o propiedad de objeto
(estática o no) con una representación
string puede ser incluida mediante esta sintaxis.
La expresión es escrita de la misma manera que aparecería fuera de la
string, luego encerrada entre {
y
}
. Dado que {
no puede ser escapado, esta
sintaxis solo será reconocida cuando el $
siga inmediatamente al
{
. Utilice {\$
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á, mostrará: Esto es { fantástico}
echo "Esto es { $great}";
// Funciona, mostrará: Esto es fantástico
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 utilizar arrays multidimensionales, siempre use 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á, mostrará: C:\directory\{fantástico}.txt
echo "C:\directory\{$great}.txt";
// Funciona, mostrará: C:\directory\fantástico.txt
echo "C:\\directory\\{$great}.txt";
?>
Nota:
Como esta sintaxis permite expresiones arbitrarias, es posible utilizar
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 offset basado en cero del carácter deseado después del
string utilizando 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 offsets de string negativos también son soportados. Estos especifican
el offset desde el final del string.
Anteriormente, los offsets 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 utilizando llaves, como en
$str{42}, para el mismo propósito.
Esta sintaxis de llaves fue deprecada desde PHP 7.4.0 y ya no es soportada desde PHP 8.0.0.
Advertencia
Escribir en un offset fuera de alcance llena el string con espacios.
Los tipos no enteros son convertidos a entero.
Un tipo de offset ilegal emite E_WARNING
.
Solo el primer carácter de un string asignado es utilizado.
Desde PHP 7.1.0, asignar un string vacío genera un error fatal. Anteriormente,
esto asignaba un octeto NULL.
Advertencia
Internamente, los strings PHP son arrays de octetos. En consecuencia, acceder o
modificar un string utilizando corchetes de array no es seguro para multi-octetos, y
solo debe hacerse con strings en codificación de un solo octeto 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 era silenciosamente convertido a 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 = 'Mire el mar';
$str[strlen($str)-1] = 'e';
var_dump($str);
?>
Los offsets de string deben ser enteros o strings que parezcan enteros,
de lo contrario se emitirá una advertencia.
Ejemplo #21 Ejemplo de offsets 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 (excepto arrays u objetos
que implementen las interfaces apropiadas) utilizando []
o
{}
devuelve silenciosamente null
.
Nota:
Los caracteres en literales de string pueden ser accedidos
utilizando []
o {}
.
Nota:
Acceder a caracteres en literales de string utilizando la
sintaxis {}
fue deprecada en PHP 7.4.
Esto fue eliminado en PHP 8.0.