Referencia: ¿qué significa este símbolo en PHP?

4481

¿Que es esto?

Esta es una colección de preguntas que surgen de vez en cuando sobre la sintaxis en PHP. Esta es también una Wiki de la comunidad, por lo que todos están invitados a participar en el mantenimiento de esta lista.

¿Por qué es esto?

Solía ​​ser difícil encontrar preguntas sobre operadores y otros tokens de sintaxis.
La idea principal es tener enlaces a preguntas existentes sobre Stack Overflow, por lo que es más fácil para nosotros hacer referencia a ellas, no copiar el contenido del Manual de PHP.

Nota: desde enero de 2013, Stack Overflow admite caracteres especiales . Simplemente rodee los términos de búsqueda entre comillas, por ejemplo[php] "==" vs "==="

¿Qué debo hacer aquí?

Si alguien te ha señalado aquí porque has hecho esa pregunta, busca la sintaxis particular a continuación. Las páginas vinculadas al manual de PHP junto con las preguntas vinculadas probablemente responderán su pregunta en ese momento. Si es así, se le anima a votar la respuesta. Esta lista no pretende ser un sustituto de la ayuda que otros proporcionaron.

La lista

Si su token en particular no se enumera a continuación, puede encontrarlo en la Lista de tokens de analizador .


& Operadores bit a bit o referencias


=& Referencias


&= Operadores bit a bit


&& Operadores logicos


% Operadores aritméticos


!! Operadores logicos


@ Operadores de control de errores


?: Operador ternario


?? Operador de fusión nula (desde PHP 7)


?string ?int ?array ?bool ?float Declaración de tipo de retorno anulable (desde PHP 7.1)


: Sintaxis alternativa para estructuras de control , operador ternario


:: Operador de resolución de alcance


\ Espacios de nombres


-> Clases y objetos


=> Matrices


^ Operadores bit a bit


>> Operadores bit a bit


<< Operadores bit a bit


<<< Heredoc o Nowdoc


= Operadores de Asignación


== Operadores de comparación


=== Operadores de comparación


!== Operadores de comparación


!= Operadores de comparación


<> Operadores de comparación


<=> Operadores de comparación (desde PHP 7.0)


| Operadores bit a bit


|| Operadores logicos


~ Operadores bit a bit


+ Operadores Aritméticos , Operadores de Arreglos


+=y -= operadores de asignación


++y -- operadores que aumentan / disminuyen


.= Operadores de Asignación


. Operadores de cadenas


, Argumentos de funciones

, Declaraciones variables


$$ Variable Variables


