Довідка - Що означає цей символ у PHP?


4477

Що це?

Це набір питань, які раз у раз виникають щодо синтаксису в PHP. Це також спільнота Wiki, тому всіх запрошують взяти участь у підтримці цього списку.

Чому це?

Раніше важко було знайти питання про операторів та інші синтаксичні маркери
. ¹ Основна ідея - мати посилання на існуючі запитання про переповнення стека, тому нам простіше посилатися на них, а не копіювати вміст із посібника PHP.

Примітка: З січня 2013 року Stack Overflow підтримує спеціальні символи . Просто обведіть пошукові терміни цитатами, наприклад[php] "==" vs "==="

Що мені тут робити?

Якщо вас хтось тут вказав, тому що ви задали таке питання, будь ласка, знайдіть конкретний синтаксис нижче. Пов’язані сторінки до посібника PHP разом із пов'язаними питаннями, ймовірно, дадуть відповідь на ваше запитання. Якщо так, то вам рекомендується прийняти відповідь. Цей список не є заміною допомоги, яку надають інші.

Список

Якщо ваш маркер не вказаний нижче, ви можете його знайти у списку маркерів парсера .


& Побітові оператори або посилання


=& Список літератури


&= Побітні оператори


&& Логічні оператори


% Арифметичні оператори


!! Логічні оператори


@ Оператори управління помилками


?: Термінальний оператор


?? Null Coalesce Operator (з PHP 7)


?string ?int ?array ?bool ?float Nullable декларація поверненням (з PHP 7.1)


: Альтернативний синтаксис для структур управління , Ternary Operator


:: Оператор роздільної здатності


\ Простори імен


-> Класи та об'єкти


=> Масиви


^ Побітні оператори


>> Побітні оператори


<< Побітні оператори


<<< Гередок або Нодок


= Оператори призначення


== Оператори порівняння


=== Оператори порівняння


!== Оператори порівняння


!= Оператори порівняння


<> Оператори порівняння


<=> Оператори порівняння (з PHP 7.0)


| Побітні оператори


|| Логічні оператори


~ Побітні оператори


+ Арифметичні оператори , оператори масиву


+=та -= операторів призначення


++та -- операторів збільшення / зменшення


.= Оператори призначення


. Строкові оператори


, Аргументи функції

, Змінні декларації


$$ Змінні змінні


