Osnove

Primerjalni operatorji

Primerjalni operatorji so pogosto spregledani aspekt PHP-ja, kar lahko pelje do mnogih nepričakovanih rezultatov. En tak problem izhaja iz striktnih primerjav (primerjava logičnih izrazov kot cela števila).

<?php
$a = 5;   // 5 as an integer

var_dump($a == 5);       // compare value; return true
var_dump($a == '5');     // compare value (ignore type); return true
var_dump($a === 5);      // compare type/value (integer vs. integer); return true
var_dump($a === '5');    // compare type/value (integer vs. string); return false

// Primerjava enakosti
if (strpos('testing', 'test')) {    // 'test' is found at position 0, which is interpreted as the boolean 'false'
    // code...
}

// proti striktni primerjavi
if (strpos('testing', 'test') !== false) {    // true, as strict comparison was made (0 !== false)
    // code...
}

Pogojni stavki

If stavki

Pri uporabi stavkov »if/else« znotraj funkcije ali metode razreda, je pogosto spregledano, da mora biti »else« uporabljen v vezavi, da se deklarira potencialne rezultate. Vendar če rezultat definira vrednost, ki jo vrne, »else« ni potreben saj bo »return« končala funkcijo, kar naredi »else« spornega.

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

// proti

function test($a)
{
    if ($a) {
        return true;
    }
    return false;    // else is not necessary
}

// ali še krajše:

function test($a)
{
    return (bool) $a;
}

Stavki switch

Stavki switch so odličen način za izogib pisanju neskončnih »if« in »else« stavkov, vendar je nekaj stvari, na katere je dobro biti pozoren:

<?php
$answer = test(2);    // the code from both 'case 2' and 'case 3' will be implemented

function test($a)
{
    switch ($a) {
        case 1:
            // code...
            break;             // break is used to end the switch statement
        case 2:
            // code...         // with no break, comparison will continue to 'case 3'
        case 3:
            // code...
            return $result;    // within a function, 'return' will end the function
        default:
            // code...
            return $error;
    }
}

Globalni imenski prostor

Ko se uporablja imenske prostore, lahko ugotovite, da so interne funkcije skrite za funkcijami, ki jih napišete. Da se to popravi, se sklicujte na globalne funkcije z uporabo leve poševnice pred imenom funkcije.

<?php
namespace phptherightway;

function fopen()
{
    $file = \fopen();    // Our function name is the same as an internal function.
                         // Execute the function from the global space by adding '\'.
}

function array()
{
    $iterator = new \ArrayIterator();    // ArrayIterator is an internal class. Using its name without a backslash
                                         // will attempt to resolve it within your namespace.
}

Nizi

Spajanje

<?php
$a  = 'Multi-line example';    // concatenating assignment operator (.=)
$a .= "\n";
$a .= 'of what not to do';

// proti

$a = 'Multi-line example'      // concatenation operator (.)
    . "\n"                     // indenting new lines
    . 'of what to do';

Tipi nizov

Nizi so serija znakov, ki bi morali biti precej enostavni. Tako povedano je na voljo več različnih tipov nizov in ponujajo malenkost drugačno sintakso z malenkost različnimi obnašanji.

Enojni citati

Enojni citati so uporabljeni za označevanje »dobesednih nizov«. Dobesedni nizi ne poskušajo prevajati posebnih znakov ali spremenljivk.

Če uporabljate enojne citate, bi lahko vnesli ime spremenljivke v niz kot je: 'stome $thing' in videli bi točen izpis some $thing. Če uporabljate dvojne citate, ki bi poskušali oceniti ime spremenljivke $thing in pokazati napake, če ni najdena nobena spremenljivka.

<?php
echo 'This is my string, look at how pretty it is.';    // no need to parse a simple string

/**
 * Output:
 *
 * This is my string, look at how pretty it is.
 */

Dvojni citati

Dvojni citati so švicarski vojaški nož nizov. Ne bodo sami prevedli spremenljivk, kot je omenjeno zgoraj, vendar vse vrste posebnih znakov, kot je \n za novo vrstico, \t za tabulator itd.

<?php
echo 'phptherightway is ' . $adjective . '.'     // a single quotes example that uses multiple concatenating for
    . "\n"                                       // variables and escaped string
    . 'I love learning' . $code . '!';

// proti

echo "phptherightway is $adjective.\n I love learning $code!"  // Instead of multiple concatenating, double quotes
                                                               // enables us to use a parsable string

Dvojni citati lahko vsebujjejo spremnljivke, to se imenuje »interpolacija«.

<?php
$juice = 'plum';
echo "I like $juice juice"; // Output: I like plum juice

Ko se uporablja interpolacijo, je pogosti primer, da se bo spremenljivka dotikala drugega znaka. Tu bo prišlo do nekaj zmede, kaj je ime spremenljivke in kaj je dobesedni znak.

Da se to odpravi, se ovije spremenljivko znotraj zavitih oklepajev.

<?php
$juice = 'plum';
echo "I drank some juice made of $juices";    // $juice cannot be parsed

// proti

$juice = 'plum';
echo "I drank some juice made of {$juice}s";    // $juice will be parsed

/**
 * Complex variables will also be parsed within curly brackets
 */

