Основите

Оператори за сравнение

Операторите за сравнение са често непрочетени и пропускани, в следствие на което водят до неочаквани изходи. Един пример се крие в стриктните сравнения (сравняването на булева стойност с цяло число).

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

var_dump($a == 5);       // сравнява по стойсност; върша истина (true)
var_dump($a == '5');     // сравнява по стойност (пропуска типа); връща истина (true)
var_dump($a === 5);      // compare type/value (integer vs. integer); връша истина (true)
var_dump($a === '5');    // compare type/value (integer vs. string); връща лъжа (false)

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

// А не

if (strpos('testing', 'test') !== false) {    // истина (true), в следствие на стриктното сравнение (0 !== false)
    // още код...
}

Условни аргументи

Конструкцията if

Като се ползват конструкциите ‘if и else’ в фунцкия или клас, съществува забуда, че ‘else’ трябва да бъде ползван за да укаже потенциален изход. Но когато случаят е, че трябва да върне стойност, ‘else’ не е нужен, той като ‘return’ ще прекрати функцията и ‘else’ ще бъде пропуснат.

<?php
function test($a)
{
    if ($a) {
        return true;
    }
    return false;    // else не е нужен
}

// А не

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

Конструкцията switch

Конструкцията switch е великолепен начин за избягване на писане на безкрайни if/elseif/else, но трябва да се запознаете с някои неща относно конструкцията switch:

<?php
$answer = test(2);    // кодът от от 'case 2' и 'case 3' ще бде изпълнен

function test($a)
{
    switch ($a) {
        case 1:
            // код...
            break;             // използва се за break за прекратяване на конструкцията switch
        case 2:
            // код...          // без break, изпълнението ще продължи изпълнението до break или return, т.е. 'case 3'
        case 3:
            // код...
            return $result;    // в фунцкия, 'return' ще прекрати функцията
        default:
            // код...
            return $error;
    }
}

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

Когато се ползват постранства от имена, може да намерите вашият код да се изпълнява в грешен обхват (scope) за вътрешни методи. За да оправите това дефинирайте метода глобално, като добавите обратна наклонена черта пред името на метода.

<?php
namespace phptherightway;

function fopen()
{
    $file = \fopen();    // нашата функция е със същото име като вътрешна функция
                         // изпълняваме глобалната като добавим '\' пред името.
}

function array()
{
    $iterator = new \ArrayIterator();    // ArrayIterator е вътрешен клас. Използвайки го без '\'
                                         // ще се изпълни в локалното пространство от имена
}

Низове

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

<?php
$a = 'Пример на няколко реда,'      // оператор за конкатенация (.)
    . "\n"                          // отместване при "нов ред"
    . 'за това какво трябва да правим';

// А не

$a  = 'Същият пример на няколко реда,';    // оператор за конкатенация и присвояване (.=)
$a .= "\n";
$a .= 'но за това какво да НЕ правим';

Низови типове

Надяваме се с тази секция да обясним разликите между типовете низове и техните предимства и начини за ползване.

Апострофи

Поставяне в апострофи е най-простият начин за дефиниране на низ и често най-бързият. Скоростта се крие в това, че PHP интерпретатора не прави разбор на низа (за променливи). Този тип е най-добър за:

<?php
echo 'This is my string, look at how pretty it is.';    // няма нужда от разбор на прост низ

/**
 * Изход:
 *
 * This is my string, look at how pretty it is.
 */

Кавички

Поставянето в кавички представлява швецарско ножче за работа с низове, но е по-бавни защото трябва да им се прави разпознаване. Най-добре служат за:

<?php
echo 'phptherightway is ' . $adjective . '.'     // пример с единични кавички би използвал множество конкатенации
    . "\n"                                       // за променливите и екранирания низ
    . 'I love learning' . $code . '!';

// А не

echo "phptherightway is $adjective.\n I love learning $code!"  // Вместо конкатенираме, двойните кавички
                                                               // ни позволяват да ползваме низ за разпознаване

Когато се ползват двойни кавички, които съдържат променливи, често се случва променливата да се допира до друг символ. Тогава PHP няма да разпознае променливата, защото е скрита. За да оправим този проблем, Ограждаме променливаа в къдрави скоби.

<?php
$juice = 'plum';
echo "I drank some juice made of $juices";    // променливата $juice няма да бъде разпозната

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 се появява за първи път в 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.
 */

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

Условените оператори са страхотен начин за сбиване на код, но често се прекалява с използването им. Вътреки, че те могат да се вместят един в друг, препоръчва се да се използва само по един на линия с цел четимост.

<?php
$a = 5;
echo ($a == 5) ? 'yay' : 'nay'; // Един на линия

А не:

// вложени условни оператори
$b = 10;
echo ($a) ? ($a == 5) ? 'yay' : 'nay' : ($b == 10) ? 'excessive' : ':(';    // търде много влагане, жертва се четимостта

Тройните оператори, също имат ограниения и не могат да бъдат ползвани за връшане (‘return’) на стойност.

<?php
$a = 5;
echo ($a == 5) ? return true : return false;    // този пример ще хвърли грешка,

Деклариране на променливи

Понякога, програмистите опитват да пишат “по-чист” код, като предефинират променливи с друго име. Реално това удвоява заетата памет от конкретния скрипт. За примера по-долу, нека кажем че примерният низ съдържа данни заемащи 1МБ памет. При копирането им в променлива, се увеличава използваната памет до 2МБ.

<?php
$about = 'A very long string of text';    // използва 2MB памет
echo $about;

vs.

echo 'A very long string of text';        // Използва 1MB памет