Тернарная условная операция

Тернарная условная операция или как часто любят говорить краткая запись if может принести много беды, если не понимать некоторых тонкостей.

Синтаксис следующий

 

Синтаксис:

expression ? true_value : false_value
Выполнение этой инструкции начинается с операнда expression. Если значение выражения expression истинно (true), то возвращается значение выражения true_value, иначе возвращается false_value.
Вроде все ясно.
Например, если в $id нам передается номер статьи, то используем его, если нет, то перевод на первую новость.
Как это будет выглядеть
$id = '1212';
$id = empty($id) ? $id : 1;

Однако все не так просто. Что если передадут в id буквы?

$id = 'asdas';
$id = empty($id) ? $id : 1;
//  выведет asdas

Заюзаем проверку на число

$id = is_numeric($id) ? $id : 1;

Но и тут, можно передать отрицательное число, что не есть хорошо, или 001, что может привести к проблемам в некоторых случаях, тогда запишем  так

$id = is_numeric($id)  && $id>0  ? (int)$id : 1;

 

Но мы можем развернуть эту схему в классический if else, т.е. сделать записать в одном из операндов выражение.

 

<?php

$id = 'sfg';
is_numeric($id) && $id>0  ? $id=(int)$id : $id=1;
echo $id;

Идентично

if (is_numeric($id) && $id>0){
    $id=(int)$id;
}else{
    $id=1;
}

 

 

Путаница для новичков возникает при первом просмотре примерно такого выражения, когда, вроде как переменной идет присвоение какого то выражения, а на выходе получаем совсем другое.

<?php

$id = '21';
$id = (is_numeric($id) && $id>0) && $id!=1  ? (int)$id : 1;

echo $id;

Область видимости объектов в памяти PHP

1.php Создадим объект класса и запишем его в массив.

<?php
$std = new stdClass();
$std->first = 1;
session_start();
$_SESSION['test1'] = $std;
print_r($_SESSION['test1']);

2.php В другом файле прочитаем его.

<?php
session_start();
$std = $_SESSION['test1'] ;
$std->first = 'first';

3.php В третьем файле выводим

<?php
session_start();
print_r($_SESSION['test1']->first);

Что получим? Правильно

first

Хотя мы не записывали переменную std в Сессию, так как это объект, str ссылается на объект, который в сессии, и при изменение его, мы меняем этот же объект в сессии.

То же самое правильно для функции.

При передачи объекта в функцию, при модификации объекта в функции он изменяется и после нее.