$juice = array('apple', 'orange', 'plum');
echo "I drank some juice made of {$juice[1]}s";   // $juice[1] will be parsed

Sintaksa nowdoc

Sintaksa nowdoc je bila predstavljena v 5.3 in se interno obnaša na podoben način kot enojni citati, razen ko je primernejše uporabiti več vrstične nize brez potrebe po spojevanju.

<?php
$str = <<<'EOD'             // initialized by <<<
Example of string
spanning multiple lines
using nowdoc syntax.
$a does not parse.
EOD;                        // closing 'EOD' must be on its own line, and to the left most point

/**
 * Output:
 *
 * Example of string
 * spanning multiple lines
 * using nowdoc syntax.
 * $a does not parse.
 */

Sintaksa heredoc

Sintaksa heredoc se interno obnaša na enak način kot dvojni citati razen, da je primernejša za uporabo več vrstičnih nizov brez potrebe po spojevanju.

<?php
$a = 'Variables';

$str = <<<EOD               // initialized by <<<
Example of string
spanning multiple lines
using heredoc syntax.
$a are parsed.
EOD;                        // closing 'EOD' must be on its own line, and to the left most point

/**
 * Output:
 *
 * Example of string
 * spanning multiple lines
 * using heredoc syntax.
 * Variables are parsed.
 */

Potrebno je opozoriti, da so več vrstični nizi lahko tvorjeni tudi z nadaljevanjem preko večih vrstic v stavku. npr.

$str = "
Example of string
spanning multiple lines
using statement syntax.
$a are parsed.
";

/**
 * Output:
 *
 * Example of string
 * spanning multiple lines
 * using statement syntax.
 * Variables are parsed.
 */

Kaj je hitreje?

Naokoli obstoja mit, da so enojni citati frakcijsko hitrejši kot dvojni nizi. To v osnovi ni res.

Če definirate enojni niz in ne poskušate združevati vrednosti ali česarkoli kompliciranega, potem bodo ali enojni ali dvojni nizi v celoti identični. In noben ni hitrejši.

Če združujete več nizov kateregakoli tipa ali interpolirate vrednosti v dvojno citirane nize, potem so lahko rezultati različni. Če delate z majhnim številom vrednosti, potem je združevanje do potankosti hitrejše. Z veliko vrednosti je interpolacija do potankosti hitrejša.

Ne glede na to, kaj delate z nizi, noben tip ne bo nikoli imel opaznejšega vpliva na vašo aplikacijo. Če poskušate prepisati kodo, da uporablja enega ali drugega, je vedno vaja v jalovosti, torej se izogibajte tem mikro-optimizacijam, razen če res razumete pomen in vpliv teh razlik.

Trojni operatorji

Trojni operatorji so odlična pot za zgoščeno kodo, vendar so pogosto uporabljeni s presežkom. Medtem ko so lahko trojni operatorji zloženi/gnezdeni, je priporočljivo uporabiti enega na vrstico zaradi bralnosti.

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

V primerjavi je tu primer, ki žrtvuje vse oblike bralnosti za zmanjšanje števila vrstic.

<?php
echo ($a) ? ($a == 5) ? 'yay' : 'nay' : ($b == 10) ? 'excessive' : ':(';    // excess nesting, sacrificing readability

To ‘return’ a value with ternary operators use the correct syntax.

<?php
$a = 5;
echo ($a == 5) ? return true : return false;    // this example will output an error

// proti

$a = 5;
return ($a == 5) ? 'yay' : 'nope';    // this example will return 'yay'

Pozoren je treba biti, da ne potrebujete uporabljati trojnih operatorjev za vračanje logičnih vrednosti. Primer tega bi bil:

<?php
$a = 3;

return ($a == 3) ? true : false; // Will return true if $a == 3 or false

// proti

$a = 3;

return $a == 3; // Will return true if $a == 3 or false

To lahko rečemo tudi za vse operacije (===, !==, !=, == itd.).

Uporaba oklepajev s trojnimi operatorji za oblikovanje in funkcijo

Ko se uporablja trojni operator, lahko oklepaji igrajo svojo vlogo za izboljšanje bralnosti kode in tudi vključitev zvez znotraj blokov izrazov. Primer, ko ni nobene zahteve po uporabi oklepajev, je:

<?php
$a = 3;

return ($a == 3) ? "yay" : "nope"; // return yay if $a == 3 or nope

// proti

$a = 3;

return $a == 3 ? "yay" : "nope"; // return yay if $a == 3 or nope

Oklepaji nam tudi omogočajo zmožnost izdelave zvez znotraj blokov stavkov, kjer bo blok preverjen kot celota. Kot ta primer spodaj, ki bo vrnil true če sta oba ($a == 3 in $b == 4) true in $c == 5 je tudi true.

<?php

return ($a == 3 && $b == 4) && $c == 5;

Drug primer je skupek kode spodaj, ki bo vrnil true, če velja ($a != 3 AND $b != 4) OR $c == 5.

<?php

return ($a != 3 && $b != 4) || $c == 5;

Od PHP 5.3 je možno izpustiti srednji del trojnega operatorja. Izraz »expr1 ?: expr3« vrne expr1, če je enako TRUE drugače pa expr3.