Основи

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

Оператори порівняння — це аспект PHP, який часто забувають, і він може призвести до багатьох несподіваних результатів. Один такий Проблема виникає через строгі порівняння (порівняння логічних значень як цілих).

<?php
$a = 5;   // 5 як ціле число

var_dump($a == 5);       // порівняти значення; повернути істину
var_dump($a == '5');     // порівняти значення (ігнорувати тип); повернути істину
var_dump($a === 5);      // порівняти тип/значення (ціле проти цілого); повернути істину
var_dump($a === '5');    // порівняти тип/значення (ціле чи рядкове); повернути false

//Порівняння рівності
if (strpos('testing', 'test')) { // 'test' знаходиться в позиції 0, що інтерпретується як логічне значення 'false'
    // код...
}

// проти строгих порівнянь
if (strpos('testing', 'test') !== false) { // істина, оскільки виконано суворе порівняння (0 !== false)
    // код...
}

Умовні оператори

Оператори If

Під час використання операторів «if/else» у функції або методі класу існує поширена помилка, що необхідно використовувати «else». у поєднанні з оголошенням потенційних результатів. Однак якщо результатом є визначення значення, що повертається, «інакше» — ні необхідно, оскільки «return» завершить функцію, через що «else» стане спірним.

<?php
перевірка функції ($a)
{
    if ($a) {
        повернути істину;
    } ще {
        повернути false;
    }
}

// проти

перевірка функції ($a)
{
    if ($a) {
        повернути істину;
    }
    повернути false;    // інакше не потрібно
}

// або навіть коротше:

перевірка функції ($a)
{
    return (bool) $a;
}

Інструкції Switch

Інструкції Switch — це чудовий спосіб уникнути нескінченного введення операторів if і elseif, але є кілька речей, про які слід знати:

<?php
$answer = test(2);    // буде реалізовано код як з 'випадку 2', так і з 'випадку 3'

перевірка функції ($a)
{
    перемикач ($a) {
        випадок 1:
            // код...
            розрив;             // break використовується для завершення оператора switch
        випадок 2:
            // код... // без розриву, порівняння продовжиться до 'випадку 3'
        випадок 3:
            // код...
            повернути $результат;    // у функції, 'return' завершить функцію
        за замовчуванням:
            // код...
            повернути $error;
    }
}

Глобальний простір імен

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

<?php
простір імен phptherightway;

функція fopen()
{
    $file = \fopen();    // Назва нашої функції збігається з назвою внутрішньої функції.
                         // Виконати функцію з глобального простору, додавши '\'.
}функція array()
{
    $iterator = новий \ArrayIterator();    // ArrayIterator є внутрішнім класом. Використання назви без зворотної косої риски
                                         // спробує вирішити це у вашому просторі імен.
}

Рядки

Конкатенація

<?php
$a = 'Багаторядковий приклад';    // конкатенація оператора присвоювання (.=)
$a .= "\n";
$a .= 'що не робити';

// проти

$a = 'Багаторядковий приклад' // оператор конкатенації (.)
    . "\n" // відступ у нових рядках
    . «що робити»;

Типи рядків

Рядки — це набір символів, які повинні звучати досить просто. Тим не менш, існує кілька різних типів рядки, і вони пропонують дещо інший синтаксис із дещо іншою поведінкою.

Одинарні лапки

Одинарні лапки використовуються для позначення “літерального рядка”. Літеральні рядки не намагаються розібрати спеціальні символи або змінні.

Якщо ви використовуєте одинарні лапки, ви можете ввести ім’я змінної в рядок, наприклад: 'some $thing', і ви побачите точний вихід some $thing. Якщо використовуються подвійні лапки, це спробує оцінити назву змінної $thing і показати помилки, якщо не знайдено жодної змінної.

<?php
echo 'Це мій рядок, подивіться, який він гарний.';    // не потрібно розбирати простий рядок

/**
 * Вихід:
 *
 * Це моя струна, подивіться, яка вона гарна.
 */

Подвійні лапки

Подвійні лапки - це швейцарський армійський ніж. Вони не тільки аналізуватимуть змінні, як згадувалося вище, але й усілякі спеціальних символів, наприклад \n для нового рядка, \t для табуляції тощо.

<?php
echo 'phptherightway is' . $прикметник. '.'     // одинарний приклад лапок, який використовує кілька конкатенацій для
    . "\n" // змінні та екранований рядок
    . «Я люблю вчитися». $код. '!';

// проти

echo "phptherightway — $adjective.\n Я люблю вивчати $code!"  // Замість кількох конкатенацій подвійні лапки
                                                               // дозволяє нам використовувати рядок, що аналізується

Подвійні лапки можуть містити змінні; це називається «інтерполяція».

