6 PHP трюков, как сделать код короче

VitaliyRodnenko, 19.08.2008

Недавно нашел англоязычную статью, в которой описывались приемы сокращения PHP-кода. Признаюсь, некоторые методы мне были известны, а о некоторых я даже не подозревал. Поэтому решили выложить русскоязычный вариант статьи, думаю Вы найдете в ней что-то новое для себя.

PHP — хороший язык, но в нем всегда полно сюрпризов. И сегодня я увидел интересную статью в блоге Арнольда Дэниэлса. Он рассуждает о «временных переменных» в РНР. Этот прием полезен для «ленивых» разработчиков, которые даже не задумываются о названиях переменных. Они предпочитают такое наименование, как «${0}» и «0» — ведь это хорошее название для переменной, почему нет…

Но я уверен, что когда нет переменной, нет и проблемы. Поэтому приведу несколько приемов, которые делают Ваш код короче и труднее для восприятия :)

  1. Используйте || (или) и && (и) вместо if

    Много кода:

    $status = fwrite($h, 'some text');
    if(!$status) {
        log('Writing failed');
    }

    Меньше кода:

    ${0} = fwrite($h, 'some text');
    if(!${0}) log('Writing failed');

    Еще меньше кода:

    fwrite($h, 'some text') or log('Writing failed');
  2. Используйте «тернарный оператор»

    Много кода:

    if($age < 16) {
        $message = 'Welcome!';
    }
    else {
      $message = 'You are too old!';
    }

    Меньше кода:

    $message = 'You are too old!';
    if($age < 16) {
        $message = 'Welcome!';
    }

    Еще меньше кода:

    $message = ($age < 16) ? 'Welcome!' : 'You are too old!';
  3. Используйте «for» вместо «while»

    Много кода:

    $i = 0;
    while($i < 100) {
      $source[] = $target[$i];
      $i += 2;
    }

    Меньше кода:

    for($i = 0; $i < 100; $source[] = $target[$i+=2]);
  4. В некоторых случаях PHP требует от вас создания переменной. Например, при получении массива элементов, когда массив возвращается функцией:

    $ext = pathinfo('file.png')['extension'];

    Результат: Parse error: syntax error, unexpected ‘[' in … on line …

    Чтобы справиться с этими ситуациями Вы можете создать несколько небольших функций для быстрого вызова часто используемых операций:

    // Возвращает ссылку на создаваемый объект
    function &r($v) {
    	return $v;
    }
    
    // Возвращает сдвиг массива
    function &a(&$a, $i) {
    	return $a[$i];
    }
    
  5. Исследуйте язык, который используете

    PHP — очень мощный язык и содержит множество функций и интересных аспектов, которые могут сделать Ваш код рациональнее и короче.

  6. Пишите комментарии

    В тех случаях, когда лучше написать больше кода и потом легко его читать, не ленитесь. Потратьте на пару секунд больше и напишите комментарий и более читаемую структуру. Это единственный прием из списка, который действительно может помочь сэкономить часы, а не минуты.

Подписаться на обновления блога

Вам понравился наш блог, хотите следить за обновлениями? Подпишитесь на RSS рассылку или рассылку по электронной почте. Так же вы можете следить за нами в Twitter.

Категории: PHP, Переводы | Комментировать

Комментарии (11)

  1. PHP кодер / 20.08.2008 в 19:45

    Сокращение кода часто ведёт к ухудшению понимания кода при беглом просмотре, так что 6-й пункт обязателен :)

  2. Bolzamo / 26.08.2008 в 13:44

    По 4-му пункту:
    Сокращенный код будет выглядеть так:

    $ext = &a(pathinfo('index.php'), 'extension');

    Я правильно понял?
    Но зачем нужна функция &r()?

  3. Skaizer / 26.08.2008 в 19:55

    Bolzamo, по поводу

    $ext = &a(pathinfo('index.php'), 'extension');

    В $ext будет лежать именно ссылка на элемент массива, а не копия. Т.е. например:

    $mass = array ('e1'=>'test1','e2'=>'test2');
    $val = &a($mass,'e2');
    echo $val;
    $val = 'another_val';
    echo $mass['e2'];

    В первом случае результат будет ‘test2′ во втором ‘another_val’. С помощью этой ссылки мы можем обращаться к элементу массива, возвращаемого функцией.

    Что касается функции &r, я думаю что эта реализация будет полезна, когда операции над объектом необходимо производить во многих участках кода. Соответственно, чтобы не создавать копию объекта каждый раз, можно передавать только ссылку на него. Лично я это именно так понял :)

  4. Сотомайор / 21.12.2008 в 22:24

    >$ext = pathinfo(‘file.png’)['extension'];

    а не легче ли использовать list() чем определять функции и иметь проблему с их областью видимости ?

  5. Awilum / 16.11.2009 в 23:30

    Хорошая статья :) добавил ваш блог себе в ридер :)

  6. kein / 26.07.2010 в 14:25

    Можно добавить с появлением php 5.3

    $b = $a?$a:$c; упрощается в $b = $a?:$c;

    А так же теперь запрещено передавать ссылки в функции.
    А объекты не копируются при присваивании и передают ссылку по умолчанию, для копирования нужно использовать метод clone.

  7. php-user / 03.11.2010 в 11:00

    Вот про название переменной как ${0}, узнал у вас. Помогли.

  8. аноним / 03.04.2011 в 15:09

    «Используйте «for» вместо «while»»

    Это приведет к увеличению времени выполнения, т.к. for самый медленный из операторов перебора

  9. DropSQL / 06.03.2013 в 16:16

    Это приведет к увеличению времени выполнения, т.к. for самый медленный из операторов перебора

    Ну во первых самый медленный foreach, а во вторых не так уж сильно и медленней будет, на что стоит обращать внимание

  10. Obazure / 10.01.2016 в 19:05

    насчет пункта 3.

    Для проверки сотворил такое

    <?php
    /*
    *создаю массив таргет размером 100 или может быть 101
    *далее проверка двух циклов перебором
    *и вывод….
    */
    for($i = 0; $i <= 100; $i++)
    {
    $target[$i]=$i;
    }

    $i = 0;
    while($i < 100) {
    $source1[] = $target[$i];
    $i += 2;
    }
    print_r ($source1);

    for($i = 0; $i

    в итоге получилось такое

    Array ( [0] => 0 [1] => 2 [2] => 4 [3] => 6 [4] => 8 … [45] => 90 [46] => 92 [47] => 94 [48] => 96 [49] => 98 )
    Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10…[45] => 92 [46] => 94 [47] => 96 [48] => 98 [49] => 100 )

    Итог: второй цикл (сокращенный) потерял первую переменную массива таргет.

  11. Obazure / 10.01.2016 в 19:06

    насчет пункта 3.

    Для проверки сотворил такое

    <?php
    /*
    *создаю массив таргет размером 100 или может быть 101
    *далее проверка двух циклов перебором
    *и вывод….
    */
    for($i = 0; $i <= 100; $i++)
    {
    $target[$i]=$i;
    }

    $i = 0;
    while($i < 100) {
    $source1[] = $target[$i];
    $i += 2;
    }
    print_r ($source1);

    for($i = 0; $i 0 [1] => 2 [2] => 4 [3] => 6 [4] => 8 … [45] => 90 [46] => 92 [47] => 94 [48] => 96 [49] => 98 )
    Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10…[45] => 92 [46] => 94 [47] => 96 [48] => 98 [49] => 100 )

    Итог: второй цикл (сокращенный) потерял первую переменную массива таргет.

Оставить комментарий

480×60
480×60