` Оператор виконання


<?= Короткі відкриті теги


[] Масиви (короткий синтаксис з PHP 5.4)


<? Відкриття та закриття тегів


... Розпакування аргументу (з PHP 5.6)


** Експоненція (починаючи з PHP 5.6)


# Однорядковий коментар у стилі оболонки


:? Зменшуються типи повернення


?-> Дзвінки оператора NullSafe



36
Я знаю, що це не виключно PHP, але що робити з включенням посилання на phpdoc.org для синтаксису коментарів phpDocumentor, який зазвичай використовується, і його також неможливо шукати /**?
Майк

8
Чи можу я запропонувати квадратну та фігурну дужку?
ajreal

124
Я теж дуже часто зіткнувся з цією проблемою (не в змозі шукати спеціальних символів), тому я створив SymbolHound , пошукову систему, яка не ігнорує спеціальних символів. Я також розмістив його на StackApps .
dncrane

1
Ну, із заголовка Чому це? , Я думаю, це тому, що "Основна ідея - мати посилання на існуючі питання щодо переповнення стека, тому нам простіше посилатися на них".
Герберт

3
Було поставлено питання сьогодні (Nov.20 / 15) stackoverflow.com/questions/33833259/what-is-rscat-in-php запитувана «Що таке $ rsCat в PHP» (якщо це питання все ще бути зроблені видимими і не будуть видалені) . Як не дивно, тут немає посилання на $змінну, а $$лише на змінні. Я вважаю, що слід десь внести зміни.
Funk Forty Niner

Відповіді:


1171

Оператори збільшення / зменшення

++ приріст оператора

-- оператор декременту

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.

Вони можуть проходити до чи після змінної.

Якщо поставити перед змінною, операція збільшення / зменшення виконується спочатку змінною, а результат повертається. Якщо ставиться після змінної, змінна спочатку повертається, то виконується операція збільшення / зменшення.

Наприклад:

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

Живий приклад

У наведеному вище випадку ++$iвикористовується, оскільки це швидше. $i++матиме однакові результати.

Попередній приріст трохи швидший, оскільки він дійсно збільшує змінну і після цього 'повертає' результат. Після наростання створюється спеціальна змінна, копіює там значення першої змінної і лише після використання першої змінної замінює її значення другою.

Однак ви повинні використовувати $apples--, оскільки спочатку ви хочете відобразити поточну кількість яблук, а потім ви хочете відняти одне.

Ви також можете збільшувати літери в PHP:

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

Як тільки zбуде досягнуто aaнаступне, і так далі.

Зауважте, що змінні символів можна збільшувати, але не зменшувати, і навіть так підтримуються лише прості символи ASCII (az та AZ).


Переповнення повідомлень про стек:


9
+1 за зауваження, що декреметри не працюють над символами, а лише над цифрами
Марк Бейкер

163
Ради кожного, будь ласка, видаліть жирну інформацію про те, що попереднє збільшення буде нескінченно швидшим. Це абсолютно найгірший приклад передчасної оптимізації, і така інформація не повинна бути в головах людей, якщо вони тільки починають вивчати PHP.
Lotus Notes

14
@Lotus - я вважаю це цікавим фактом. Якщо ви новачок у PHP, або C ++ тощо, здається, досить дурним, що ++ i та i ++ досить різні, щоб працювати з різною швидкістю. Мені це здалося захоплюючим.
Peter Ajtai

12
@Peter Ajtai Так, це цікаво, але з того, як ви структурували свою публікацію, вам здається, що це один з найважливіших фактів PHP, що абсолютно важливо для використання мови.
Lotus Notes

4
Не впевнений, чи це я лише чи ні, але приклад яблука здається трохи оманливим. 'У мене є 10 яблук. Я просто з’їв одне ', змушує мене повірити, що у вас було 11 яблук, але зараз у вас є 10, тому що ви просто з’їли одне, а не їли одне після того, як сказали, що у вас є 10, таким чином, у вас є 9 - що означає код.
さ り げ な い 告白

440

Побітовий оператор

Що трохи? Біт - це представлення 1 або 0. В основному OFF (0) і ON (1)

Що таке байт? Байт складається з 8 біт, і найвище значення байта - 255, що означає, що встановлено кожен біт. Ми розглянемо, чому максимальне значення байта - 255.

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

Це представлення 1 байт

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255 (1 байт)

Кілька прикладів для кращого розуміння

Оператор "І": &

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

Це дало б результат 8. Чому? Ну давайте подивимось, використовуючи наш приклад таблиці.

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

Таким чином, ви можете бачити з таблиці єдиний біт, який вони діляться разом, це 8 біт.

Другий приклад

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

Два спільних біта - 32 і 4, які при додаванні разом повертають 36.

Оператор "Або": |

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

Це виведе число 11. Чому?

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

Ви помітите, що в 8, 2 та 1 стовпцях у нас встановлено 3 біти. Додайте їх: 8 + 2 + 1 = 11.


6
Що робити, якщо $ a приймає значення, що перевищує 255?
Айкан Яшит

@ AycanYaşıt Більшість операційної системи використовує 32-бітну та 64-бітну систему, це означає, що обмеження набагато перевищує 255 (8 біт).
AlbertSamuel

@ AycanYaşıt Власне, представлення тут з однією довжиною байтів навіть не є правильним, оскільки навіть найменше ціле число все ще має 64 біт (8 байт) в пам'яті на сучасній 64-бітній платформі.
Каї

Чому and &це 0 0 0 0 1 0 0 0 і or |є 0 0 0 0 1 0 1 1?
Вир

285

<=> Оператор космічного корабля

Додано в PHP 7

Оператор космічного корабля <=> є останнім оператором порівняння доданий в PHP 7. Це неассоціатівное бінарний оператор з таким же пріоритетом , як оператори рівності ( ==, !=, ===, !==). Цей оператор дозволяє простіше тристоронне порівняння між лівим та правим операндами.

Оператор призводить до цілого вираження:

  • 0 коли обидва операнди рівні
  • Менше, ніж 0коли лівий операнд менший, ніж правий операнд
  • Більше, ніж 0коли лівий операнд більший, ніж правий операнд

напр

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

Хорошим практичним застосуванням цього оператора буде порівняння зворотних викликів типу, які, як очікується, повернуть нульове, від'ємне або додатне ціле число на основі тристороннього порівняння двох значень. usortОднією з таких прикладів є передана функція порівняння .

Перед PHP 7 ви б написали ...

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

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

З PHP 7 ви можете написати ...

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

usort($arr, function ($a, $b) {
    return $a <=> $b;
});

21
Не впевнений, $a <=> $bчим відрізняється$a - $b
rev

38
@AcidShout $a - $bпрацює для чисел, але не для рядків, об'єктів чи масивів.
mcrumley

44
@mcrumley Ні, це гірше. Взагалі $a - $bнавіть не працює для чисел; він працює лише для цілих чисел . Він не працює для не цілих чисел, тому що він usortперераховує зворотні значення функції компаратора до int, тобто 0,5 отримує значення 0, а це означає, що два числа з різницею менше 1, наприклад 4 і 4.6, можуть (залежно від на якому один передається як перший аргумент вашої функції порівняння) неправильно порівнюйте як рівний.
Марк Амері

5
@MarkAmery посібник з міграції не є документально підтвердженою поведінкою оператора. Для цього ви хочете подивитися в розділі посібника з мовними операторами для цього php.net/language.operators.compparation, фактичне поведінка, що стоїть за цим, покладається на різні функції порівняння API, наприклад, коли ви робите strcmp для рядків, де ви не можете гарантувати фактичне повернене значення у кожному окремому випадку. Звичайно, це майже завжди 1, 0 або -1, але для випадків, коли ви не можете цього гарантувати, як, наприклад, при обгортанні strcmp libc, ви пропонуєте таке ж визначене поведінку, як і базовий зразок, щоб бути безпечним
Шериф

9
@MarkAmery Сенс у тому, щоб не дозволяти людям покладатися на невизначену поведінку. У тому випадку, коли хтось отримує значення, яке не є рівним 1, 0 або -1, ви отримуєте, хто подає звіт про помилку, думаючи, що в мові щось не так. Ось чому ми документально підтверджуємо, що все, що ми можемо гарантувати, - це те, що значення буде менше , більше або дорівнює 0, а не обов'язково 1, 0 і -1.
Шериф


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"

239

Магічні константи : Хоча це не просто символи, а важлива частина цієї сімейства лексем. Існує вісім магічних констант, які змінюються залежно від місця їх використання.

__LINE__: Поточний номер рядка файлу.

__FILE__: Повний шлях та ім'я файлу. Якщо використовується всередині включати, повертається ім'я включеного файлу. Оскільки PHP 4.0.2, __FILE__завжди містить абсолютний шлях із вирішеними символьними посиланнями, тоді як у старих версіях він за певних обставин містив відносний шлях.

__DIR__: Каталог файлу. Якщо використовується всередині include, каталог повернутого файлу повертається. Це еквівалентно dirname(__FILE__). Ім'я цього каталогу не має косою косою рисою, якщо це не кореневий каталог. (Додано в PHP 5.3.0.)

__FUNCTION__: Назва функції. (Додано в PHP 4.3.0) Станом на PHP 5 ця константа повертає ім'я функції так, як було оголошено (залежно від регістру). У PHP 4 його значення завжди є нижчим.

__CLASS__: Назва класу. (Додано в PHP 4.3.0) Станом на PHP 5 ця константа повертає ім'я класу так, як було оголошено (залежно від регістру). У PHP 4 його значення завжди є нижчим. Ім'я класу включає простір імен, про яке було оголошено (наприклад Foo\Bar). Зауважте, що на PHP 5.4 __CLASS__працює також у ознаках. При використанні методу ознаки __CLASS__- це назва класу, в якому використовується ознака.

__TRAIT__: Назва ознаки. (Додано в PHP 5.4.0) Станом на PHP 5.4 ця константа повертає ознаку, як було оголошено (залежно від регістру). Ім'я ознаки включає в себе простір імен, про яке було задекларовано (наприклад, Foo\Bar).

__METHOD__: Назва методу класу. (Додано в PHP 5.0.0) Ім'я методу повертається так, як було оголошено (залежно від регістру).

__NAMESPACE__: Ім'я поточного простору імен (залежно від регістру). Ця константа визначається в час компіляції (Додано в PHP 5.3.0).

Джерело


150

Тип операторів

instanceof використовується для визначення того, чи є змінною PHP інстанційним об'єктом певного класу.

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

Наведений вище приклад виведе:

bool(true)
bool(false)

Причина: Вищеприклад $aє об'єктом, mclassтому використовуйте лише mclassдані, не екземпляри зsclass

Приклад з успадкуванням

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

Наведений вище приклад виведе:

bool(true)
bool(true)

Приклад з клоном

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

Наведений вище приклад виведе:

bool(true)
bool(true)

7
Вищезгадане також працює з "інтерфейсами". Це корисно для перевірки наявності певного інтерфейсу.
Райан Вінсент

133

Огляд операторів PHP :


Логічні оператори:

  • $ a && $ b: ІСТИНА, якщо і $ a, і $ b - ІСТИНА.
  • $ a || $ b: TRUE, якщо $ a або $ b є TRUE.
  • $ a xor $ b: ІСТИНА, якщо або $ a, або $ b - ІСТИНА, але не обидва.
  • ! $ a: ІСТИНА, якщо $ a - не ІСТИНА.
  • $ a і $ b: ІСТИНА, якщо і $ a, і $ b - ІСТИНА.
  • $ a або $ b: TRUE, якщо $ a або $ b є TRUE.

Оператори порівняння:

  • $ a == $ b: ІСТИНА, якщо $ a дорівнює $ b після типу жонглювання.
  • $ a === $ b: ІСТИНА, якщо $ a дорівнює $ b, і вони одного типу.
  • $ a! = $ b: ІСТИНА, якщо $ a не дорівнює $ b після типу жонглювання.
  • $ a <> $ b: ІСТИНА, якщо $ a не дорівнює $ b після типу жонглювання.
  • $ a! == $ b: ІСТИНА, якщо $ a не дорівнює $ b, або вони не одного типу.
  • $ a <$ b : ІСТИНА, якщо $ a суворо менше $ b.
  • $ a> $ b : ІСТИНА, якщо $ a строго більше, ніж $ b.
  • $ a <= $ b : ІСТИНА, якщо $ a менше або дорівнює $ b.
  • $ a> = $ b : ІСТИНА, якщо $ a більше або дорівнює $ b.
  • $ a <=> $ b : Ціле число менше, рівне або більше нуля, коли $ a відповідно менше, дорівнює або більше $ b. Доступно як PHP 7.
  • $ a? $ b: $ c : якщо $ a повернення $ b ще поверне $ c ( потрійний оператор )
  • $ a ?? $ c : Те саме, що $ a? $ a: $ c ( null coalescing operator - потрібно PHP> = 7)

Арифметичні оператори:

  • - $ a : Навпроти $ a.
  • $ a + $ b : сума $ a і $ b.
  • $ a - $ b : різниця $ a і $ b.
  • $ a * $ b : Продукт $ a і $ b.
  • $ a / $ b : Коефіцієнт $ a та $ b.
  • $ a% $ b : Залишок $ ділиться на $ b.
  • $ a ** $ b : Результат підвищення $ a до $ b'th потужності (введено в PHP 5.6)

Оператори збільшення / зменшення:

  • ++ $ a : збільшує $ a на одну, потім повертає $ a.
  • $ a ++ : Повертає $ a, а потім збільшує $ a на одну.
  • - $ a : зменшення $ a на одну, потім повертає $ a.
  • $ a-- : Повертає $ a, а потім зменшує $ a на одну.

Побітні оператори:

  • $ a & $ b : встановлюються біти, встановлені як в $ a, так і в $ b.
  • $ a | $ b : встановлюються біти, встановлені в $ a або $ b.
  • $ a ^ $ b : Біти, встановлені в $ a або $ b, але не обидва, встановлюються.
  • ~ $ a : Біти, встановлені в $ a, не встановлюються, і навпаки.
  • $ a << $ b : змістіть біти кроків $ a $ b вліво (кожен крок означає "помножити на два")
  • $ a >> $ b : змістіть біти кроків $ a $ b вправо (кожен крок означає "розділити на два")

Строкові оператори:

  • $ a. $ b : об'єднання $ a і $ b.

Оператори масиву:

  • $ a + $ b : Союз $ a та $ b.
  • $ a == $ b : ІСТИНА, якщо $ a і $ b мають однакові пари ключ / значення.
  • $ a === $ b : ІСТИНА, якщо $ a та $ b мають однакові пари ключів / значень у тому ж порядку та однакових типів.
  • $ a! = $ b : ІСТИНА, якщо $ a не дорівнює $ b.
  • $ a <> $ b : ІСТИНА, якщо $ a не дорівнює $ b.
  • $ a! == $ b : ІСТИНА, якщо $ a не тотожне $ b.

Оператори призначення:

  • $ a = $ b : Значення $ b присвоюється $ a
  • $ a + = $ b : Те саме, що $ a = $ a + $ b
  • $ a - = $ b : Те саме, що $ a = $ a - $ b
  • $ a * = $ b : Те саме, що $ a = $ a * $ b
  • $ a / = $ b : Те саме, що $ a = $ a / $ b
  • $ a% = $ b : те саме, що $ a = $ a% $ b
  • $ a ** = $ b : Те саме, що $ a = $ a ** $ b
  • $ a. = $ b : Те саме, що $ a = $ a. $ б
  • $ a & = $ b : Те саме, що $ a = $ a & $ b
  • $ a | = $ b : Те саме, що $ a = $ a | $ б
  • $ a ^ = $ b : Те саме, що $ a = $ a ^ $ b
  • $ a << = $ b : Те саме, що $ a = $ a << $ b
  • $ a >> = $ b : Те саме, що $ a = $ a >> $ b

Примітка

andОператор і orоператор мають нижчий пріоритет, ніж оператор присвоєння =.

Це означає, що $a = true and false;еквівалентно ($a = true) and false.

У більшості випадків ви, мабуть, захочете використовувати &&та ||, які ведуть себе таким чином, як відомий з таких мов, як C, Java або JavaScript.


1
У ньому є помилка $a ?? $c, вона каже, що це те саме $a ? $a : $c, але потрійний оператор перевіряє, чи є значення правдивим, з іншого боку, нульове з’єднання перевіряє нульові значення, тому, якщо $ a дорівнює 0, ви отримаєте 0 (тому що 0 є не нульовий), наприклад, якщо у вас є: $a=0; $c=5;тоді $a?$a:$cповертається 5, а $a??$cповертається 0.
страйм

104

Оператор космічного корабля<=> (додано в PHP 7)

Приклади для <=>оператора космічного корабля (PHP 7, Джерело: Посібник PHP):

Цілі числа, поплавці, рядки, масиви та об'єкти для тристороннього порівняння змінних.

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

1
Перевірте php.net/manual/en/language.operators.comppare.php для довідки
rajangupta

74

{} Фігурні дужки

І кілька слів про останній пост

$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

4
Позначення імен властивостей {''}. echo $ movies-> movie -> {'great-lines'} -> рядок; може використовуватися для доступу до даних у SimpleXMLElement. Можливо, його можна використовувати і в інших випадках. php.net/manual/en/simplexml.examples-basic.php
Андрій

68

Нульовий оператор злиття (??)

Цей оператор додано в PHP 7.0 для звичайного випадку необхідності використання потрійного оператора спільно з isset(). Він повертає свій перший операнд, якщо він існує, а його немає NULL; інакше він повертає свій другий операнд.

<?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';
?>

64

Рядки PHP: Рядки PHP можна вказати чотирма способами, а не двома способами:

1) Рядки єдиної котировки:

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

2) Рядки подвійних цитат:

$str = 'string';

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

3) Гередок:

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

4) Nowdoc (з PHP 5.3.0):

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

@ Rizier123: Що означає "Heredocs не можна використовувати для ініціалізації властивостей класу. Оскільки в PHP 5.3 це обмеження дійсне лише для гередок, що містять змінні."
PHPFan

48

ПИТАННЯ:

Що =>означає?


ВІДПОВІДЬ:

=>Це символ, який ми, люди, вирішили використовувати для розділення "Key" => "Value"пар в асоціативних масивах.

РОЗРОБКА:

Щоб зрозуміти це, ми повинні знати, що таке асоціативні масиви. Перше, що з'являється, коли звичайний програміст думає про масив ( в PHP ), буде щось подібне до:

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

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

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

Де як, якби ми хотіли викликати масив у якійсь пізнішій частині коду, ми могли б зробити:

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

Все йде нормально. Однак, як люди, ми могли б знайти це важко згадати , що індекс [0]масиву є значенням року 2016, індекс [1]масиву є вітанням , а індекс [2]масиву є простим цілим числом . Альтернатива, яку ми мали б тоді, - це використовувати те, що називається асоціативним масивом . Асоціативний масив має кілька відмінностей від послідовного масиву (таким є і попередні випадки, оскільки вони збільшували індекс, використаний у заздалегідь визначеній послідовності, збільшуючи на 1 для кожного наступного значення ).

Відмінності ( між послідовним та асоціативним масивом ):

  • Під час декларації асоціативного масиву ви не тільки включаєте те, valueщо ви хочете поставити в масив, але ви також додаєте значення індексу (званого key), яке ви хочете використовувати при виклику масиву в пізніших частинах код. Наступний синтаксис використовується в процесі її декларації: "key" => "value".

  • При використанні асоціативного масиву keyзначення буде розміщене всередині індексу масиву, щоб отримати бажане value.

Наприклад:

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

І тепер, щоб отримати той же вихід, що і раніше, keyзначення буде використано в індексі масивів:

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

ЗАКЛЮЧНИЙ ОК:

Таким чином , з наведеного вище прикладу, це досить легко бачити , що =>символ використовується для вираження ставлення асоціативного масиву між кожним з keyі valueпара в масиві ВО ініціації значень в масиві.


36

Питання :

Що означає "&" тут у PHP?

Оператор PHP "&"

Полегшує життя після того, як ми звикнемо до нього (перевірте приклад уважно нижче)

& зазвичай перевіряються біти, встановлені як в $ a, так і в $ b.

Ви навіть помітили, як працюють ці дзвінки?

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

Отже, позаду всього вище - гра в бітовий оператор і біти.

Один корисний випадок цього - це прості конфігурації, такі як наведено нижче, тому одне ціле поле може зберігати тисячі комбо для вас.

Більшість людей вже читали документи, але не підтвердили реальний випадок використання цих розрядних операторів.

Приклад, що ти будеш любити

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

30

== використовується для перевірки рівності, не враховуючи змінний тип даних

===використовується для перевірки рівності як змінної величини, так і типу даних

Приклад

$a = 5

  1. if ($a == 5) - оцінюємо до правдивого

  2. if ($a == '5') - оцінюватиметься як істинне, оскільки, порівнюючи це обидва значення PHP, внутрішньо перетворять це рядкове значення у ціле число, а потім порівнюють обидва значення

  3. if ($a === 5) - оцінюємо до правдивого

  4. if ($a === '5') - оцінюватиметься як false, оскільки значення 5, але це значення 5 не є цілим числом.


27

Оператор Null Coalesce "??" (Додано в PHP 7)

Не найзахоплююче ім’я оператора, але PHP 7 приносить досить зручне нульове з'єднання, тому я подумав, що поділюсь прикладом.

У PHP 5 у нас вже є потрійний оператор, який тестує значення, а потім повертає другий елемент, якщо це повертає істину, а третій, якщо він не:

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

Існує також скорочення для того, що дозволяє пропустити другий елемент, якщо він такий же, як перший: echo $ count?: 10; // також виводить 10

У PHP 7 ми додатково отримуємо ?? оператор, який замість того, щоб вказувати на сильну плутанину - це те, як я б зазвичай використовував два знаки запитання разом, а не дозволяє ланцюжком послідовних значень. Читаючи зліва направо, перше значення, яке існує і не є нульовим, - це значення, яке буде повернуто.

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

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

Ця конструкція корисна для надання пріоритету одному або більше значень, що надходять, можливо, від введення користувача або існуючої конфігурації, і безпечно повертається до заданого за замовчуванням, якщо ця конфігурація відсутня. Це якась невелика функція, але я знаю, що я буду користуватися, як тільки мої програми перейдуть до PHP 7.


12

Декларування типу зворотного звороту

PHP 7 додає підтримку декларацій типу повернення. Аналогічно деклараціям типу аргументів, декларації типу повернення задають тип значення, яке буде повернуто з функції. Для оголошень типу повернення доступні ті самі типи, що і для декларацій типу аргументів.

Суворе введення тексту також впливає на декларації про тип повернення. У слабкому режимі за замовчуванням повернені значення будуть приведені до правильного типу, якщо вони ще не є цього типу. У сильному режимі повернене значення має бути правильного типу, інакше буде викинуто TypeError.

Станом на PHP 7.1.0, значення, що повертаються, можуть бути позначені як нульові, встановлюючи назву типу знаком питання (?) Це означає, що функція повертає або вказаний тип, або NULL.

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

Джерело


7

Три DOTS як оператор Splat (...) (з PHP 5.6)

У PHP є оператор "..." (Три крапки), який позначається оператором Splat. Він використовується для передачі довільної кількості параметрів у функції, і цей тип функції називається Variadic Functions. Візьмемо приклади для використання "..." (Три крапки).

Приклад 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
?>

Кожен аргумент функції izračunaNumbers () проходить через $ params як масив при використанні "...".

Існує багато різних способів використання оператора "...". Нижче наведено кілька прикладів:

Приклад 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
?>

Приклад 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
?>

Приклад 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

?>

0

? -> NullSafe Operator

На даний момент це просто пропозиція, ви можете їх знайти тут . Це NullSafe Operator, він повертається nullу випадку, якщо ви спробуєте викликати функції або отримати значення з null... Приклад

$objDrive = null;
$drive = $objDrive?->func?->getDriver()?->value; //return null
$drive = $objDrive->func->getDriver()->value; // Error: Trying to get property 'func' of non-object

Додавання цього виглядає досить передчасно, ніхто не побачить цього оператора в жодному живому коді, і він може навіть не бути доданий. Було б краще зачекати, поки деталі не будуть доопрацьовані та задокументовані.
IMSoP

Ми вже отримуємо питання з цього приводу. : / Якщо пропозиція не відповідає, ми можемо вирішити, чи варто цього дотримуватися.
Джон Конде

@JohnConde бачите? це те, що я говорив ...
Berto99

@JohnConde Мені б сподобалося закрити їх як поза тему, оскільки вони запитують про уявну мову програмування; або, можливо, "це питання належить до іншої частини часової шкали, будь ласка, перевірте налаштування на своїй машині часу";)
IMSoP

хаха Думка перехрестила мені розум. Я запитав себе, чи може це принести користь майбутнім відвідувачам і, на сьогодні, відповідь - «так». Але це може змінитися ...
Джон Конде

0

NullSafe Operator "? ->" (можливо) з php8

На даний момент це просто пропозиція, ви можете знайти її ввести опис посилання тут . ?->це NullSafe Operator, він повертається nullу випадку, якщо ви спробуєте викликати функції або отримати значення від null...

Приклади:

<?php
$obj = null;
$obj = $obj?->attr; //return null
$obj = ?->funct(); // return null
$obj = $objDrive->attr; // Error: Trying to get property 'attr' of non-object
?>

Додавання цього виглядає досить передчасно, ніхто не побачить цього оператора в жодному живому коді, і він може навіть не бути доданий. Було б краще зачекати, поки деталі не будуть доопрацьовані та задокументовані.
IMSoP

@IMSoP я з вами, проте я був запрошений зробити це тут stackoverflow.com/questions/62178354 / ... ...
Berto99

Схоже, зараз ми маємо дві відповіді з цього приводу. Особисто я просто проголосував би за те, щоб закрити інше питання, а не намагатися відповісти, тому що зараз такого оператора немає.
IMSoP

@IMSoP У StackOverflow тут багато питань щодо пропозиції C ++, і вони не закриті: незважаючи на це, я з вами про те, що наразі не публікую тут цього оператора
Berto99

Я мало знаю про процес C ++, і коли розумно обговорювати пропозиції, і, якщо чесно, це здається цілком ймовірним, що вдасться змінити тренування, але в цілому існує багато можливостей, запропонованих для PHP, які ніколи не роблять його до мови, і користувачеві було б досить заплутано зустріти їх у списках посилань. Це сказало, що я частково я просто
бурклий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.