Справка - Что означает этот символ в PHP?


4481

Что это?

Это набор вопросов, которые время от времени возникают о синтаксисе в PHP. Это также Вики Сообщества, поэтому каждый приглашен принять участие в ведении этого списка.

Почему это?

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

Примечание. С января 2013 года переполнение стека поддерживает специальные символы . Просто окружите условия поиска кавычками, например[php] "==" vs "==="

Что мне здесь делать?

Если кто-то указал на вас кем-то, потому что вы задали такой вопрос, пожалуйста, найдите конкретный синтаксис ниже. Связанные страницы с руководством по PHP вместе со связанными вопросами, скорее всего, ответят на ваш вопрос. Если это так, вам предлагается поднять ответ. Этот список не является заменой помощи, оказанной другими.

Список

Если ваш конкретный токен не указан ниже, вы можете найти его в списке токенов парсера .


& Битовые операторы или ссылки


=& Ссылки


&= Битовые операторы


&& Логические Операторы


% Арифметические Операторы


!! Логические Операторы


@ Операторы контроля ошибок


?: Троичный оператор


?? Нулевой оператор объединения (начиная с PHP 7)


?string ?int ?array ?bool ?float Обнуляемое объявление типа возврата (начиная с PHP 7.1)


: Альтернативный синтаксис для структур управления , Тернарный оператор


:: Оператор разрешения области


\ Пространства имен


-> Классы И Объекты


=> Массивы


^ Битовые операторы


>> Битовые операторы


<< Битовые операторы


<<< Эредок или Новдок


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


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


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


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


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


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


<=> Операторы сравнения (начиная с 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
Сегодня (20/15 ноября) был задан вопрос stackoverflow.com/questions/33833259/what-is-rscat-in-php с вопросом «Что такое $ rsCat в php» (если этот вопрос все еще можно сделать видимым и не удалять) , Как ни странно, здесь нет ссылки на $переменные, а $$только на переменные. Я считаю, что это должно быть где-то исправлено.
Фанк Сорок Нинер

Ответы:


1172

Увеличение / Уменьшение Операторов

++ оператор приращения

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

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 ++ достаточно разные, чтобы работать на разных скоростях. Я нашел это захватывающим.
Питер Айтай

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

Вы заметите, что у нас установлено 3 бита в столбцах 8, 2 и 1. Сложите их: 8 + 2 + 1 = 11.


6
Что если $ a принимает значение больше 255?
Айкан Яшит

@ AycanYaşıt Большая часть операционной системы использует 32-битную и 64-битную систему, это означает, что ограничение намного превышает 255 (8 бит).
Альберт Самуил

@ AycanYaşıt На самом деле, представление здесь с длиной одного байта даже не корректно, так как даже самое маленькое целое число все еще остается 64-битным (8-байтовым) в памяти на современной 64-битной платформе.
Кай

Почему and &есть 0 0 0 0 1 0 0 0 и or |есть 0 0 0 0 1 0 1 1?
Vir

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работает для чисел, но не для строк, объектов или массивов.
Макрумли,

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

5
@MarkAmery руководство по миграции не является документированным поведением оператора. Для этого вам нужно взглянуть на раздел «Операторы языка» в руководстве по этому php.net/language.operators.comparison, в котором фактическое поведение зависит от различных функций сравнения API, например, когда вы делаете strcmp для строк, где Вы не можете гарантировать фактическое возвращаемое значение в каждом отдельном случае. Несомненно, это почти всегда 1, 0 или -1, но для случаев, когда вы не можете гарантировать это, как в оболочке libc strcmp, вы предлагаете то же поведение, что и базовая спецификация, чтобы быть в безопасности
Sherif

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: TRUE, если $ a и $ b равны TRUE.
  • $ a || $ b: ИСТИНА, если $ a или $ b - ИСТИНА.
  • $ a xor $ b: TRUE, если $ a или $ b TRUE, но не оба.
  • ! $ a: TRUE, если $ a не TRUE.
  • $ a и $ b: TRUE, если $ a и $ b равны TRUE.
  • $ a или $ b: TRUE, если $ a или $ b TRUE.

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

  • $ a == $ b: ИСТИНА, если $ a равно $ b после жонглирования типа.
  • $ a === $ b: TRUE, если $ a равно $ b, и они одного типа.
  • $ a! = $ b: TRUE, если $ a не равно $ b после жонглирования типа.
  • $ a <> $ b: TRUE, если $ a не равно $ b после жонглирования типа.
  • $ a! == $ b: TRUE, если $ a не равно $ b или они не одного типа.
  • $ a <$ b : TRUE, если $ a строго меньше, чем $ b.
  • $ a> $ b : TRUE, если $ a строго больше, чем $ b.
  • $ a <= $ b : TRUE, если $ a меньше или равно $ b.
  • $ a> = $ b : TRUE, если $ a больше или равно $ b.
  • $ a <=> $ b : целое число меньше, равно или больше нуля, когда $ a соответственно меньше, равно или больше, чем $ b. Доступно с PHP 7.
  • $ a? $ b: $ c : if $ a return $ b, иначе вернуть $ c ( тернарный оператор )
  • $ a ?? $ c : То же, что и $ a? $ a: $ c ( оператор слияния null - требуется PHP> = 7)

Арифметические операторы:

  • - $ 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'th power (введено в 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 : TRUE, если $ a и $ b имеют одинаковые пары ключ / значение.
  • $ a === $ b : ИСТИНА, если $ a и $ b имеют одинаковые пары ключ / значение в одном и том же порядке и одинаковых типов.
  • $ a! = $ b : TRUE, если $ a не равно $ b.
  • $ a <> $ b : TRUE, если $ 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.
Stramin

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.comparison.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'} -> line; может использоваться для доступа к данным в 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, это ограничение действительно только для heredocs, содержащих переменные.»?
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') - будет иметь значение true, потому что при сравнении обоих значений PHP внутренне преобразует это строковое значение в целое, а затем сравнивает оба значения

  3. if ($a === 5) - оценит как истинный

  4. if ($a === '5') - оценивается как ложное, потому что значение равно 5, но это значение 5 не является целым числом.


27

Нулевой оператор Coalesce "??" (Добавлено в PHP 7)

Не самое запоминающееся имя для оператора, но PHP 7 содержит довольно удобное объединение нулей, поэтому я решил поделиться примером.

В PHP 5 у нас уже есть троичный оператор, который проверяет значение, а затем возвращает второй элемент, если это возвращает true, и третий, если это не так:

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

Три точки как оператор 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
?>

Каждый аргумент функции executeNumbers () передается через $ 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

На данный момент это просто предложение, вы можете найти его здесь . Это 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

LOL Эта мысль пришла мне в голову. Я спросил себя, будет ли это иметь ценность для будущих посетителей, и на данный момент ответ «да». Но это может измениться ...
Джон Конде

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 ++ Proposal, и они не закрыты: несмотря на это, я с вами не собираюсь публиковать здесь этот оператор на данный момент
Berto99

Я не очень разбираюсь в процессе C ++ и в тех случаях, когда целесообразно обсуждать предложения, и, если честно, кажется, что этот вариант вполне может привести к модификации тренировки, но в целом для PHP предложено множество функций, которые никогда не доходят до язык, и было бы довольно запутанным для пользователей, чтобы встретить их всех в списках литературы. Тем не менее, я отчасти просто сварливый старик здесь: P
IMSoP
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.