Трикод

Блог программиста {три::код}

Альтернативный синтаксис PHP

Альтернативный синтаксис PHP
Одна из моих любимых тем. Альтернативный синтаксис упрощает написание, часто используемых команд, а это целые куски кода. К тому же альтернативный синтаксис, часто можно встретить при разборе кода других разработчиков. И хорошо бы понимать, что это за "абракадабра", ведь альтернативный синтаксис отличается от привычного вызова команд.

Пример 1

Несколько строк кода. Мы приведем к одной. Это позволит в зависимости результата функции, в данном примере isset(), выполнить или не выполнить другую функцию, в данном случае print();
 
     $value = 'World';
 
     if (isset($value) )
     {
          print $value;
     }
А теперь альтернативный синтаксис.
 
isset ($value) AND print $value; // Причем можно использовать &&

Пример 2

Очень часто использую. Упрощает написание условий if
 
if ($hour < 12)
        $foo =  "Good morning!";
else
        $foo =  "Good afternoon!";
 
print $foo;
В альтернативном исполнении, это будет так:
 
$foo = ($hour < 12) ? "Good morning!" : "Good afternoon!";
 
print $foo;
 
// И еще пару примеров
 
($foo) ? print 'true' : print 'false'; // c echo так не получиться, т.к. оная не является функцией
 
// но можно записать так
echo ($foo) ? 'true': 'false'; 
 
// раз уж пошла такая пьянка... Хоть это и не альтернативный синтаксис, 
// а "here document", в этой конструкции иногда возникает необходимость
echo <<<END
Здесь используется синтаксис "here document" для вывода
нескольких строк с подстановкой переменных $variable.
Заметьте, что закрывающий идентификатор должен
располагаться в отдельной строке. никаких пробелов!
END; 
// из документации
 
// ну вот например хорошее тому подтверждение, из того же дока
foreach ( $data as $i ){
echo <<<END
<tr>
  <td>$i['date']</td>
  <td>$i['name']</td>
 </tr>
END;
}

Пример 3

Если включена поддержка коротких тегов, можно провернуть еще один фокус.
 
<?php echo $var; ?>;
 
// Или так
<?=$var; ?>
Это удобно если вы оформляете вывод данных в шаблон своего сайта, на эту тему (упростить восприятие связки PHP+HTML) есть еще варианты альтернативного синтаксиса, возможно сделаю обзор здесь, или как обычно приведу ссылки в конце статьи, т.к. такой синтаксис можно встретить очень часто, здесь я хочу привести примеры которые можно использовать непосредственно в скрипте. Возвращаясь к третьему примеру, скажу, что я перестал использовать такой синтаксис, ведь не везде включена поддержка коротких тегов и если ваш скрипт "пойдет по миру", то где-до, наверняка возникнут проблемы. Но, исключительно в своих проектах, я использую более простой и легкий синтаксис. Что бы включить поддержку коротких тегов, нужно в php.ini найти строчку "short_open_tag = off" и сделать ее "on".

Пример 4

Тут вместиться несколько интересных примеров
 
 
// Хотите пишите так:
$a = 5
 
/**
* Мы знаем, что AND и OR, можно заменить на && и || соответственно, но мы же не видели весь список
* < : LT (less than, меньше чем)
* > : GT (greater than, больше чем)
* <= : LE (less or equal, меньше либо равно и тд, что бы запомнить было легче )
* >= : GE (greater or equal)
* == : EQ (equal)
* != : NE (not equal)
* && : AND // Это мы уже знаем
* || : OR // -- // -- //
*/
 
// В доке на array_unshift() есть интересный пример, который я не редко встречаю
 
$someArray = array(99 => 'ab', 98 => 'cd', 97 => 'ef', 96 => 'g');
 
$someArray = array(101 => 'Foo',100 =>'Bar') + $someArray;
 
// кратко вывод. 
// Смотрим на ключи получившегося массива: 101, 100, 99, 98...
 
// а вот PHP 5.4 уже принесет нам новые сюрпризы
 
$array = ['foo', 'bar'];
 
$obj = {'$foo', '$bar'};
Хорошо. Теперь смотрим как сделать связку PHP + HTML более читаемой. Эти примеры просто взяты из документации.

Рассмотрим альтернативный вариант конструкции if-else

 
// Например, проверяем роль(группу) пользователя и выдаем блок
// только для этой группы, например только для зарегистрированных
<?php if ($a == 5): ?>
<!-- HTML -->  
<?php endif; ?>
 
// Или так
<?if ($a == 5): ?>
<!-- HTML -->  
<?endif?>
 
// к слову внутри скрипта 
if ($a == 5) :
    echo "a равно 5";
    echo "...";
elseif ($a == 6) :
    echo "a равно 6";
    echo "!!!";
else:
    echo "a не равно ни 5 ни 6";
endif;
 
// Для for, foreach, while так же, посмотрите на сайте в дополнительных материалах, после статьи
 
// Ни разу не использовал, но как пример не помешает. Альтернативная конструкция Swith() - case
<? switch ($item): ?> // с короткими тегами (short_open_tag = on)
<? case 1: ?>
<!-- Значение равно -->
<? break; ?>
<?php case 2: ?> // Или без
<!-- Значение равно 2. -->
<?php break; ?>
<? case 3: ?>
<!-- Значение равно 3. -->
<? break; ?>
<? default: ?>
<!-- Значение не известно. -->
<? endswitch; ?>
Посмотрим вариант кода в шаблоне
 
 
<?if ($user->role == 'admin'): ?>
 
<div><?=$messages?></div>
 
<?elseif ($user->role == 'editor'): ?>
 
<div><?=$messages->editor?></div>
 
<?else:?>
 
<div></div>
 
<?endif?>
Ну вот наверное и все, если найду новые варианты, дополню статью. Если есть дополнения пишите.

Дополнительно по теме

Поля со * обязательны.