` Operador de ejecución


<?= Etiquetas abiertas cortas


[] Matrices (sintaxis corta desde PHP 5.4)


<? Etiquetas de apertura y cierre


... Desembalaje de argumentos (desde PHP 5.6)


** Exponenciación (desde PHP 5.6)


# Comentario de estilo de concha de una línea


:? Tipos de retorno anulables


?-> Llamadas de Operador NullSafe


Gordon
fuente
36
Sé que esto no es estrictamente PHP, pero ¿qué hay de incluir un enlace a phpdoc.org para la sintaxis de comentarios de phpDocumentor, que se usa comúnmente y también es imposible de buscar /**?
Mike
8
¿Puedo sugerir corchetes y corchetes?
ajreal
124
También me encontré con este problema mucho (no puedo buscar caracteres especiales), por eso hice SymbolHound , un motor de búsqueda que no ignora los caracteres especiales. También lo publiqué en StackApps .
dncrane
1
Bueno, del título ¿Por qué es esto? , Supongo que es porque "La idea principal es tener enlaces a preguntas existentes sobre Stack Overflow, por lo que es más fácil para nosotros hacer referencia a ellas".
Herbert
3
Se formuló una pregunta hoy (20 de noviembre / 15) stackoverflow.com/questions/33833259/what-is-rscat-in-php preguntando "¿Qué es $ rsCat en php?" (Si esa pregunta aún se hace visible y no se elimina) . Por extraño que parezca, no hay una referencia sobre $variable, sino solo sobre $$Variable Variables. Creo que debería enmendarse en alguna parte.
Funk Forty Niner

Respuestas:

1172

Operadores en aumento / decremento

++ operador de incremento

-- operador de decremento

Example    Name              Effect
---------------------------------------------------------------------
++$a       Pre-increment     Increments $a by one, then returns $a.
$a++       Post-increment    Returns $a, then increments $a by one.
--$a       Pre-decrement     Decrements $a by one, then returns $a.
$a--       Post-decrement    Returns $a, then decrements $a by one.

Estos pueden ir antes o después de la variable.

Si se coloca antes de la variable, la operación de incremento / decremento se realiza primero en la variable y luego se devuelve el resultado. Si se coloca después de la variable, la variable se devuelve primero , luego se realiza la operación de incremento / decremento.

Por ejemplo:

$apples = 10;
for ($i = 0; $i < 10; ++$i) {
    echo 'I have ' . $apples-- . " apples. I just ate one.\n";
}

Ejemplo en vivo

En el caso anterior ++$ise usa, ya que es más rápido. $i++tendría los mismos resultados.

El pre-incremento es un poco más rápido porque realmente incrementa la variable y luego 'devuelve' el resultado. El incremento posterior crea una variable especial, copia allí el valor de la primera variable y solo después de usar la primera variable, reemplaza su valor con el segundo.

Sin embargo, debe usar $apples--, ya que primero desea mostrar el número actual de manzanas y luego desea restarle una.

También puede incrementar letras en PHP:

$i = "a";
while ($i < "c") {
    echo $i++;
}

Una vez que zse alcanza aaes el siguiente, y así sucesivamente.

Tenga en cuenta que las variables de caracteres pueden incrementarse pero no disminuirse y, aun así, solo se admiten caracteres ASCII simples (az y AZ).


Publicaciones de desbordamiento de pila:

Peter Ajtai
fuente
99
+1 para la nota de que los decrementadores no funcionan en los personajes, solo en los números
Mark Baker
163
Por el bien de todos, elimine la información en negrita acerca de que el incremento previo sea infinitamente más rápido. Este es el peor ejemplo absoluto de optimización prematura y este tipo de información no debería estar en la cabeza de las personas si recién están comenzando a aprender PHP.
Lotus Notes
14
@Lotus: lo considero un hecho divertido. Si eres un principiante en PHP, o C ++, etc., parece bastante extraño que ++ i e i ++ sean lo suficientemente diferentes como para funcionar a diferentes velocidades. Lo encontré fascinante.
Peter Ajtai el
12
@ Peter Ajtai Sí, es interesante, pero por la forma en que ha estructurado su publicación, hace que parezca uno de los principales hechos de PHP que es absolutamente vital para usar el lenguaje.
Lotus Notes
44
No estoy seguro de si soy solo yo o no, pero el ejemplo de Apple parece un poco engañoso. 'Tengo 10 manzanas. Acabo de comer una 'me hace creer que tenía 11 manzanas, pero ahora tiene 10 porque acaba de comer una en lugar de comer una después de decir que tiene 10, lo que hace que tenga 9, que es lo que implica el código.
さ り げ な い 告白
440

Operador bit a bit

Que es un poco Un bit es una representación de 1 o 0. Básicamente OFF (0) y ON (1)

¿Qué es un byte? Un byte está formado por 8 bits y el valor más alto de un byte es 255, lo que significaría que cada bit está configurado. Veremos por qué el valor máximo de un byte es 255.

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------

Esta representación de 1 byte

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255 (1 byte)

Algunos ejemplos para una mejor comprensión.

El operador "Y": &

$a =  9;
$b = 10;
echo $a & $b;

Esto generaría el número 8. ¿Por qué? Bueno, veamos usando nuestro ejemplo de tabla.

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      &     |   0|  0|  0|  0| 1| 0| 0| 0|
------------------------------------------- 

Así que puedes ver en la tabla que el único bit que comparten juntos es el 8 bit.

Segundo ejemplo

$a =  36;
$b = 103;
echo $a & $b; // This would output the number 36.
$a = 00100100
$b = 01100111

Los dos bits compartidos son 32 y 4, que al sumarse devuelven 36.

El operador "O": |

$a =  9;
$b = 10;
echo $a | $b;

Esto generaría el número 11. ¿Por qué?

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      |     |   0|  0|  0|  0| 1| 0| 1| 1|
-------------------------------------------

Notará que tenemos un conjunto de 3 bits, en las columnas 8, 2 y 1. Sume esos: 8 + 2 + 1 = 11.

Ankur Saxena
fuente
66
¿Qué pasa si $ a toma un valor mayor que 255?
Aycan Yaşıt
@ AycanYaşıt La mayor parte del sistema operativo utiliza sistemas de 32 bits y 64 bits, lo que significa que el límite es mucho más de 255 (8 bits).
AlbertSamuel
@ AycanYaşıt En realidad, la representación aquí con una longitud de un byte ni siquiera es correcta, ya que incluso el entero más pequeño todavía tiene 64 bits (8 bytes) en memoria en una plataforma moderna de 64 bits.
Kaii
¿Por qué and &es 0 0 0 0 1 0 0 0 y or |es 0 0 0 0 1 0 1 1?
Vir
285

<=> Operador de nave espacial

Agregado en PHP 7

El operador de la nave espacial <=> es el último operador de comparación añadido en PHP 7. Es un no asociativo operador binario con la misma precedencia que los operadores de igualdad ( ==, !=, ===, !==). Este operador permite una comparación tripartita más simple entre los operandos izquierdo y derecho.

El operador da como resultado una expresión entera de:

  • 0 cuando ambos operandos son iguales
  • Menos que 0cuando el operando de la izquierda es menor que el operando de la derecha
  • Mayor que 0cuando el operando de la izquierda es mayor que el operando de la derecha

p.ej

1 <=> 1; // 0
1 <=> 2; // -1
2 <=> 1; // 1

Una buena aplicación práctica de usar este operador sería en devoluciones de llamada de tipo de comparación que se espera que devuelvan un entero cero, negativo o positivo basado en una comparación tripartita entre dos valores. La función de comparación que se pasa usortes uno de esos ejemplos.

Antes de PHP 7 escribirías ...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    if ($a < $b) {
        return -1;
    } elseif ($a > $b) {
        return 1;
    } else {
        return 0;
    }
});

Desde PHP 7 puedes escribir ...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    return $a <=> $b;
});
Sherif
fuente
21
No estoy seguro de cómo $a <=> $bes diferente$a - $b
rev
38
@AcidShout $a - $bfunciona para números, pero no para cadenas, objetos o matrices.
mcrumley
44
@mcrumley No, es peor que eso. En general $a - $bni siquiera funciona para números; funciona solo para enteros . No funciona para números no enteros, ya que convierte los usortvalores de retorno de la función de comparación en int, lo que significa que 0.5 se convierte en 0, lo que significa que dos números con una diferencia de menos de 1, como 4 y 4.6, pueden (dependiendo sobre el cual se pasa como primer argumento a su función de comparación) incorrectamente comparar como igual.
Mark Amery
55
@MarkAmery, la guía de migración no es el comportamiento documentado del operador. Para eso desea consultar la sección de operadores de idiomas del manual para esa comparación de php.net/language.operators.com, el comportamiento real detrás de esto se basa en varias funciones de comparación de la API, como cuando está haciendo strcmp para cadenas, donde No puede garantizar el valor de retorno real en cada caso. Claro, casi siempre es 1, 0 o -1, pero para los casos en los que no puede garantizarlo al envolver el strcmp de libc, ofrece el mismo comportamiento definido que la especificación subyacente para estar seguro
Sherif
99
@MarkAmery El punto aquí es no permitir que las personas confíen en comportamientos indefinidos. Para el caso en el que alguien obtiene un valor que no es exactamente 1, 0 o -1, hace que alguien presente un informe de error pensando que hay algo mal en el idioma. Es por eso que documentamos que todo lo que podemos garantizar es que el valor será menor que , mayor que o igual a 0, y no necesariamente 1, 0 y -1.
Sherif
273
Syntax    Name             Description

x == y    Equality         True if x and y have the same key/value pairs
x != y    Inequality       True if x is not equal to y
x === y   Identity         True if x and y have the same key/value pairs
                            in the same order and of the same types
x !== y   Non-identity     True if x is not identical to y
++ x      Pre-increment    Increments x by one, then returns x
x ++      Post-increment   Returns x, then increments x by one
-- x      Pre-decrement    Decrements x by one, then returns x
x --      Post-decrement   Returns x, then decrements x by one
x and y   And              True if both x and y are true x=6 y=3
                           (x < 10 and y > 1) returns true 
x && y    And              True if both x and y are true x=6 y=3
                           (x < 10 && y > 1) returns true
x or y     Or              True if any of x or y are true x=6 y=3
                           (x < 10 or y > 10) returns true 
x || y     Or              True if any of x or y are true x=6 y=3
                           (x < 3 || y > 1) returns true
a . b     Concatenation    Concatenate two strings: "Hi" . "Ha"
Ankur Saxena
fuente
239

Constantes mágicas : aunque estos no son solo símbolos sino parte importante de esta familia de fichas. Hay ocho constantes mágicas que cambian dependiendo de dónde se usan.

__LINE__: El número de línea actual del archivo.

__FILE__: La ruta completa y el nombre de archivo del archivo. Si se usa dentro de un include, se devuelve el nombre del archivo incluido. Desde PHP 4.0.2, __FILE__siempre contiene una ruta absoluta con enlaces simbólicos resueltos, mientras que en versiones anteriores contenía una ruta relativa en algunas circunstancias.

__DIR__: El directorio del archivo. Si se usa dentro de un include, se devuelve el directorio del archivo incluido. Esto es equivalente a dirname(__FILE__). Este nombre de directorio no tiene una barra inclinada final a menos que sea el directorio raíz. (Agregado en PHP 5.3.0.)

__FUNCTION__: El nombre de la función. (Agregado en PHP 4.3.0) A partir de PHP 5, esta constante devuelve el nombre de la función tal como se declaró (distingue entre mayúsculas y minúsculas). En PHP 4 su valor siempre está en minúscula.

__CLASS__: El nombre de la clase. (Agregado en PHP 4.3.0) A partir de PHP 5, esta constante devuelve el nombre de la clase tal como se declaró (distingue entre mayúsculas y minúsculas). En PHP 4 su valor siempre está en minúscula. El nombre de la clase incluye el espacio de nombres en el que se declaró (por ejemplo Foo\Bar). Tenga en cuenta que a partir de PHP 5.4 __CLASS__también funciona en rasgos. Cuando se usa en un método de rasgo, __CLASS__es el nombre de la clase en la que se usa el rasgo.

__TRAIT__: El nombre del rasgo. (Agregado en PHP 5.4.0) A partir de PHP 5.4, esta constante devuelve el rasgo tal como fue declarado (distingue entre mayúsculas y minúsculas). El nombre del rasgo incluye el espacio de nombres en el que se declaró (por ejemplo Foo\Bar).

__METHOD__: El nombre del método de clase. (Agregado en PHP 5.0.0) El nombre del método se devuelve como se declaró (distingue entre mayúsculas y minúsculas).

__NAMESPACE__: El nombre del espacio de nombres actual (distingue entre mayúsculas y minúsculas). Esta constante se define en tiempo de compilación (Agregado en PHP 5.3.0).

Fuente

n.1
fuente
150

Operadores de tipo

instanceof se usa para determinar si una variable PHP es un objeto instanciado de una clase determinada.

<?php
class mclass { }
class sclass { }
$a = new mclass;
var_dump($a instanceof mclass);
var_dump($a instanceof sclass);

El ejemplo anterior generará:

bool(true)
bool(false)

Motivo: el ejemplo anterior $aes un objeto de, por lo mclasstanto, use solo una mclassinformación que no sea una instancia consclass

Ejemplo con herencia

<?php 
class pclass { } 
class childclass extends pclass { } 
$a = new childclass; 
var_dump($a instanceof childclass); 
var_dump($a instanceof pclass);

El ejemplo anterior generará:

bool(true)
bool(true)

Ejemplo con clon

<?php 
class cloneable { } 
$a = new cloneable;
$b = clone $a; 
var_dump($a instanceof cloneable); 
var_dump($b instanceof cloneable);

El ejemplo anterior generará:

bool(true)
bool(true)
Maulik patel
fuente
77
Lo anterior también funciona con 'interfaces'. Esto es útil para verificar que una interfaz particular esté disponible.
Ryan Vincent
133

Una descripción general de los operadores en PHP :


Operadores logicos:

  • $ a && $ b: VERDADERO si $ a y $ b son VERDADEROS.
  • $ a || $ b: VERDADERO si $ a o $ b es VERDADERO.
  • $ a xor $ b: VERDADERO si $ a o $ b es VERDADERO, pero no ambos.
  • ! $ a: VERDADERO si $ a no es VERDADERO.
  • $ a y $ b: VERDADERO si $ a y $ b son VERDADEROS.
  • $ a o $ b: VERDADERO si $ a o $ b es VERDADERO.

Operadores de comparación:

  • $ a == $ b: VERDADERO si $ a es igual a $ b después del malabarismo de tipos.
  • $ a === $ b: VERDADERO si $ a es igual a $ b, y son del mismo tipo.
  • $ a! = $ b: VERDADERO si $ a no es igual a $ b después del malabarismo de tipos.
  • $ a <> $ b: VERDADERO si $ a no es igual a $ b después del malabarismo de tipos.
  • $ a! == $ b: VERDADERO si $ a no es igual a $ b, o si no son del mismo tipo.
  • $ a <$ b : VERDADERO si $ a es estrictamente menor que $ b.
  • $ a> $ b : VERDADERO si $ a es estrictamente mayor que $ b.
  • $ a <= $ b : VERDADERO si $ a es menor o igual que $ b.
  • $ a> = $ b : VERDADERO si $ a es mayor o igual que $ b.
  • $ a <=> $ b : Un número entero menor que, igual o mayor que cero cuando $ a es respectivamente menor, igual o mayor que $ b. Disponible a partir de PHP 7.
  • $ a? $ b: $ c : si $ a devuelve $ b más devuelve $ c ( operador ternario )
  • $ a ?? $ c : ¿Lo mismo que $ a? $ a: $ c ( operador de fusión nulo - requiere PHP> = 7)

Operadores aritméticos:

  • - $ a : opuesto a $ a.
  • $ a + $ b : Suma de $ a y $ b.
  • $ a - $ b : Diferencia de $ a y $ b.
  • $ a * $ b : Producto de $ a y $ b.
  • $ a / $ b : Cociente de $ a y $ b.
  • $ a% $ b : resto de $ a dividido por $ b.
  • $ a ** $ b : Resultado de elevar $ a a la potencia de $ b'th (introducido en PHP 5.6)

Operadores de aumento / disminución:

  • ++ $ a : Incrementa $ a en uno, luego devuelve $ a.
  • $ a ++ : Devuelve $ a, luego incrementa $ a en uno.
  • - $ a : disminuye $ a en uno, luego devuelve $ a.
  • $ a-- : Devuelve $ a, luego disminuye $ a por uno.

Operadores bit a bit:

  • $ a y $ b : se configuran los bits que se establecen en $ a y $ b.
  • $ a | $ b : se configuran los bits que se establecen en $ a o $ b.
  • $ a ^ $ b : Bits que se establecen en $ a o $ b pero no ambos.
  • ~ $ a : los bits que se establecen en $ a no se establecen, y viceversa.
  • $ a << $ b : desplaza los bits de $ a $ b pasos hacia la izquierda (cada paso significa "multiplicar por dos")
  • $ a >> $ b : desplaza los bits de $ a $ b pasos hacia la derecha (cada paso significa "dividir por dos")

Operadores de cadenas:

  • $ a. $ b : Concatenación de $ a y $ b.

Operadores de matrices:

  • $ a + $ b : Unión de $ a y $ b.
  • $ a == $ b : VERDADERO si $ a y $ b tienen los mismos pares clave / valor.
  • $ a === $ b : VERDADERO si $ a y $ b tienen los mismos pares clave / valor en el mismo orden y de los mismos tipos.
  • $ a! = $ b : VERDADERO si $ a no es igual a $ b.
  • $ a <> $ b : VERDADERO si $ a no es igual a $ b.
  • $ a! == $ b : VERDADERO si $ a no es idéntico a $ b.

Operadores de Asignación:

  • $ a = $ b : el valor de $ b se asigna a $ a
  • $ a + = $ b : igual que $ a = $ a + $ b
  • $ a - = $ b : igual que $ a = $ a - $ b
  • $ a * = $ b : igual que $ a = $ a * $ b
  • $ a / = $ b : igual que $ a = $ a / $ b
  • $ a% = $ b : igual que $ a = $ a% $ b
  • $ a ** = $ b : igual que $ a = $ a ** $ b
  • $ a. = $ b : igual que $ a = $ a. $ b
  • $ a & = $ b : igual que $ a = $ a & $ b
  • $ a | = $ b : igual que $ a = $ a | $ b
  • $ a ^ = $ b : igual que $ a = $ a ^ $ b
  • $ a << = $ b : igual que $ a = $ a << $ b
  • $ a >> = $ b : igual que $ a = $ a >> $ b

Nota

andoperador y oroperador tienen menor prioridad que el operador de asignación =.

Esto significa que $a = true and false;es equivalente a ($a = true) and false.

En la mayoría de los casos, es probable que desee utilizar &&y ||, que se comportan de una manera conocida de lenguajes como C, Java o JavaScript.

John Slegers
fuente
1
Hay un error en $a ?? $c, dice que es lo mismo que $a ? $a : $c, pero el operador ternario verifica si el valor es verdadero, por otro lado, la fusión nula verifica los valores nulos, por lo tanto, si $ a es 0, obtendrá 0 (porque 0 es no nulo), por ejemplo si tiene: $a=0; $c=5;luego $a?$a:$cdevuelve 5 y $a??$cdevuelve 0.
stramin
104

Operador de nave espacial<=> (agregado en PHP 7)

Ejemplos para el <=>operador de nave espacial (PHP 7, Fuente: Manual PHP):

Números enteros, flotantes, cadenas, matrices y objetos para la comparación tripartita de variables.

// Integers
echo 10 <=> 10; // 0
echo 10 <=> 20; // -1
echo 20 <=> 10; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
// Comparison is case-sensitive
echo "B" <=> "a"; // -1

echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1

// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

// Objects
$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 0

$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "c"]; 
echo $a <=> $b; // -1

$a = (object) ["a" => "c"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 1

// only values are compared
$a = (object) ["a" => "b"]; 
$b = (object) ["b" => "b"]; 
echo $a <=> $b; // 1
rajangupta
fuente
1
Ver php.net/manual/en/language.operators.comparison.php para la referencia
rajangupta
74

{} Llaves

Y algunas palabras sobre la última publicación.

$x[4] = 'd'; // it works
$x{4} = 'd'; // it works

$echo $x[4]; // it works
$echo $x{4}; // it works

$x[] = 'e'; // it works
$x{} = 'e'; // does not work

$x = [1, 2]; // it works
$x = {1, 2}; // does not work

echo "${x[4]}"; // it works
echo "${x{4}}"; // does not work

echo "{$x[4]}"; // it works
echo "{$x{4}}"; // it works
revs mnv
fuente
44
{''} notación para nombres de propiedad. echo $ películas-> película -> {'grandes líneas'} -> línea; se puede usar para acceder a datos en SimpleXMLElement. Quizás también se pueda usar en otros casos. php.net/manual/en/simplexml.examples-basic.php
Andrei
68

Operador de fusión nula (??)

Este operador se ha agregado en PHP 7.0 para el caso común de necesitar usar un operador ternario junto con isset(). Devuelve su primer operando si existe y no existe NULL; de lo contrario, devuelve su segundo operando.

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>
VIPIN A ROY
fuente
64

Cadenas PHP: Las cadenas PHP se pueden especificar de cuatro maneras, no solo de dos maneras:

1) Cadenas de comillas simples:

$string = 'This is my string'; // print This is my string

2) Cadenas de comillas dobles:

$str = 'string';

$string = "This is my $str"; // print This is my string

3) Heredoc:

$string = <<<EOD
This is my string
EOD; // print This is my string

4) Nowdoc (desde PHP 5.3.0):

$string = <<<'END_OF_STRING'
    This is my string 
END_OF_STRING; // print This is my string
devpro
fuente
@ Rizier123: ¿Qué significa "Heredocs no se puede utilizar para inicializar propiedades de clase. Desde PHP 5.3, esta limitación es válida solo para heredocs que contienen variables"?
PHPFan
48

PREGUNTA:

Que =>significa


RESPONDER:

=>Es el símbolo que los humanos decidimos usar para separar "Key" => "Value"pares en matrices asociativas.

ELABORANDO:

Para entender esto, tenemos que saber qué son las matrices asociativas. Lo primero que surge cuando un programador convencional piensa en una matriz ( en PHP ) sería algo similar a:

$myArray1 = array(2016, "hello", 33);//option 1

$myArray2 = [2016, "hello", 33];//option 2

$myArray3 = [];//option 3
$myArray3[] = 2016; 
$myArray3[] = "hello"; 
$myArray3[] = 33;

Donde como, si quisiéramos llamar a la matriz en alguna parte posterior del código, podríamos hacer:

echo $myArray1[1];// output: hello
echo $myArray2[1];// output: hello
echo $myArray3[1];// output: hello

Hasta aquí todo bien. Sin embargo, como humanos, podríamos tener dificultades para recordar que el índice [0]de la matriz es el valor del año 2016, el índice [1]de la matriz es un saludo y el índice [2]de la matriz es un valor entero simple . La alternativa que tendríamos es usar lo que se llama una matriz asociativa . Una matriz asociativa tiene algunas diferencias con respecto a una matriz secuencial ( que es lo que eran los casos anteriores, ya que incrementan el índice utilizado en una secuencia predeterminada, incrementando en 1 para cada valor siguiente ).

Diferencias ( entre una matriz secuencial y asociativa ):

  • Durante la declaración de una matriz asociativa, no solo incluye valuelo que desea poner en la matriz, sino que también coloca el valor de índice (llamado key) que desea usar al llamar a la matriz en partes posteriores de la matriz. código. La siguiente sintaxis se utiliza durante la misma de la declaración: "key" => "value".

  • Cuando se utiliza la matriz asociativa, el keyvalor se colocará dentro del índice de la matriz para recuperar el deseado value.

Por ejemplo:

    $myArray1 = array( 
        "Year" => 2016, 
        "Greetings" => "hello", 
        "Integer_value" => 33);//option 1

    $myArray2 = [ 
        "Year" =>  2016, 
        "Greetings" => "hello", 
        "Integer_value" => 33];//option 2

    $myArray3 = [];//option 3
    $myArray3["Year"] = 2016; 
    $myArray3["Greetings"] = "hello"; 
    $myArray3["Integer_value"] = 33;

Y ahora, para recibir el mismo resultado que antes, el keyvalor se usaría en el índice de matrices:

echo $myArray1["Greetings"];// output: hello
echo $myArray2["Greetings"];// output: hello
echo $myArray3["Greetings"];// output: hello

PUNTO FINAL:

Entonces, a partir del ejemplo anterior, es bastante fácil ver que el =>símbolo se usa para expresar la relación de una matriz asociativa entre cada uno de los pares keyy valueen una matriz DURANTE el inicio de los valores dentro de la matriz.

revs Webeng
fuente
36

Pregunta :

¿Qué significa "&" aquí en PHP?

Operador PHP "&"

Hace la vida más fácil una vez que nos acostumbramos ... (verifique el siguiente ejemplo cuidadosamente)

& generalmente verifica los bits que se establecen tanto en $ a como en $ b.

¿Has notado cómo funcionan estas llamadas?

   error_reporting(E_ERROR | E_WARNING | E_PARSE);
    error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
    error_reporting(E_ALL & ~E_NOTICE);
    error_reporting(E_ALL);

Así que detrás de todo lo anterior está el juego de operador bit a bit y bits.

Un caso útil de estas son configuraciones fáciles como las que se muestran a continuación, por lo que un solo campo entero puede almacenar miles de combos para usted.

La mayoría de las personas ya han leído los documentos, pero no confiaron en el caso de uso del mundo real de estos operadores bit a bit.

Ejemplo que te encantará

<?php

class Config {

    // our constants must be 1,2,4,8,16,32,64 ....so on
    const TYPE_CAT=1;
    const TYPE_DOG=2;
    const TYPE_LION=4;
    const TYPE_RAT=8;
    const TYPE_BIRD=16;
    const TYPE_ALL=31;

    private $config;

    public function __construct($config){
        $this->config=$config;

        if($this->is(Config::TYPE_CAT)){
            echo 'cat ';
        }
        if($this->is(Config::TYPE_DOG)){
            echo 'dog ';
        }
        if($this->is(Config::TYPE_RAT)){
            echo 'rat ';
        }
        if($this->is(Config::TYPE_LION)){
            echo 'lion ';
        }
        if($this->is(Config::TYPE_BIRD)){
            echo 'bird ';
        }
        echo "\n";
    }

    private function is($value){
        return $this->config & $value;
    }
}

new Config(Config::TYPE_ALL);
// cat dog rat lion bird
new Config(Config::TYPE_BIRD);
//bird
new Config(Config::TYPE_BIRD | Config::TYPE_DOG);
//dog bird
new Config(Config::TYPE_ALL & ~Config::TYPE_DOG & ~Config::TYPE_CAT);
//rat lion bird
revs dev.mraj
fuente
30

== se usa para verificar la igualdad sin considerar el tipo de datos variable

===se utiliza para verificar la igualdad tanto para el valor variable como para el tipo de datos

Ejemplo

$a = 5

  1. if ($a == 5) - evaluará a verdadero

  2. if ($a == '5') - se evaluará como verdadero, porque al comparar este valor, PHP convierte internamente ese valor de cadena en entero y luego compara ambos valores

  3. if ($a === 5) - evaluará a verdadero

  4. if ($a === '5') - se evaluará como falso, porque el valor es 5, pero este valor 5 no es un entero.

Parth Nayak
fuente
27

Operador de fusión nula "??" (Agregado en PHP 7)

No es el nombre más pegadizo para un operador, pero PHP 7 trae la combinación nula bastante práctica, así que pensé en compartir un ejemplo.

En PHP 5, ya tenemos un operador ternario, que prueba un valor, y luego devuelve el segundo elemento si eso devuelve verdadero y el tercero si no lo hace:

echo $count ? $count : 10; // outputs 10

También hay una abreviatura para eso que le permite omitir el segundo elemento si es el mismo que el primero: echo $ count?: 10; // también produce 10

En PHP 7, además, tenemos el ?? operador que, en lugar de indicar una confusión extrema, que es la forma en que generalmente usaría dos signos de interrogación juntos, nos permite encadenar una cadena de valores. Leyendo de izquierda a derecha, el primer valor que existe y no es nulo es el valor que se devolverá.

// $a is not set
$b = 16;

echo $a ?? 2; // outputs 2
echo $a ?? $b ?? 7; // outputs 16

Esta construcción es útil para dar prioridad a uno o más valores provenientes quizás de la entrada del usuario o de la configuración existente, y retroceder de manera segura en un valor predeterminado dado si falta esa configuración. Es una especie de característica pequeña, pero sé que la usaré tan pronto como mis aplicaciones se actualicen a PHP 7.

Yogi Ghorecha
fuente
12

Declaración de tipo de retorno anulable

PHP 7 agrega soporte para declaraciones de tipo de retorno. De manera similar a las declaraciones de tipo de argumento, las declaraciones de tipo de retorno especifican el tipo de valor que se devolverá de una función. Los mismos tipos están disponibles para las declaraciones de tipo de retorno que están disponibles para las declaraciones de tipo de argumento.

La escritura estricta también tiene un efecto en las declaraciones de tipo de retorno. En el modo débil predeterminado, los valores devueltos se convertirán al tipo correcto si aún no son de ese tipo. En modo fuerte, el valor devuelto debe ser del tipo correcto, de lo contrario, se lanzará un TypeError.

A partir de PHP 7.1.0, los valores de retorno se pueden marcar como anulables al prefijar el nombre del tipo con un signo de interrogación (?) Esto significa que la función devuelve el tipo especificado o NULL.

<?php
function get_item(): ?string {
    if (isset($_GET['item'])) {
        return $_GET['item'];
    } else {
        return null;
    }
}
?>

Fuente

John Conde
fuente
7

Tres DOTS como operador de Splat (...) (desde PHP 5.6)

PHP tiene un operador "..." (Tres puntos) que se denomina Operador Splat. Se utiliza para pasar un número arbitrario de parámetros en una función y este tipo de función se denomina Funciones Variadas. Tomemos ejemplos de uso de "..." (Tres puntos).

Ejemplo 1:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

echo calculateNumbers(10, 20, 30, 40, 50);

//Output 150
?>

Cada argumento de la función CalculateNumbers () pasa a través de $ params como una matriz cuando se usa "...".

Hay muchas formas diferentes de utilizar el operador "...". A continuación algunos ejemplos:

Ejemplo 2

<?php
function calculateNumbers($no1, $no2, $no3, $no4, $no5){
    $total = $no1 + $no2 + $no3 + $no4 + $no5;
    return $total;
}

$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers(...$numbers);

//Output 150
?>

Ejemplo 3

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}
$no1 = 70;
$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers($no1, ...$numbers);

//Output 220
?>

Ejemplo 4

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

$numbers1 = array(10, 20, 30, 40, 50);
$numbers2 = array(100, 200, 300, 400, 500);
echo calculateNumbers(...$numbers1, ...$numbers2);

//Output 1650

?>
Yogi Ghorecha
fuente
0

? -> Operador NullSafe

Por el momento, es solo una propuesta, puedes encontrarla aquí . Es el NullSafe Operator, vuelve nullen caso de que intentes invocar funciones u obtener valores de null... Ejemplo

$objDrive = null;
$drive = $objDrive?->func?->getDriver()?->value; //return null
$drive = $objDrive->func->getDriver()->value; // Error: Trying to get property 'func' of non-object
John Conde
fuente
Agregar esto parece bastante prematuro, nadie verá este operador en ningún código en vivo, y es posible que ni siquiera se agregue. Sería mejor esperar hasta que se finalicen los detalles y documentarlo adecuadamente.
IMSoP
Ya estamos recibiendo preguntas al respecto. : / Si la propuesta falla, podemos decidir si vale la pena conservarla.
John Conde
@JohnConde ves? esto es lo que estaba diciendo ...
Berto99
@JohnConde Me sentiría tentado a cerrarlos como fuera de tema, porque están preguntando acerca de un lenguaje de programación imaginario; o tal vez "esta pregunta pertenece a una parte diferente de la línea de tiempo, verifique la configuración en su máquina del tiempo";)
IMSoP
jajaja El pensamiento cruzó por mi mente. Me pregunté si esto ofrecería valor a los futuros visitantes y, por ahora, la respuesta es "sí". Pero eso puede cambiar ...
John Conde
0

Operador NullSafe "? ->" (posiblemente) desde php8

Por el momento, es solo una propuesta, puede encontrarla ingrese la descripción del enlace aquí . ?->es el NullSafe Operator, vuelve nullen caso de que intentes invocar funciones u obtener valores de null...

Ejemplos:

<?php
$obj = null;
$obj = $obj?->attr; //return null
$obj = ?->funct(); // return null
$obj = $objDrive->attr; // Error: Trying to get property 'attr' of non-object
?>
revs Berto99
fuente
Agregar esto parece bastante prematuro, nadie verá este operador en ningún código en vivo, y es posible que ni siquiera se agregue. Sería mejor esperar hasta que se finalicen los detalles y documentarlo adecuadamente.
IMSoP
@IMSoP Estoy contigo, sin embargo, me invitaron a hacerlo aquí stackoverflow.com/questions/62178354/… ...
Berto99
Parece que ahora tenemos dos respuestas sobre esto. Personalmente, habría votado para cerrar la otra pregunta en lugar de tratar de responder, porque en este momento no existe ese operador.
IMSoP
@IMSoP hay muchas preguntas aquí en StackOverflow sobre la propuesta de C ++, y no se han cerrado: a pesar de eso, estoy con usted por no publicar aquí este operador por el momento
Berto99
No sé mucho sobre el proceso de C ++ y cuando es razonable discutir propuestas, y para ser justos, parece bastante probable que esta tenga éxito en la modificación del entrenamiento, pero en general hay muchas características propuestas para PHP que nunca llegan a lenguaje, y sería bastante confuso para los usuarios encontrarlos a todos en las listas de referencias. Dicho esto, en parte solo estoy siendo un viejo gruñón aquí: P
IMSoP