Odniesienie - Co oznacza ten symbol w PHP?

4476

Co to jest?

Jest to zbiór pytań, które pojawiają się co jakiś czas na temat składni w PHP. To jest także Wiki Wiki, więc wszyscy są zaproszeni do udziału w utrzymywaniu tej listy.

Dlaczego to?

Kiedyś trudno było znaleźć pytania dotyczące operatorów i innych tokenów składniowych.¹
Główną ideą jest posiadanie linków do istniejących pytań na temat przepełnienia stosu, więc łatwiej jest nam się do nich odwoływać, a nie kopiować treści z Podręcznika PHP.

Uwaga: od stycznia 2013 r. Przepełnienie stosu obsługuje znaki specjalne . Otocz wyszukiwane hasła cudzysłowami, np[php] "==" vs "==="

Co mam tu zrobić?

Jeśli ktoś Cię tu wskazał, ponieważ zadałeś takie pytanie, zapoznaj się ze szczególną składnią poniżej. Połączone strony podręcznika PHP wraz z połączonymi pytaniami prawdopodobnie odpowiedzą na twoje pytanie. Jeśli tak, zachęcamy do głosowania za odpowiedzią. Ta lista nie ma na celu zastąpienia pomocy udzielanej przez innych.

Lista

Jeśli Twojego konkretnego tokena nie ma na liście poniżej, możesz go znaleźć na Liście tokenów analizatora składni .


& Operatory bitowe lub referencje


=& Bibliografia


&= Operatory bitowe


&& Operatory logiczne


% Operatory arytmetyczne


!! Operatory logiczne


@ Operatorzy kontroli błędów


?: Operator trójskładnikowy


?? Operator zerowej koalescencji (od PHP 7)


?string ?int ?array ?bool ?float Nullable return return return (od PHP 7.1)


: Alternatywna składnia dla struktur kontrolnych , operator trójskładnikowy


:: Operator rozstrzygania zakresu


\ Przestrzenie nazw


-> Klasy I Przedmioty


=> Tablice


^ Operatory bitowe


>> Operatory bitowe


<< Operatory bitowe


<<< Heredoc lub Nowdoc


= Operatorzy przydziału


== Operatory porównania


=== Operatory porównania


!== Operatory porównania


!= Operatory porównania


<> Operatory porównania


<=> Operatory porównania (od PHP 7.0)


| Operatory bitowe


|| Operatory logiczne


~ Operatory bitowe


+ Operatory arytmetyczne , Operatorzy Array


+=i -= operatorzy przydziału


++oraz -- operatory inkrementacji / dekrementacji


.= Operatorzy przydziału


. Operatory łańcuchowe


, Argumenty funkcji

, Deklaracje zmienne


$$ Zmienne Zmienne


