Best PHP practices explained

It might be hard for beginners to understand why some practices are safer.

Some of the following tips might go beyond PHP though.

Permalink to heading Always use curly brackets Always use curly brackets

Let’s have a look at the following code :

if (isset($condition) && true === $condition)
    echo 'this is a success';

No PHP error but what happens with :

if (isset($condition) && true === $condition)
    foreach (range("A", "Z") as $letter)
        echo $letter . PHP_EOL;
        echo 'this is a success';

Still, no PHP error and “this is a success” appears only 1 time in the end, as probably intended, that was a trap :)

Hum… wait! No PHP error but what happens if you write $condition = false; before :

this is a success

Crap! We don’t want that. Do you see now why curly brackets are important?

Omitting brackets often leads to unwanted side effects. Besides, it’s much harder to read code. So write this instead :

$condition = false;
if (isset($condition) && true === $condition) {
    foreach (range("A", "Z") as $letter) {
        echo $letter . PHP_EOL;
    }
    echo 'this is a success';
}

Permalink to heading Skip the else part Skip the else part

It’s good practice to initialize any variable before using it. Considering the following :


if (isset($condition) && true === $condition) {
    $main = 'chocolate';
} else {
    $main = 'vanilla';
}

you might think that’s ok but what if you add several elseif conditions :

if ($condition) {
    $main = 'chocolate';
    $time = 2;
} elseif($otherCondition)) {
    $main = 'strawberry';
    $time = 3;
} elseif($otherOtherCondition)) {
    $main = 'apple';
    $time = 1;
} else {
    $main = 'vanilla';
    $time = 9;
}

The code is already heavy. There’s a good chance you will forget some vars somewhere when adding logic inside each elseif.

Instead write :

$main = 'vanilla';
$time = 9;

if ($condition) {
    $main = 'chocolate';
    $time = 2;
} elseif($otherCondition)) {
    $main = 'strawberry';
    $time = 3;
} elseif($otherOtherCondition)) {
    $main = 'apple';
    $time = 1;
}

This way, everyone knows $main and $time should be defined all the time. The code seems more readable.

Permalink to heading Don’t use the @ operator Don’t use the @ operator

It’s an error control operator in PHP. It hides errors but nobody wants that.

Instead, you should try to catch errors and use error logs.

This operator has huge drawbacks such as turning any debug into a nightmare or making the code slower!

For each run of your code, it will invoke the INI settings to set the error_reporting to 0 and set it back to its original value after.

Such a waste of resources. I think it’s safer not to use it at all.

Permalink to heading Some thoughts about ternaries Some thoughts about ternaries

While ternary operators might be handy, the code may be harder to read.

Permalink to heading Don’t overuse ternary operators Don’t overuse ternary operators

Ternaries allows shortcutting the if-else part :

$main = ($condition) ? "chocolate" : "vanilla";

which means :

if ($condition) {
    $main = "chocolate";
} else {
    $main = "vanilla";
}

This one is ok but I’ve already seen the following :

$output = ($condition) ? ($otherCondition) ? 'ok' : 'ko' : 'unknown';

Neither chaining nor nesting ternaries are recommended.

Permalink to heading Use “Elvis” operator with caution Use “Elvis” operator with caution

The Elvis operator is a special one.

$foo = $bar ?: "baz";

The above means :

$foo = $bar ? $bar : "baz";

which can be written like that :

if ($bar) {
    $foo = $bar;
} else {
    $foo = "baz";
}

Believe it or not, as the wiki said :

The name “Elvis operator” refers to the fact that when its common notation, ?:, is viewed sideways, it resembles an emoticon of Elvis Presley with his quiff.

Permalink to heading Be careful with the null coalescing operator Be careful with the null coalescing operator

The null coalescing operator has been available since PHP 7 :

syntactic sugar for the common case of needing to use a ternary in conjunction with isset().

So :

$result = isset($_GET['result']) ? $_GET['result'] : "default";

can be written like that :

$result = $_GET['result'] ?? "default";

Be extra careful when trying to replace ternaries and Elvis operators with null coalescing operators!

The null coalescing operator never checks if a condition is true, it is meant to check if your var is set and not null (the very concept of isset()).

Permalink to heading Wrap up Wrap up

I hope you enjoy these programming tips. The last thing I want to say is: Please don’t sacrifice clarity just for the sake of brevity.

I do my best to update all my contents, but keep it mind that "Best PHP practices explained" has been published many months ago.