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

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

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

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

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

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

Ответ 1

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


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

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

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

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

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

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

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

  • Замените временные метки Unix на класс Date.

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


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

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

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

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

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

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

  • extract()

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

Ответ 2

Мой опыт работы с 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 трассировку.

Ответ 3

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

Ответ 4

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

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

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

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

даст ложное отрицание, если "игла" находится на нулевом значении. Вместо этого:

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

  • Включить NOTICE, и если вы действительно хотите сообщать об ошибках STRICT. Это предотвращает много ошибок и запаха кода: ini_set('display_errors', 1); error_reporting(E_ALL && $_STRICT);
  • Держитесь подальше от глобальных переменных
  • Сохраняйте как можно больше функций. Он читается легче и прост в обслуживании. Некоторые люди говорят, что вы должны иметь возможность видеть всю функцию на вашем экране или, по крайней мере, то, что начало и конец фигурных скобок петель и структур в функции должны быть на вашем экране
  • Не доверяйте пользовательскому вводу!

Ответ 8

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

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

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

В целом, стоило бы вникать в хорошие методы ООП и использовать (и ПРОЧИТАТЬ О ПРОГРАММАХ) рамки - это очень практичный способ понять проблемы ООП.

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

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

Ответ 9

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

Ответ 10

Спасибо всем за ваши ответы. Здесь есть очень полезный материал.

У меня есть небольшая проблема с точки зрения пространств имен (а не с использованием подхода Path_To_ClassName), потому что для выполнения этой функции потребовалось много времени, и 5.3 alpha1 еще не готово к производству. Таким образом, все мы занимались тем, что работает в то же время. Лучше поздно, чем никогда.

Ясно, что на этот вопрос нет ни одного правильного ответа, но до сих пор я хочу проголосовать за все ответы (предполагая, что сайт позволяет мне).