Операторите за сравнение са често непрочетени и пропускани, в следствие на което водят до неочаквани изходи. Един пример се крие в стриктните сравнения (сравняването на булева стойност с цяло число).
<?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 и 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 е великолепен начин за избягване на писане на безкрайни 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 се появява за първи път в 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 вътрешно работи като двойни кавички и е пригоден за работа с многоредови низове, без нужда от конкатенация.
<?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 памет