Best PHP practices explained
Tags: php
Published: 2020-03-08 22:54:31

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

Some of the following tips might go beyond PHP though.

## Always use curly brackets

Let's have a look at the following code :

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

No PHP error but what happens with :

```php
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 :

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

## Skip the else part

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

```php

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

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

```php
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 :

```php
$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.

## 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.

## Some thoughts about ternaries

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

### Don't overuse ternary operators

Ternaries allows shortcutting the if-else part :

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

which means :

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

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

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

Neither chaining nor nesting ternaries are recommended.

### Use "Elvis" operator with caution

The [Elvis operator](https://en.wikipedia.org/wiki/Elvis_operator) is a special one.

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

The above means :

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

which can be written like that :

```php
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.

### Be careful with the null coalescing operator

The [null coalescing operator](https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op) has been available since PHP 7 : 

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

So :

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

can be written like that :


```php
$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()`).

## 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.