PHP
Правильный путь.
На главную Fork me on GitHub
Вы читаете подробную информацию о…

Основы

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

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

<?php
$a = 5;   // 5 как целое число (integer)

var_dump($a == 5);       // Сравниваются значения; Вернёт true
var_dump($a == '5');     // Сравниваются значения (игнорируя типы); Вернёт true
var_dump($a === 5);      // Сравниваются типы и значения (integer vs. integer); Вернёт true
var_dump($a === '5');    // Сравниваются типы и значения (integer vs. string); Вернёт false

/**
 * Строгое сравнение
 */
if (strpos('testing', 'test')) {    // 'test' находится в 0 позиции, результатом будет 'false'
    // Ваш код...
}

vs.

if (strpos('testing', 'test') !== false) {    // Результатом будет 'true', т.к. тут строгое сравнение (0 !== false)
    // Ваш код...
}

Условные операторы

Оператор “If”

При использовании операторов ‘if/else’ внутри функции или класса, существует распространенное заблуждение, что ‘else’ должен быть использован при возврате результатов выполнения. Если условие не выполняется и при этом возвращается значение (return $value), то использование ‘else’ может быть спорным.

<?php
function test($a)
{
    if ($a) {
        return true;
    } else {
        return false;
    }
}

vs.

function test($a)
{
    if ($a) {
        return true;
    }
    return false;    // else использовать не обязательно
}

Оператор “Switch”

Оператор “Switch” является отличным способом, чтобы не использовать много операторов “if” с использованием “elseif”, но необходимо знать некоторые вещи:

<?php
$answer = test(2);    // Этот код выберет 'case 2' и 'case 3'.

function test($a)
{
    switch ($a) {
        case 1:
            // Код...
            break;             // Прекратит выполнение switch тут если $a == 1, т.к. используется 'break'
        case 2:
            // Код...         // Код без 'break', поэтому будет выполнено сравнение с 'case 3'
        case 3:
            // Код...
            return $result;    // within a function, 'return' will end the function
        default:
            // Код...
            return $error;
    }
}

Глобальное пространство имён

Когда вы используете пространство имён (namespaces), вы можете обнаружить, что некоторые функции вам скрыты, недоступны. Что исправить это, указываете что это глобальная функция, использовав обратную косую черту ‘/’ перед именем функции.

<?php
namespace phptherightway;

function fopen()
{
    $file = \fopen();    // Функция имеет имя такое же как и глобальная функция 'fopen'.
                         // Чтобы их различать используйте в глобальных '\'.
}

function array()
{
    $iterator = new \ArrayIterator();   // ArrayIterator внешний класс. Если использовать его без '/'
                                        // то интерпретатор PHP будет пытаться найти его в пространстве 'phptherightway'.
}

Строки

Конкатенация (сцепление)

<?php
$a  = 'Multi-line example';    // Оператор сцепления строк (.=)
$a .= "\n";
$a .= 'of what not to do';

vs.

$a = 'Multi-line example'      // Оператор объединения (.)
    . "\n"                     // используя новые строки.
    . 'of what to do';

Тип строки.

Строки постоянный спутник для сообщества PHP, надеемся, эта статья объяснит различия между строковыми типами и их преимущества/использование.

Одиночные кавычки

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

<?php
echo 'Посмотрите как прекрасна моя симпатичная строка.';    // анализ этой строке не нужен.

/**
 * Выведет:
 *
 * Посмотрите как прекрасна моя симпатичная строка.
 */

Двойные кавычки

Двойные кавычки, как швейцарский нож. Они лучше всего используются для:

<?php
echo 'phptherightway is ' . $adjective . '.'     // эта строка использует multiple concatenating для
    . "\n"                                       // отделения переменных от строки.
    . 'I love learning' . $code . '!';

vs.

echo "phptherightway is $adjective.\n I love learning $code!"  // А тут используются двойные кавычки.

При использовании двойных кавычек часто бывает, что переменную нужно использовать в чуть изменнёном виде. Но при анализе строки PHP не сможет определить, что это переменная. Для решения этой проблемы оберните переменную в фигурные скобки.

<?php
$juice = 'plum';
echo "I drank some juice made of $juices";    // $juices не определена

vs.

$juice = 'plum';
echo "I drank some juice made of {$juice}s";    // $juice будет анализирована.

/**
 * Комплексные переменные также оборачивайте в фигурные скобки.
 */

$juice = array('apple', 'orange', 'plum');
echo "I drank some juice made of {$juice[1]}s";   // $juice[1] будет анализирована.

Nowdoc синтаксис

Nowdoc синтаксис был введён в php 5.3 и используется также как и одинарные кавычки, только для использования нескольких строк не нужно использовать объединение.

<?php
$str = <<<'EOD'             // Инициализируется <<<
Example of string
spanning multiple lines
using nowdoc syntax.
$a does not parse.
EOD;                        // закрывается 'EOD' (должен быть на новой строке и без отступов).

/**
 * Вывод:
 *
 * Example of string
 * spanning multiple lines
 * using nowdoc syntax.
 * $a does not parse.
 */

Heredoc синтаксис

Heredoc синтаксис работает также как и двойные кавычки, но также для использования нескольких строк не нужно использовать объединение.

<?php
$a = 'Variables';

$str = <<<EOD               // Инициализируется <<<
Example of string
spanning multiple lines
using heredoc syntax.
$a are parsed.
EOD;                        // закрывается  'EOD' (должен быть на новой строке и без отступов).

/**
 * Вывод:
 *
 * Example of string
 * spanning multiple lines
 * using heredoc syntax.
 * Variables are parsed.
 */

Тернарный оператор

Тернарный оператор (‘(expr1) ? (expr2) : (expr3)’) используется для удобства объединения кода в одну строку, но часто избыточен. Хоть он может быть вложенным, рекомендуется его использовать один на строку.

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

vs.

//Вложения
$b = 10;
echo ($a) ? ($a == 5) ? 'yay' : 'nay' : ($b == 10) ? 'excessive' : ':(';    // Вложения трудно читаемы.

Используя ‘return’ будьте внимательны:.

<?php
$a = 5;
echo ($a == 5) ? return true : return false;    // этот пример будет выдавать сообщение об ошибке

vs.

$a = 5;
return ($a == 5) ? 'yay' : 'nope';    // этот пример вернёт 'yay'

Объявление переменных

Время от времени разработчики пытаются сделать свой код “чище” использую предопределённые переменные. Обычно это только ведёт к увеличению используемой памяти. Для примера сообщите какой-нибудь переменной строку размером 1мб, в результате вы скопируете это дважды.

<?php
$about = 'Очень большой текст';    // будет использоваться 2MB памяти
echo $about;

vs.

echo 'Очень большой текст';        // а тут всего лишь 1MB