` Operator wykonawczy


<?= Krótkie otwarte tagi


[] Tablice (krótka składnia od PHP 5.4)


<? Otwieranie i zamykanie tagów


... Rozpakowywanie argumentów (od PHP 5.6)


** Potęgowanie (od PHP 5.6)


# Jednowierszowy komentarz w stylu powłoki


:? Typy zwracanych wartości zerowych


Gordon
źródło
36
Wiem, że nie jest to wyłącznie PHP, ale co z dołączeniem linku do phpdoc.org dla składni komentarzy phpDocumentor, która jest powszechnie używana i nie można jej również szukać /**?
Mike
8
Czy mogę zasugerować nawias kwadratowy i nawias klamrowy?
ajreal
124
Bardzo często napotykałem ten problem (brak możliwości wyszukiwania znaków specjalnych), dlatego stworzyłem SymbolHound , wyszukiwarkę, która nie ignoruje znaków specjalnych. Opublikowałem go również na StackApps .
dncrane
1
Z nagłówka Dlaczego to jest? , Zgaduję, że dzieje się tak, ponieważ „Główną ideą jest posiadanie linków do istniejących pytań na temat przepełnienia stosu, więc łatwiej nam się do nich odwoływać”.
Herbert
3
Pytanie zostało zadane dzisiaj (20 listopada 15) stackoverflow.com/questions/33833259/what-is-rscat-in-php z pytaniem „Co to jest $ rsCat w php” (czy to pytanie powinno być nadal widoczne i nie usuwane) . O dziwo, nie ma odniesienia do $zmiennej, ale $$tylko do zmiennych. Uważam, że należy to gdzieś zmienić.
Funk Forty Niner,

Odpowiedzi:

1170

Operatory inkrementacji / dekrementacji

++ operator przyrostowy

-- operator dekrementacji

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.

Mogą iść przed zmienną lub po niej.

Jeśli zostanie wstawiona przed zmienną, operacja inkrementacji / dekrementacji jest wykonywana najpierw dla zmiennej, a następnie zwracany jest wynik. Jeśli wstawiona po zmiennej, zmienna jest najpierw zwracana, a następnie wykonywana jest operacja zwiększania / zmniejszania.

Na przykład:

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

Przykład na żywo

W powyższym przypadku ++$ijest używana, ponieważ jest szybsza. $i++miałby takie same wyniki.

Wstępna inkrementacja jest nieco szybsza, ponieważ tak naprawdę inkrementuje zmienną, a następnie „zwraca” wynik. Post-inkrement tworzy specjalną zmienną, kopiuje tam wartość pierwszej zmiennej i dopiero po użyciu pierwszej zmiennej zastępuje jej wartość drugą.

Musisz jednak użyć $apples--, ponieważ najpierw chcesz wyświetlić bieżącą liczbę jabłek, a następnie odjąć jedno od niej.

Możesz także zwiększać litery w PHP:

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

Po zosiągnięciu aajest następny i tak dalej.

Należy pamiętać, że zmienne znakowe można zwiększać, ale nie zmniejszać, a mimo to obsługiwane są tylko zwykłe znaki ASCII (az i AZ).


Stosy przepełnienia stosu:

Peter Ajtai
źródło
9
+1 za notatkę, że środki zmniejszające nie działają na postaciach, tylko na liczbach
Mark Baker
163
Ze względu na wszystkich, usuń pogrubioną informację o tym, że wstępne zwiększanie jest nieskończenie szybsze. Jest to absolutnie najgorszy przykład przedwczesnej optymalizacji i tego rodzaju informacje nie powinny być w głowach ludzi, jeśli dopiero zaczynają uczyć się PHP.
Lotus Notes,
14
@Lotus - uważam to za zabawny fakt. Jeśli jesteś początkującym w PHP lub C ++ itp., Wydaje się dość zwariowane, że ++ i i ++ są na tyle różne, że działają z różnymi prędkościami. Uważam to za fascynujące.
Peter Ajtai,
12
@Peter Ajtai Tak, to interesujące, ale ze względu na strukturę postu sprawiasz wrażenie, że jest to jeden z głównych faktów PHP, który jest absolutnie niezbędny do używania tego języka.
Lotus Notes,
4
Nie jestem pewien, czy to tylko ja, czy nie, ale przykład jabłka wydaje się trochę mylący. „Mam 10 jabłek. Właśnie zjadłem jedno ”, pozwala mi uwierzyć, że miałeś 11 jabłek, ale teraz masz 10, ponieważ właśnie zjadłeś jedno, a nie jesz po tym, jak powiedziałeś, że masz 10, a zatem masz 9 - co sugeruje kod.
さ り げ な い 告白
440

Operator bitowy

Co to jest trochę Bit reprezentuje 1 lub 0. Zasadniczo WYŁ (0) i WŁĄCZ (1)

Co to jest bajt? Bajt składa się z 8 bitów, a najwyższa wartość bajtu to 255, co oznacza, że ​​każdy bit jest ustawiony. Przyjrzymy się, dlaczego maksymalna wartość bajtu wynosi 255.

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

Ta reprezentacja 1 bajtu

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

Kilka przykładów lepszego zrozumienia

Operator „AND”: &

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

Spowoduje to wyświetlenie liczby 8. Dlaczego? Zobaczmy, korzystając z naszego przykładu tabeli.

-------------------------------------------
|      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|
------------------------------------------- 

Więc możesz zobaczyć z tabeli, że jedynym wspólnym bitem jest 8 bitów.

Drugi przykład

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

Dwa wspólne bity to 32 i 4, które po zsumowaniu zwracają 36.

Operator „Lub”: |

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

Spowoduje to wyświetlenie liczby 11. Dlaczego?

-------------------------------------------
|      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|
-------------------------------------------

Zauważysz, że mamy ustawione 3 bity w kolumnach 8, 2 i 1. Dodaj te: 8 + 2 + 1 = 11.

Ankur Saxena
źródło
6
Co jeśli $ a przyjmuje wartość większą niż 255?
Aycan Yaşıt
@ AycanYaşıt Większość systemu operacyjnego używa systemu 32-bitowego i 64-bitowego, co oznacza, że ​​limit jest znacznie większy niż 255 (8 bitów).
AlbertSamuel
@ AycanYaşıt W rzeczywistości reprezentacja tutaj o długości jednego bajtu nie jest nawet poprawna, ponieważ nawet najmniejsza liczba całkowita nadal ma pamięć 64-bitową (8 bajtów) na nowoczesnej platformie 64-bitowej.
Kaii
Dlaczego and &jest 0 0 0 0 1 0 0 0 i or |jest 0 0 0 0 1 0 1 1?
Vir
285

<=> Operator statku kosmicznego

Dodano w PHP 7

Operator statku kosmicznego <=> to najnowszy operator porównania dodany w PHP 7. Jest to non-asocjacyjne operatorem, z tego samego pierwszeństwa operatorów równości ( ==,!= , ===, !==). Ten operator pozwala na łatwiejsze trójstronne porównanie operandów po lewej i po prawej stronie.

Operator skutkuje wyrażeniem liczby całkowitej:

  • 0 gdy oba operandy są równe
  • Mniej niż 0 wtedy, gdy lewy operand jest mniejszy niż prawy operand
  • Większy niż 0wtedy, gdy lewy operand jest większy niż prawy operand

na przykład

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

Dobrym praktycznym zastosowaniem użycia tego operatora byłoby wywołanie zwrotne typu porównawczego, które powinno zwrócić zero, ujemną lub dodatnią liczbę całkowitą na podstawie trójstronnego porównania dwóch wartości. Funkcja porównania została przekazana dousort jest jednym z takich przykładów.

Przed PHP 7 pisałeś ...

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

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

Od PHP 7 możesz pisać ...

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

usort($arr, function ($a, $b) {
    return $a <=> $b;
});
Sherif
źródło
21
Nie wiesz, w jaki sposób $a <=> $bróżni się$a - $b
rev
38
@AcidShout $a - $bdziała na liczbach, ale nie na ciągi, obiekty ani tablice.
mcrumley,
44
@mcrumley Nie, to gorsze niż to. Zasadniczo $a - $bnawet nie działa dla liczb; działa tylko dla liczb całkowitych . Nie działa dla liczb niecałkowitych, ponieważ usortrzutuje wartości zwracane przez funkcję komparatora na int, co oznacza, że ​​0,5 zostaje rzutowane na 0, co oznacza, że ​​dwie liczby z różnicą mniejszą niż 1, takie jak 4 i 4.6, mogą (w zależności na którym jeden jest przekazywany jako pierwszy argument funkcji porównawczej) niepoprawnie porównuj jako równy.
Mark Amery
5
@ MarkAmery przewodnik migracji nie jest udokumentowanym zachowaniem operatora. Aby to zrobić, zajrzyj do sekcji operatorów języka w podręczniku dla tego php.net/language.operators.comparison, rzeczywiste zachowanie za tym polega na różnych funkcjach porównawczych API, na przykład gdy robisz strcmp dla ciągów, gdzie nie można zagwarantować rzeczywistej wartości zwrotu w każdym przypadku. Jasne, prawie zawsze jest to 1, 0 lub -1, ale w przypadkach, w których nie możesz tego zagwarantować, tak jak w przypadku pakowania strcmp libc, oferujesz to samo zdefiniowane zachowanie, co podstawowa specyfikacja, aby być bezpiecznym
Sherif
9
@MarkAmery Chodzi tutaj o to, aby ludzie nie mogli polegać na niezdefiniowanym zachowaniu. W jednym przypadku, gdy ktoś otrzymuje wartość, która nie jest dokładnie równa 1, 0 lub -1, ktoś zgłasza błąd, sądząc, że coś jest nie tak z tym językiem. Dlatego dokumentujemy, że wszystko, co możemy zagwarantować, to wartość mniejsza , większa lub równa 0, a niekoniecznie 1, 0 i -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
źródło
239

Stałe magiczne : chociaż nie są to tylko symbole, ale ważna część tej rodziny żetonów. Istnieje osiem magicznych stałych, które zmieniają się w zależności od miejsca ich użycia.

__LINE__: Bieżący numer wiersza pliku.

__FILE__: Pełna ścieżka i nazwa pliku. Jeśli zostanie zastosowany w pliku dołączanym, zwracana jest nazwa dołączonego pliku. Od PHP 4.0.2__FILE__ zawsze zawiera bezwzględną ścieżkę z rozwiązanymi dowiązaniami symbolicznymi, podczas gdy w starszych wersjach zawierała ścieżkę względną w pewnych okolicznościach.

__DIR__: Katalog pliku. Jeśli zostanie zastosowany w pliku include, zwrócony zostanie katalog dołączonego pliku. Jest to równoważne zdirname(__FILE__) . Ta nazwa katalogu nie ma ukośnika końcowego, chyba że jest to katalog główny. (Dodano w PHP 5.3.0.)

__FUNCTION__: Nazwa funkcji. (Dodano w PHP 4.3.0) Od wersji PHP 5 ta stała zwraca nazwę funkcji tak, jak została zadeklarowana (wielkość liter ma znaczenie). W PHP 4 jego wartość jest zawsze pisana małymi literami.

__CLASS__: Nazwa klasy. (Dodano w PHP 4.3.0) Od PHP 5 ta stała zwraca nazwę klasy w takiej postaci, w jakiej została zadeklarowana (wielkość liter ma znaczenie). W PHP 4 jego wartość jest zawsze pisana małymi literami. Nazwa klasy obejmuje przestrzeń nazw, w której została zadeklarowana (np Foo\Bar.). Zauważ, że od PHP 5.4 __CLASS__działa również w cechach. W przypadku metody cechy __CLASS__jest nazwą klasy, w której ta cecha jest używana.

__TRAIT__: Nazwa cechy. (Dodano w PHP 5.4.0) Od PHP 5.4 ta stała zwraca cechę taką, jaka została zadeklarowana (z rozróżnianiem wielkości liter). Nazwa cechy obejmuje przestrzeń nazw, w której została zadeklarowana (np Foo\Bar.).

__METHOD__: Nazwa metody klasy. (Dodano w PHP 5.0.0) Nazwa metody jest zwracana tak, jak została zadeklarowana (rozróżniana jest wielkość liter).

__NAMESPACE__: Nazwa bieżącej przestrzeni nazw (z rozróżnianiem wielkości liter). Stała ta jest zdefiniowana w czasie kompilacji (Dodano w PHP 5.3.0).

Źródło

n.1
źródło
150

Wpisz Operatory

instanceof służy do ustalenia, czy zmienna PHP jest instancją obiektu określonej klasy.

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

Powyższy przykład wyświetli:

bool(true)
bool(false)

Powód: Powyższy przykład $ajest obiektem, mclasswięc używaj tylkomclass danych, których nie masclass

Przykład z dziedziczeniem

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

Powyższy przykład wyświetli:

bool(true)
bool(true)

Przykład z klonem

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

Powyższy przykład wyświetli:

bool(true)
bool(true)
Maulik patel
źródło
7
Powyższe działa również z „interfejsami”. Jest to przydatne do sprawdzania, czy dany interfejs jest dostępny.
Ryan Vincent
133

Przegląd operatorów w PHP :


Operatory logiczne:

  • $ a && $ b: PRAWDA, jeśli zarówno $ a, jak i b są PRAWDĄ.
  • $ a || $ b: PRAWDA, jeśli $ a lub $ b jest PRAWDA.
  • $ a xor $ b: PRAWDA, jeśli $ a lub $ b jest PRAWDA, ale nie oba jednocześnie.
  • ! $ a: PRAWDA, jeśli $ a nie jest PRAWDA.
  • $ a i $ b: PRAWDA, jeśli zarówno $ a, jak i b są PRAWDĄ.
  • $ a lub $ b: PRAWDA, jeśli albo $ a lub $ b jest PRAWDA.

Operatory porównania:

  • $ a == $ b: PRAWDA, jeśli $ a jest równa $ b po żonglowaniu typem.
  • $ a === $ b: PRAWDA, jeśli $ a jest równe $ b i są tego samego typu.
  • $ a! = $ b: PRAWDA, jeśli $ a nie jest równa $ b po żonglowaniu typem.
  • $ a <> $ b: PRAWDA, jeśli $ a nie jest równa $ b po żonglowaniu typem.
  • $ a! == $ b: PRAWDA, jeśli $ a nie jest równe $ b lub nie są tego samego typu.
  • $ a <$ b : PRAWDA, jeśli $ a jest ściśle mniejsze niż $ b.
  • $ a> $ b : PRAWDA, jeśli $ a jest ściśle większe niż $ b.
  • $ a <= $ b : PRAWDA, jeśli $ a jest mniejsze lub równe $ b.
  • $ a> = $ b : PRAWDA, jeśli $ a jest większe lub równe $ b.
  • $ a <=> $ b : Liczba całkowita mniejsza niż, równa lub większa od zera, gdy $ a jest odpowiednio mniejsze niż, równe lub większe niż $ b. Dostępne od PHP 7.
  • $ a? $ b: $ c : jeśli $ a powrót $ b inaczej zwróci $ c ( operator trójskładnikowy )
  • $ a ?? $ c : Taki sam jak $ a? $ a: $ c ( zerowy operator koalescencyjny - wymaga PHP> = 7)

Operatory arytmetyczne:

  • - $ a : Przeciwnie do $ a.
  • $ a + $ b : Suma $ a i $ b.
  • $ a - $ b : Różnica $ a i $ b.
  • $ a * $ b : Produkt $ a i $ b.
  • $ a / $ b : iloraz $ a i $ b.
  • $ a% $ b : Pozostała część a podzielona przez $ b.
  • $ a ** $ b : Wynik podniesienia $ a do potęgi $ (wprowadzony w PHP 5.6)

Operatory inkrementacji / dekrementacji:

  • ++ $ a : Zwiększa o jeden $ a następnie zwraca $ a.
  • $ a ++ : Zwraca $ a, a następnie zwiększa $ a o jeden.
  • - $ a : Zmniejsza o $ a jeden, a następnie zwraca $ a.
  • $ a-- : Zwraca $ a, a następnie zmniejsza $ a o jeden.

Operatory bitowe:

  • $ a i $ b : Ustawione są bity ustawione zarówno w $ a, jak i $ b.
  • $ a | $ b : Ustawione są bity ustawione w $ a lub $ b.
  • $ a ^ $ b : Bity ustawione w $ a lub $ b, ale nie oba są ustawione.
  • ~ $ a : Bity ustawione w $ a nie są ustawione i odwrotnie.
  • $ a << $ b : Przesuń bity $ a $ b kroków w lewo (każdy krok oznacza „pomnóż przez dwa”)
  • $ a >> $ b : Przesuń bity $ a $ b kroków w prawo (każdy krok oznacza „podziel przez dwa”)

Operatory strunowe:

  • $ a. $ b : Łączenie $ a i $ b.

Operatory macierzy:

  • $ a + $ b : Unia $ a i $ b.
  • $ a == $ b : PRAWDA, jeśli $ a i $ b mają te same pary klucz / wartość.
  • $ a === $ b : PRAWDA, jeśli $ a i $ b mają te same pary klucz / wartość w tej samej kolejności i tego samego typu.
  • $ a! = $ b : PRAWDA, jeśli $ a nie jest równe $ b.
  • $ a <> $ b : PRAWDA, jeśli $ a nie jest równe $ b.
  • $ a! == $ b : PRAWDA, jeśli $ a nie jest identyczne z $ b.

Operatorzy przydziału:

  • $ a = $ b : Wartość $ b jest przypisana do $ a
  • $ a + = $ b : Taki sam jak $ a = $ a + $ b
  • $ a - = $ b : Taki sam jak $ a = $ a - $ b
  • $ a * = $ b : Taki sam jak $ a = $ a * $ b
  • $ a / = $ b : Taki sam jak $ a = $ a / $ b
  • $ a% = $ b : Taki sam jak $ a = $ a% $ b
  • $ a ** = $ b : Taki sam jak $ a = $ a ** $ b
  • $ a. = $ b : Taki sam jak $ a = $ a. $ b
  • $ a & = $ b : Taki sam jak $ a = $ a & $ b
  • $ a | = $ b : Taki sam jak $ a = $ a | $ b
  • $ a ^ = $ b : Taki sam jak $ a = $ a ^ $ b
  • $ a << = $ b : Taki sam jak $ a = $ a << $ b
  • $ a >> = $ b : Taki sam jak $ a = $ a >> $ b

Uwaga

andoperator i oroperator mają niższy priorytet niż operator przypisania =.

Oznacza to, że $a = true and false;jest to równoważne z ($a = true) and false.

W większości przypadków prawdopodobnie będziesz chciał używać &&i ||, które zachowują się w sposób znany z języków takich jak C, Java lub JavaScript.

John Slegers
źródło
1
Wystąpił błąd $a ?? $c, mówi, że jest taki sam jak $a ? $a : $c, ale operator trójskładnikowy sprawdza, czy wartość jest prawdziwa, z drugiej strony, zerowanie koalescencyjne sprawdza wartości zerowe, więc jeśli $ a wynosi 0, otrzymasz 0 (ponieważ 0 to nie zero), na przykład jeśli masz: $a=0; $c=5;następnie $a?$a:$czwraca 5, a $a??$czwraca 0.
stramin
104

Operator statku kosmicznego<=> (dodano w PHP 7)

Przykłady <=>operatora statku kosmicznego (PHP 7, Źródło: PHP Manual):

Liczby całkowite, zmiennoprzecinkowe, ciągi, tablice i obiekty do trójstronnego porównywania zmiennych.

// 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
źródło
1
Sprawdź php.net/manual/en/language.operators.comparison.php w celach informacyjnych
rajangupta
74

{} Nawiasy klamrowe

I kilka słów o ostatnim poście

$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
mnv
źródło
4
Notacja {''} dla nazw nieruchomości. echo $ movies-> movie -> {'great-lines'} -> line; może być wykorzystany do uzyskania dostępu do danych w SimpleXMLElement. Może może być również używany w innych przypadkach. php.net/manual/en/simplexml.examples-basic.php
Andrei
68

Zerowy operator koalescencyjny (??)

Ten operator został dodany w PHP 7.0 dla typowego przypadku konieczności używania operatora trójskładnikowego w połączeniu z isset(). Zwraca swój pierwszy operand, jeśli istnieje i nie istnieje NULL; w przeciwnym razie zwraca drugi operand.

<?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 ROY
źródło
64

Ciągi PHP: Ciągi PHP można określić na cztery sposoby, a nie tylko na dwa sposoby:

1) Ciągi pojedynczych cytatów:

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

2) Ciągi podwójnych cytatów:

$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 (od PHP 5.3.0):

$string = <<<'END_OF_STRING'
    This is my string 
END_OF_STRING; // print This is my string
devpro
źródło
@ Rizier123: Co oznacza „Heredocs nie mogą być używane do inicjowania właściwości klas. Od PHP 5.3 to ograniczenie jest ważne tylko dla heredoców zawierających zmienne.”?
PHPFan
48

PYTANIE:

Co =>znaczy


ODPOWIEDŹ:

=>To symbol, którego ludzie postanowiliśmy użyć do rozdzielenia "Key" => "Value"par w tablicach asocjacyjnych.

OPRACOWYWANIE:

Aby to zrozumieć, musimy wiedzieć, jakie są tablice asocjacyjne. Pierwszą rzeczą, która pojawia się, gdy konwencjonalny programista myśli o tablicy ( w PHP ), byłoby coś podobnego do:

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

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

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

Gdybyśmy chcieli wywołać tablicę w późniejszej części kodu, moglibyśmy zrobić:

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

Na razie w porządku. Jednak, jako ludzie, możemy mieć trudności z zapamiętaniem, że indeks [0]tablicy to wartość z roku 2016, indeks [1]tablicy to pozdrowienia , a indeks [2]tablicy to prosta liczba całkowita . Alternatywą, którą wówczas mielibyśmy, jest użycie tak zwanego Tablicy asocjacyjnej . Tablica asocjacyjna ma kilka różnic w porównaniu z tablicą sekwencyjną ( tak jak w poprzednich przypadkach, ponieważ zwiększają indeks stosowany w określonej sekwencji, zwiększając o 1 dla każdej kolejnej wartości ).

Różnice ( między tablicą sekwencyjną i asocjacyjną ):

  • Podczas deklaracji tablicy asocjacyjnej nie tylko zawierasz to, valueco chcesz umieścić w tablicy, ale także umieszczasz wartość indeksu (zwaną key), której chcesz użyć podczas wywoływania tablicy w późniejszych częściach kod. Poniższa składnia jest używana podczas To oświadczenie: "key" => "value".

  • Podczas korzystania z tablicy asocjacyjnej keywartość zostanie następnie umieszczona w indeksie tablicy w celu pobrania żądanego value.

Na przykład:

    $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;

A teraz, aby otrzymać takie same dane wyjściowe, jak poprzednio, keywartość będzie używana w indeksie tablic:

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

PUNKT KOŃCOWY:

Tak więc z powyższego przykładu dość łatwo zauważyć, że =>symbol jest używany do wyrażenia relacji tablicy asocjacyjnej między każdą z keyi valueparami w tablicy PODCZAS inicjacji wartości w tablicy.

Webeng
źródło
36

Pytanie :

Co w PHP oznacza „&”?

Operator PHP i

Ułatwia życie, gdy się do niego przyzwyczaimy (dokładnie sprawdź przykład poniżej)

i zwykle sprawdza bity ustawione zarówno w $ a, jak i $ b.

czy zauważyłeś nawet, jak działają te połączenia?

   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);

Tak więc za tym wszystkim stoi gra bitowego operatora i bitów.

Jednym z użytecznych przypadków są proste konfiguracje, takie jak podaj poniżej, więc w jednym polu liczby całkowitej można zapisać tysiące kombinacji.

Większość ludzi już czytała dokumenty, ale nie polegała na prawdziwym przypadku użycia tych bitowych operatorów.

Przykład, że pokochasz

<?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
dev.mraj
źródło
30

== służy do sprawdzania równości bez uwzględniania zmiennych typu danych

===służy do sprawdzania równości zarówno wartości zmiennej, jak i typu danych

Przykład

$a = 5

  1. if ($a == 5) - oceni prawdę

  2. if ($a == '5') - oceni prawdę, ponieważ porównując obie wartości PHP wewnętrznie przekształca tę wartość ciągu na liczbę całkowitą, a następnie porównuje obie wartości

  3. if ($a === 5) - oceni prawdę

  4. if ($a === '5') - oceni na false, ponieważ wartość wynosi 5, ale ta wartość 5 nie jest liczbą całkowitą.

Parth Nayak
źródło
27

Operator zerowej koalescencji „??” (Dodano w PHP 7)

Nie jest to najbardziej chwytliwa nazwa dla operatora, ale PHP 7 przynosi raczej poręczną zerową koalescencję, więc pomyślałem, że podzielę się przykładem.

W PHP 5 mamy już operatora trójskładnikowego, który testuje wartość, a następnie zwraca drugi element, jeśli zwraca true, a trzeci, jeśli nie:

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

Istnieje również skrót, który pozwala pominąć drugi element, jeśli jest taki sam jak pierwszy: echo $ count?: 10; // wyprowadza również 10

W PHP 7 otrzymujemy dodatkowo ?? operator, który zamiast wskazywać na ekstremalne zamieszanie, w jaki sposób zwykle używałbym razem dwóch znaków zapytania, zamiast tego pozwala nam połączyć łańcuch wartości. Czytając od lewej do prawej, pierwszą wartością, która istnieje i nie jest pusta, jest wartość, która zostanie zwrócona.

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

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

Ta konstrukcja jest przydatna do nadawania priorytetu jednej lub większej liczbie wartości, być może pochodzących z danych wprowadzonych przez użytkownika lub istniejącej konfiguracji, i bezpiecznie powraca do wartości domyślnych, jeśli takiej konfiguracji brakuje. To trochę mała funkcja, ale wiem, że będę z niej korzystać, gdy tylko moje aplikacje zaktualizują się do PHP 7.

Jogin Ghorecha
źródło
12

Deklaracja zerowego typu zwrotu

PHP 7 dodaje obsługę deklaracji typu zwrotu. Podobnie jak deklaracje typu argumentu, deklaracje typu zwracanego określają typ wartości, która zostanie zwrócona z funkcji. Te same typy są dostępne dla deklaracji typu zwracanego, jak dla deklaracji typu argumentu.

Ścisłe pisanie ma również wpływ na deklaracje typu zwrotu. W domyślnym trybie słabym zwrócone wartości zostaną wymuszone na prawidłowy typ, jeśli nie są już tego typu. W trybie silnym zwracana wartość musi być poprawnego typu, w przeciwnym razie zostanie wygenerowany błąd typu Błąd.

Począwszy od PHP 7.1.0, zwracane wartości można oznaczyć jako zerowalne, poprzedzając nazwę typu znakiem zapytania (?). Oznacza to, że funkcja zwraca albo określony typ, albo NULL.

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

Źródło

John Conde
źródło
7

Three DOTS jako Splat Operator (...) (od PHP 5.6)

PHP ma operator „...” (trzy kropki), który jest nazywany Splat Operator. Służy do przekazywania dowolnej liczby parametrów w funkcji, a ten typ funkcji nazywa się funkcjami Variadic. Weźmy przykłady użycia „...” (trzy kropki).

Przykład 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
?>

Każdy argument funkcji calcNumbers () przechodzi przez $ params jako tablicę, gdy używa się „…”.

Istnieje wiele różnych sposobów korzystania z operatora „…”. Poniżej kilka przykładów:

Przykład 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
?>

Przykład 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
?>

Przykład 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

?>
Jogin Ghorecha
źródło