Каковы некоторые полезные идиомы PHP? - PullRequest
10 голосов
/ 28 октября 2008

Я хочу улучшить свое PHP-кодирование и мне интересно, какие специфичные для PHP методы используют другие программисты для повышения производительности или обхода ограничений PHP.

Некоторые примеры:

  1. Соглашение об именах классов для обработки пространств имен: Part1_Part2_ClassName отображается в файл Part1/Part2/ClassName.php

  2. if ( count($arrayName) ) // handles $arrayName being unset or empty

  3. Имена переменных функций, например, $func = 'foo'; $func($bar); // calls foo($bar);

Ответы [ 9 ]

13 голосов
/ 29 октября 2008

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


Подача заявления на получение удовольствия и прибыли:

  1. Итераторы в циклах foreach. Там почти никогда не бывает неправильное время.

  2. Дизайн вокруг автозагрузки классов. Используйте spl_autoload_register(), а не __autoload(). Для получения бонусных баллов пусть он рекурсивно сканирует дерево каталогов, а затем смело реорганизует ваши классы в более логичную структуру каталогов.

  3. Напечатайте везде. Используйте утверждения для скаляров.

    function f(SomeClass $x, array $y, $z) {
        assert(is_bool($z))
    }
    
  4. Вывести что-то кроме HTML.

    header('Content-type: text/xml'); // or text/css, application/pdf, or...
    
  5. Научитесь использовать исключения. Напишите обработчик ошибок, который преобразует ошибки в исключения.

  6. Замените ваши define() глобальные константы константами классов.

  7. Замените ваши метки времени Unix на соответствующий класс Date.

  8. В длинных функциях, unset() переменные, когда вы закончите с ними.


Используйте с виновным удовольствием:

  1. Цикл по элементам данных объекта как массив. Почувствуйте вину, что они не объявлены частными. Это не языческий язык, такой как Python или Lisp.

  2. Используйте выходные буферы для сборки длинных строк.

    ob_start();
    echo "whatever\n";
    debug_print_backtrace();
    $s = ob_get_clean();
    

Избегайте, если в этом нет крайней необходимости, и, вероятно, даже тогда, если только вы действительно не ненавидите программистов обслуживания и себя:

  1. Магические методы (__get, __set, __call)

  2. extract()

  3. Структурированные массивы - используйте объект

10 голосов
/ 28 октября 2008

Мой опыт работы с PHP научил меня нескольким вещам. Чтобы назвать несколько:

  • Всегда выводить ошибки. Это первые две строки моего типичного проекта (в режиме разработки):
ini_set('display_errors', '1');
error_reporting(E_ALL);
  • Никогда не используйте automagic . Такие вещи, как autoLoad, могут укусить вас в будущем.

  • Всегда требовать зависимых классов, используя require_once. Таким образом, вы можете быть уверены, что у вас будут прямые зависимости.

  • Используйте if(isset($array[$key])) вместо if($array[$key]). Второй вызовет предупреждение, если ключ не определен.

  • При определении переменных (даже с for циклами) присвойте им подробные имена ($listIndex вместо $j)

  • Комментарий, комментарий, комментарий. Если определенный фрагмент кода не кажется очевидным, оставьте комментарий. Позже вам может понадобиться просмотреть его и не вспомнить, для чего он предназначен.

Кроме этого, соглашения об именах классов, функций и переменных зависят от вас и вашей команды. В последнее время я использую соглашения об именах Zend Framework , потому что они мне подходят.

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

5 голосов
/ 28 октября 2008

См. Этот вопрос: Скрытые возможности PHP . В нем много действительно полезных советов по PHP, лучшие из которых оказались в верхней части списка.

5 голосов
/ 28 октября 2008

К счастью, пространства имен находятся в 5.3 и 6. Я бы настоятельно рекомендовал не использовать идиому Path_To_ClassName. Это делает грязный код, и вы никогда не сможете изменить структуру вашей библиотеки ... когда-либо.

Автозагрузка SPL великолепна. Если вы организованы, это может сохранить вам типичный блок из 20 строк, включающий и требующийся в верхней части каждого файла. Вы также можете изменить вещи в своей библиотеке кода, и если PHP может включать в себя эти каталоги, ничего не сломается.

Свободно используйте === над ==. Например:

if (array_search('needle',$array) == false) {
  // it's not there, i think...
}

выдаст ложный минус, если «игла» находится на нулевом ключе. Вместо этого:

if (array_search('needle',$array) === false) {
  // it's not there!
}

всегда будет точным.

4 голосов
/ 29 октября 2008
  1. Включите УВЕДОМЛЕНИЕ, и если вы действительно хотите СТРОГО сообщать об ошибках. Это предотвращает много ошибок и запаха кода: ini_set('display_errors', 1); error_reporting(E_ALL && $_STRICT);
  2. Держитесь подальше от глобальных переменных
  3. Сохраняйте как можно меньше функций. Он легче читается и прост в обслуживании. Некоторые люди говорят, что вы должны видеть всю функцию на вашем экране или, по крайней мере, что начальные и конечные фигурные скобки циклов и структур в функции должны быть на вашем экране
  4. Не доверяйте вводу пользователя!
4 голосов
/ 29 октября 2008

Есть несколько вещей, которые я делаю в PHP, которые имеют тенденцию быть специфичными для PHP.

  1. Сборка строк с массивом.

    В PHP много манипуляций со строками обходится дорого, поэтому я склонен писать алгоритмы, которые уменьшают дискретное количество манипуляций со строками, которые я делаю. Классический пример - построение строки с помощью цикла. Вместо этого начните с array () и выполните конкатенацию массива в цикле. Затем взорвите () в конце. (Это также решает проблему запятой в конце.)

  2. Константы массива удобны для реализации именованных параметров в функциях.

3 голосов
/ 17 января 2009

Познакомьтесь с различными типами и оператором ===, это важно для некоторых функций, таких как strpos(), и вы сами начнете использовать return false.

3 голосов
/ 29 октября 2008

Объявите переменные перед их использованием!

3 голосов
/ 28 октября 2008

Я работаю с PHP (и MySQL) в течение последних 5 лет. Совсем недавно я начал использовать фреймворк ( Zend ) с солидной библиотекой javascript ( Dojo ), и он изменил способ моей работы навсегда (думаю, хорошим способом).

То, что заставило меня задуматься об этом, было вашим первым знакомым: Zend Framework делает именно это, поскольку это стандартный способ доступа к «контроллерам» и «действиям».

С точки зрения инкапсуляции и абстрагирования проблем с разными базами данных, Zend_Db это очень хорошо. Dojo отлично справляется с устранением несоответствий JavaScript в разных браузерах.

В целом, стоит познакомиться с хорошими методиками ООП, и использование (и ЧТЕНИЕ О!) Фреймворков стало очень практичным способом понимания проблем ООП.

Сведения о некоторых автономных инструментах, которые стоит использовать, см. Также:

Smarty (движок шаблонов) ADODB (абстракция доступа к базе данных)

...