Какие полезные Идиомы 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 еще не готово к производству. Таким образом, все мы занимались тем, что работает в то же время. Лучше поздно, чем никогда.
Ясно, что на этот вопрос нет ни одного правильного ответа, но до сих пор я хочу проголосовать за все ответы (предполагая, что сайт позволяет мне).