Советы по проектированию включаемых файлов PHP-функций

StackOverflow https://stackoverflow.com/questions/602583

Вопрос

Хороший дизайн предполагает написание каждой функции только один раз.В PHP я делаю это, используя включаемые файлы (например, Utils.php и Authenticate.php) с помощью команды PHP include_once.Однако мне не удалось найти какие-либо стандарты или рекомендации для включаемых файлов PHP.Что бы вы посоветовали в StackOverflow?

Я ищу:

  • Стандарты именования
  • Стандарты кода
  • Шаблоны проектирования
  • Предложения по определению типов возврата общих функций (теперь я просто использую ассоциативные массивы).
Это было полезно?

Решение

Одно из соглашений, которое я предпочитаю использовать, — поместить каждый класс в отдельный файл с именем ClassName.class.php, а затем настроить автозагрузчик чтобы включить файлы классов.Или иногда я помещаю их все в подкаталогclasses/ и просто называю ClassName.php.Зависит от того, сколько классов против.неклассовые включает в себя, что я ожидаю.

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

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

Тот факт, что вас беспокоят условности, говорит о том, что вы уже на правильном пути.Если вы знакомы с любым другим языком ООП, таким как Java, C++, C# и т. д., вы обнаружите, что можете следовать многим из тех же соглашений благодаря ООП-совершенство в PHP5.

Другие советы

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

Некоторые такие стандарты уже написаны.Большинство крупных проектов будут следовать собственным стандартам.

Вот один из них, написанный Zend и являющийся стандартом, используемым в среде Zend.http://framework.zend.com/manual/en/coding-standard.html

Кроме того, в PEAR всегда были довольно строгие стандарты кодирования:http://pear.php.net/manual/en/standards.php

Однако мой предпочтительный ответ заключается в том, что для вашего собственного проекта вы должны использовать то, что вам удобно, и быть внутренне последовательными.Для других проектов следуйте их правилам.Согласованность обеспечивает максимальную читаемость кода.Мои собственные стандарты отличаются от стандартов PEAR.Я не делаю отступов в четыре пробела (я использую табуляцию) и никогда не использую верблюжий регистр, как имена функций, но, тем не менее, если я редактирую что-то из другого проекта, я буду использовать все, что делает этот проект.

Я сделал следующее.Во-первых, я создал перехватывающий фильтр для перехвата всех веб-запросов, а также создал версию, которая будет работать с командами командной строки.

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

Несколько советов по производительности, если они вам нужны: используйте одинарные кавычки при определении файла, поскольку они немного быстрее, поскольку не интерпретируются, также используйте require/include вместо их версий _once, это гарантированно запускается один раз, и первый немного быстрее.

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

Другой вариант — имя с разделителями, трюк с пространством псевдоимен.Это менее привлекательно, поскольку пространства имен появятся в версии 5.3, и я считаю, что это грубо, поскольку переименовывать их в базе кода будет менее увлекательно.В любом случае, вот как это работает: примите корень для всего вашего кода.Затем всем классам присваиваются имена на основе обхода каталога, необходимого для их попадания, и разделяются символом, например «_», а затем самим именем класса, однако файл будет назван в честь класса.Таким образом, местоположение класса кодируется в имени, и автозагрузчик может это использовать.Проблема с этим методом, помимо Real_long_crazy_class_names_MyClass, заключается в том, что при каждом вызове требуется довольно много обработки, но это может быть преждевременной оптимизацией, и снова появятся пространства имен.

например.

/code root
ClassA ClassA.php
  /subfolder
  subFolder_ClassB ClassB.php
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top