Какие полезные идиомы PHP?

Я хочу улучшить свое кодирование 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);


person Andrew Whitehouse    schedule 28.10.2008    source источник
comment
Re: номер 2 - не пустой ($ arrayName) делает то же самое?   -  person pilsetnieks    schedule 29.10.2008
comment
2. Помните, что count ($ arrayName) выдаст предупреждение, если $ arrayName не задано. В противном случае вы неправильно кодируете, потому что для error_reporting не установлено значение E_ALL.   -  person Tom    schedule 31.10.2008


Ответы (9)


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


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

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

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

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

    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. Структурированные массивы - используйте объект

person Preston    schedule 29.10.2008
comment
Зачем использовать spl_autoload_register выше __autoload? - person Jrgns; 29.10.2008
comment
spl_autoload_register () позволяет использовать несколько функций автозагрузки. Полезно для объединения кода из нескольких источников. - person Preston; 31.10.2008
comment
Объекты кусаются, когда вы хотите скопировать и изменить поддерево (вам нужен рекурсивный __clone, в массивах вы получаете дешевую копию при записи). - person Kornel; 21.11.2008

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

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

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

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

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

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

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

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

person changelog    schedule 28.10.2008
comment
if (isset ($ array [$ key])) завершится ошибкой, если $ array [$ key] имеет значение NULL. Вы должны использовать array_key_exists ($ key, $ array). - person staticsan; 29.10.2008
comment
Это не приведет к ошибке, даже с E_ALL. Я уверен в этом;) - person changelog; 29.10.2008
comment
Да, но isset () легче запомнить;) Я никогда не помню, что такое стог сена, что за иголка, а функции не очень полезны, например, array_key должен быть $ array, а затем $ key, а не наоборот .. . - person changelog; 29.10.2008
comment
Я бы сказал, что всегда используйте __autoload, иначе большой проект в конечном итоге будет включать почти все файлы. Кроме того, он обеспечивает разумное именование файлов и структуру каталогов. - person Kornel; 21.11.2008
comment
Я читал, что require_once намного дороже, чем require ... может быть, что-то запомнить в проектах, где важна производительность. - person alex; 13.02.2009
comment
Не большая разница, если все делать правильно. Передача полного пути к require_once не сделает его отличным от require, за исключением того факта, что он проверит, требовался ли файл раньше. - person changelog; 16.02.2009

К счастью, пространства имен есть в 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!
}

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

person Lucas Oman    schedule 28.10.2008
comment
К сожалению, разделителем пространства имен будет обратная косая черта. Право, я не шучу! - person Tom; 31.10.2008
comment
ТБХ, я не думаю, что "\" - это настолько ужасный разделитель. - person Lucas Oman; 31.10.2008

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

person nickf    schedule 28.10.2008

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

  1. Соберите струны массивом.

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

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

person staticsan    schedule 29.10.2008
comment
Примерно так: echo InputForm (FORM_TEXT, 'name', $ name, array ('width' = ›40, 'required' =› true)); Четвертый параметр имеет ряд различных параметров в зависимости от типа первого параметра. - person staticsan; 30.10.2008

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

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

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

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

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

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

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

person philistyne    schedule 28.10.2008

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

person Kevin    schedule 29.10.2008

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

person too much php    schedule 17.01.2009