<?php
$juice = 'слива';
echo "Мені подобається $juice juice";    // Вихід: я люблю сливовий сік

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

Щоб вирішити цю проблему, візьміть змінну в пару фігурних дужок.

<?php
$juice = 'слива';
echo "Я випив трохи соку з $соків";    // $juice неможливо проаналізувати

// проти

$juice = 'слива';
echo "Я випив сік із {$juice}s";    // $juice буде проаналізовано

/**
 * Складні змінні також аналізуватимуться у фігурних дужках
 */

$juice = array('apple', 'orange', 'plum');
echo "Я випив сік із {$juice[1]}";   // $juice[1] буде проаналізовано

Синтаксис NowdocСинтаксис Nowdoc був представлений у версії 5.3 і внутрішньо працює так само, як одинарні лапки, за винятком того, що він підходить для

використання багаторядкових рядків без необхідності конкатенації.

<?php
$str = <<<'EOD' // ініціалізується <<<
Приклад рядка
охоплює кілька рядків
використовуючи синтаксис Nowdoc.
$a не аналізує.
EOD;                        // замикаючий 'EOD' має бути на власній лінії, і крайня ліворуч

/**
 * Вихід:
 *
 * Приклад рядка
 * охоплює кілька рядків
 * з використанням синтаксису nowdoc.
 * $a не аналізує.
 */

Синтаксис Heredoc

Внутрішньо синтаксис Heredoc поводиться так само, як подвійні лапки, за винятком того, що він підходить для використання багаторядкових рядки без необхідності конкатенації.

<?php
$a = 'Змінні';

$str = <<<EOD // ініціалізовано <<<
Приклад рядка
охоплює кілька рядків
використовуючи синтаксис heredoc.
$a аналізуються.
EOD;                        // замикаючий 'EOD' має бути на власній лінії, і крайня ліворуч

/**
 * Вихід:
 *
 * Приклад рядка
 * охоплює кілька рядків
 * з використанням синтаксису heredoc.
 * Змінні аналізуються.
 */

Слід зазначити, що багаторядкові рядки також можна сформувати, продовжуючи їх через багаторядкові оператори. наприклад

$str = "
Приклад рядка
охоплює кілька рядків
використання синтаксису оператора.
$a аналізуються.
";

/**
 * Вихід:
 *
 * Приклад рядка
 * охоплює кілька рядків
 * використання синтаксису оператора.
 * Змінні аналізуються.
 */

Що швидше?

Існує міф, що рядки одинарних лапок є частково швидшими, ніж рядки подвійних лапок. Це є принципово не вірно.

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

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

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

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

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

<?php
$a = 5;
echo ($a == 5) ? 'yay' : 'ні';

Для порівняння, ось приклад, який жертвує всіма формами читабельності заради зменшення кількості рядків.

<?php
відлуння ($a)? ($a == 5) ? 'так' : 'ні' : ($b == 10) ? 'excessive' : ':('; // надлишкова вкладеність, жертвуючи читабельністю

Щоб «повернути» значення за допомогою тернарних операторів, використовуйте правильний синтаксис.

<?php
$a = 5;
echo ($a == 5) ? return true : повернути false;    // цей приклад виведе помилку

// проти

$a = 5;
повернути ($a == 5) ? 'yay' : 'ні';    // цей приклад поверне 'yy'

Слід зазначити, що вам не потрібно використовувати тернарний оператор для повернення логічного значення. Приклад тому буде:

<?php
$a = 3;
повернути ($a == 3)? true : false; // Поверне true, якщо $a == 3 або false

// проти

$a = 3;
повернути $a == 3; // Поверне true, якщо $a == 3 або false

Це також можна сказати для всіх операцій (===, !==, !=, == тощо).

Використання дужок із тернарними операторами для форми та функції

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

<?php
$a = 3;
повернути ($a == 3)? "ага" : "ні"; // повертає так, якщо $a == 3 або ні

// проти

$a = 3;
повернути $a == 3? "ага" : "ні"; // повертає так, якщо $a == 3 або ні

Дужки також дають нам можливість створювати об’єднання в блоці операторів, де цей блок перевірятиметься в цілому. Наприклад, у цьому прикладі нижче, який повертає істину, якщо обидва ($a == 3 і $b == 4) істинні, а $c == 5 теж правда.

<?php
повернення ($a == 3 && $b == 4) && $c == 5;

Іншим прикладом є наведений нижче фрагмент, який поверне значення true, якщо ($a != 3 І $b != 4) АБО $c == 5.

<?php
повернути ($a != 3 && $b != 4) || $c == 5;

Починаючи з PHP 5.3, середню частину тернарного оператора можна не використовувати. Вираз “вираз1 ?: вираз3” повертає вираз1, якщо вираз1 має значення ІСТИНА, і вираз3 в іншому випадку.