Возможности/функции, которые делают ваше приложение более профессиональным? Кодирование хобби

Какие функции вы реализуете (как) в своих веб-приложениях PHP, потому что вы считаете это "более профессиональным" в некотором роде? Или у вас есть личные nitpicks и код hobbyhorses, в частности, мелочи, которые могут считаться? Какой неподдающийся код или незначительная функциональность вы тратите слишком много времени, чтобы получить право?

.

Пример кодирования hobbyhorses для Q & Иллюстрация:

Данные конфигурации не в базе данных: данные приложения!= данные конфигурации, которые также является вопросом необходимости и эффективности.

исправление URL. Нормализовать все веб-адреса, добавив конечную косую черту, даже если это технически не требуется.

Модифицированные для пользователя файлы cookie. Для обеспечения конфиденциальности данных я стараюсь избегать непрозрачных дескрипторов сеанса/базы данных (для пользовательских параметров, а не для использования авторизации).

Согласование контента: имеет смысл для простых вариантов между, например, RSS и Atom. Но я вижу, что это редко используется.

Нет идентификаторов базы данных в пользовательском интерфейсе. Избегайте утечки внутренних ключей суррогатной базы данных в URL-адреса. И с ORM db-внутренними ключами даже не пришлось течь в бизнес-логику.

.

Подсказки (не правила)

  • Итак, с какой функциональностью вы полагаете, что ваше веб-приложение выше среднего?
  • Почему это необычно?
  • Это приносит пользу пользователям, но также легко упускать из виду?
  • Более профессиональные и надежные предложения по кодированию очень много. Они всегда есть.
  • Но предполагаемая область этого Q & A - это действительно необычные/уникальные функции и, возможно, нестандартная и противоречивая функциональность. Большой бонус для увлекательных.
  • Это также о настройках кодирования и nitpicks, которые просто происходят в PHP.
  • Не думайте слишком большой или слишком высокий уровень. Малая функциональность тоже считается.
  • Показывать код, если это возможно.
  • Синтаксис и стиль кодирования/парадигмы, однако, в основном не соответствуют теме.
  • И не будем спорить о полезности или качестве кода. Это чисто фейтурит и обзор кода.

Первый раунд исследования футуритов. Трудно было решить одну из многих хороших идей. По правде говоря, я мог только сузить его до пяти фаворитов и оставить решение rand(). И тема определенно достаточно интересна, чтобы гарантировать вторую щедрость. После перерыва. И, возможно, кто-то еще возьмет на себя задачу уточнить область действия.

Ответ 1

Documentation.

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

Ответ 2

Уход за безопасностью, особенно конфиденциальных данных пользователя.

Храните пароли, используя сильный хеш, например bcrypt (см. crypt):

// generating hash
// read up how $costParameter and $salt look like in the crypt() docs
$hash = crypt($password, '$2a$' . $costParameter . '$' . $salt . '$');

// checking if password is correct
if (crypt($whatTheUserEntered, $hash) == $hash) {
    // correct password
}

$salt не должно быть статическим значением. Он должен отличаться для каждого пользователя.

Ответ 3

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

Ответ 4

A проверка работоспособности

Серия предварительно сконфигурированных тестов, которые определяют базовое "здоровье" веб-приложения или веб-сайта, которое может быть просмотрено (владельцем администратора/сайта) в любое время, показывая такие вещи, как:

  • Доступен ли сервер базы данных?
  • Доступны ли необходимые файлы и каталоги?
  • Являются ли все структуры данных разумными и полными?
  • Правильно ли отображаются все страницы/диалоги/запросы?
  • Достаточно ли свободного места на диске?
  • и т.д.. и т.д.

простая страница состояния показывает текущее "здоровье" системы с зеленым, оранжевым или красным фоном.

Это отличается от Unit Testing тем, что он касается здоровья среды "реального мира", а не абстрактной целостности кода.

Проверка работоспособности также упрощает перенос приложения на другой сервер.

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

Ответ 5

Контроль источника. В частности Git (хотя и не конкретно GitHub)

ОК, Это не редкость.
Но когда я передаю внешний код и возвращаю аккуратное репо, со всей историей и поворотами, я гораздо больше впечатлен, чем с папкой, полной php файлов.
И это показывает, сколько дополнительной работы было включено в проект, который не видел.

Я использую GitFlow, который занимает немного больше времени во время использования, но приносит себе в голову гораздо более впечатляющее в готовом проекте. Убедитесь, что клиент видит график github (или equiv.). Все эти ветки выглядят аккуратно и впечатляюще. (Кроме того, что это полезно!)

по теме:
Система отслеживания проблем.
Как до завершения кода (пока клиент просматривает), так и послесловия, чтобы позволить им добавлять новые задачи.
Это не только способ демаркации заданий и получения дополнительной работы, но и заставляет клиента чувствовать, что проект все еще в моем сознании. Хотя Ив двинулся дальше.
Я использую Collabtive, что абсолютно ужасно, поскольку эти системы идут, но более впечатляющий взгляд, чем все, что я пробовал. впечатляющие считаются профессиональными.

Ответ 6

Сила пароля/соответствие

Сообщать пользователю интерактивно о слабости своего пароля при регистрации или изменении. Также уведомляйте их, когда их подтверждение совпадает, когда они печатают.

Проверка в режиме реального времени

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

Оборонительное программирование с использованием дружественного исключения/обработки ошибок

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

Это идет рука об руку с твердой обработкой исключений и хорошим защитным программированием.

Defensive Design - довольно приличная книга по этой теме.

Ответ 7

Напиши код, который будет легко поддерживать в функции. Подумайте несколько раз об объектном интерфейсе, прежде чем начинать писать. Добавьте множество триггеров событий, даже если они вам не нужны прямо сейчас. Они могут быть полезны в этой функции.

Запись кода, как если бы это была внешняя библиотека. Даже если вы имеете дело с коммерческим закрытым выражением, рассматривайте его как проект с открытым исходным кодом. Подумайте о других пользователях, которые могут захотеть изменить поведение существующего кода, не изменяя его. Когда вы используете подсказку типа, вы должны, вероятно, проверить интерфейс скорее на класс, поэтому:

public function add(Storable $resource);    # Good
public function add(SessionStore $session); # Bad

Не используйте глобальное пространство имен и "глобальные функции". Определение глобальных констант или использование __autoload() (скорее, регистрация другого автозагрузчика с использованием spl_autoload_register()) является плохой практикой.

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

Создать документацию по API. Я не думаю, что вам нужно объяснение.

Сделайте код чистым и сохраните некоторые условные обозначения.

Не создавайте ненужные страницы. Нет ничего более раздражающего, чем страница 404 Not Found, и ничего больше, чем просто большая информация о 404 NOT FOUND. Вероятно, вам следует предоставить несколько не найденных страниц для каждого ресурса. Поэтому, если я посещаю /video/123/how-to-swim, и такой ресурс не существует, кроме того, мы сожалеем, что видео не существует или было удалено. добавьте что-то вроде: Недавние видео, Возможно, вы ищете: "как dace", "плавание: abc" (видео с заголовком, похожим на URL-адрес формы названия (How-to-swim)) и т.д.

Разрешить пользователям настраивать веб-сайт. Представьте, что у вас есть домашняя страница с несколькими "ящиками": последние видео, последние фотографии, последние активные темы, новости, расширенная галерея и т.д. Разрешите пользователям скрыть некоторые из них, изменить их порядок - кто-то может быть более заинтересован в фотографиях и видео, а не в новостях и потоках, чтобы он/она мог захотеть получить их в верхней части страницы, кто-то другой мог получить разные предпочтения и мог захотеть имеют другой порядок. Добавьте настройки для каждого окна, например: "display: 5, 10, 20 последних видео".

Ответ 8

Чтобы добавить еще несколько (ориентированных на PHP ориентиров) точек, которые улучшат как пользовательский интерфейс, так и сделают ваше приложение более профессиональным, но обрабатывают его:

Хорошее сжатие/минимизация
Часто веб-приложения отправляют большое количество запросов как при загрузке, так и в ходе их использования. Минимизация может помочь уменьшить начальный вес нагрузки, а также использование спрайтов CSS и содержимого GZipping. Отличный способ помочь вам упростить и сделать ваше приложение как можно быстрее - плагин Yahoo YSlow для Firefox Firebug Extension:

Firebug: http://getfirebug.com/

YSlow: http://developer.yahoo.com/yslow/

Кроме того, некоторые хорошие практики: http://developer.yahoo.com/performance/rules.html

YSlow поможет определить, как вы действительно можете сделать свое приложение аккуратным и аккуратным, быстрым и чистым. Я бы также рекомендовал PHP Minify позаботиться о значительной части сжатия файла, его очень способном инструменте:

PHP Minify: http://code.google.com/p/minify/

Плюс еще одна причина для получения Firebug - огромные преимущества, которые он приносит при разработке любого веб-приложения, не в последнюю очередь определяющего, насколько безопасно приложение, как во время работы, так как вы можете отслеживать созданные потоки данных.

Обфускация
--- отделить более подробный ответ ниже

Хорошее использование Apache rewrite
Помимо основных преимуществ обслуживания чистых URL-адресов для улучшения просмотра и получения впечатления от логически загруженного контента, хороший файл .htaccess может добавлять дополнительные уровни безопасности на ваш сайт, сжимать сервер содержимого и добавлять дополнительные идентификаторы (E- Метки к примеру, хотя их преимущество спорно). Каждое веб-приложение должно также иметь хорошо написанный .htaccess.

Совместимость/проверка
Я всегда настоятельно призывал любого разработчика пойти на самые обширные (разумные) длины, чтобы убедиться, что все их выходные коды являются Valid, Commented, Logical и Clean. W3C делает фантастическую работу по четкому описанию не только HTML, но и того, как Web Apps должны работать. Следуйте их указаниям, чтобы повысить совместимость всего, что вы пишете, чтобы он работал для всех, как вы его планируете.

Некоторые отличные инструменты:

HTML validator: http://validator.w3.org/

Другая проверка: http://validator.w3.org/unicorn/

Некоторые характеристики, о которых нужно знать:

Рабочая группа W3C Web Applications (WebApps): http://www.w3.org/2008/webapps/

Рекомендации по доступности W3C: http://www.w3.org/WAI/guid-tech.html

W3C WAI-ARIA инициатива: http://www.w3.org/WAI/intro/aria.php

На стороне Javascript JS lint - отличный инструмент для проверки того, что любые ошибки в вашей JS (которые могут не влиять на производительность при проверке) раздаются:

JSLint: http://www.jslint.com/

И по доверенности, чтобы помочь развитию, улучшенный JS может помочь вам лучше структурировать ваш код для разработки, предварительно уточнить: http://jsbeautifier.org/ p >

Или, конечно, украшенный PHP... http://beta.phpformatter.com/

Наконец-то немного меньше черно-белого
Гуманизация

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

Если вы думаете о таких проектах, как 37 Signals - один из привлекательных факторов, они придают пользователю ощущение, что сам проект (код) очеловечен и имеет характер, помогающий привлечь пользователя и связать его с приложение, поощряющее использование и передачу его другим. Я не имею в виду, что приложение кажется "живым", но более того, что он чувствует себя более "доступным", и пользователи могут "идентифицировать" его.

Однако это только одна сторона монеты гуманизации, стремление почти заставить пользователей "сопереживать" с помощью приложения/кода/рамки/опыта, поэтому они привлекаются к поощрению использовать его. Другая сторона - сломать границу между приложением и теми, кто стоит за ним.

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

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

Ответ 9

Нет принудительной регистрации
Это обычная проблема с повседневными веб-приложениями. Принудительные учетные записи не являются удобными для пользователя. В настоящее время это необходимо для предотвращения спама и неправильного использования. Но это мешает усыновлению.

Я думаю, все слышали о Stackoverflow. Они не форсируют регистрацию. Вы можете обманывать без учета. Вместо того, чтобы форсировать регистрацию, он систематически его поощряет. Главное, однако, быть, что есть, по крайней мере, возможность постепенно привыкать до совершения.

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

Ответ 10

Тот, который часто пропускается: Printable CSS. Его боль, чтобы писать, но имеет большое значение для пользователей, которые хотят получить распечатку некоторых данных в вашем приложении.

<link href="print.css" rel="stylesheet" type="text/css" media="print"> 

Ответ 11

Точки продолжения

Пример. Вы отправляете форму, вы перенаправляетесь, и теперь целевая страница должна содержать уведомления. Большинство сайтов просто сохраняют это уведомление в сеансе. Это означает, что любая страница, к которой будет осуществляться доступ, отобразит это сообщение. Нет проблем в большинстве случаев, но это действительно беспорядочно для меня. Я думаю, что сеанс предназначен для данных сеанса, а не для следующих данных запроса.

Мое решение: создайте массив, напишите в него данные (уведомления и, возможно, больше), сохраните их в memcache с помощью sessionid + уникальный идентификатор, а при перенаправлении добавьте параметр __continuation = {этот уникальный идентификатор}. Затем следующая страница снова загружает эти данные и обрабатывает их.

Это становится более удобным, если вы хотите иметь больше данных, чем просто короткое сообщение.

Вопросы?

Ответ 12

Согласованный стиль программирования, именование переменных, привязка и т.д. Соблюдение стандарта кодирования (любой стандарт кодирования). Убедитесь, что файл, написанный разными людьми, выглядит одинаково, так что для поддержания кода не требуется знать, кто его написал.

Ответ 13

Jus в качестве примера: исправление URL-адреса
Для http-URL-адресов я обрабатываю фрагменты пути обязательно, как и каждый браузер делает. Поэтому я делаю упор на "исправление" пользовательских данных и импортированных данных и всегда добавляю конечная косая черта, например. http://example.org перед отображением или сохранением таких значений. Вероятно, это не "профессиональный профессионализм", но нормализация URL-адресов часто упрощает с ними позже. И не знаю, это просто кажется "лучше".

 $url = preg_replace("/^(http:..[-\w.\d]+)$/", "$1/", $url);

Поэтому у меня всегда будет http://example.org/ в значениях, независимо от того, что. Это не делает ваш HTML более совместимым со стандартом, но это только один из моих домашних животных.

Ответ 14

Нет идентификаторов базы данных в интерфейсе пользователя
Большинство объектов базы данных перечислены с помощью некоторого суррогатного ключа. Что я думаю, выглядит неустойчивым (и иногда может быть угрозой безопасности) течет в пользовательский интерфейс, как в URL-адресах. Это не имеет большого значения, чтобы изменить любую зависимость user.php?id=37310843 до user.php?name=title. И для базы данных нет никакой разницы в поиске идентификаторов или имен. Так что не о SEO глупости, а о sprueely внешнем

  • С надлежащим ORM эти внутренние идентификаторы базы данных даже не должны были просачиваться в логику приложений.
  • Википедия: представьте, что они использовали суррогатные ключи вместо названий страниц. (см. CoWiki)
  • Для того, чтобы внешние ссылки всегда указывали на идентификационный контент, суррогатные ключи следует избегать. Если это достаточно важно, чтобы иметь точные распределения, тогда GUID должны использоваться в любом случае.

Ответ 15

Одна из важных вещей, которые ожидается в любом веб-приложении 2.0, -

  • Поиск - полнотекстовый поиск, поиск по ключевым словам, есть ли у вас автоматическое предложение или (один из самых последних) в реальном времени. Без этой функции я чувствую себя подавленным, когда я посещаю любой сайт (особенно сайты, которые закрыты для поисковых систем). Определенный должен быть для любого современного сайта 2.0 PHP или нет.
  • MVC Framework. Поскольку это связано с web-dev (не привязанным к PHP), Framework-View-Controller является обязательным. С чрезмерной базой кода и более быстрыми циклами итераций правильное структурирование является обязательным условием для предотвращения будущих проблем и непрослеживаемых ошибок.
  • AJAX - Мне нужно сказать об этом:) Это изменило способ, которым большинство из нас просматривают веб-сайты. AJAX позволяет веб-сайту отличную функцию.
  • Информация об отладке -. Это относится к случаю, когда приложение отключается. Как вы находите, что пошло не так? Вы ведете журналы? Можете ли вы отследить проблему до источника из журналов (часы после его появления)? Насколько подробно вы должны указывать журналы?
  • Миниатюрный Javascript и CSS - Сокращает время загрузки и делает сайт более быстрым, поэтому пользователь чувствует себя более комфортно во время просмотра сайта.
  • Кэширование - Снова значительно увеличивает воспринимаемое время отклика для пользователя, тем самым делая сайт более "профессиональным".

Ответ 16

Конгломерированное приложение

Спросите себя: если вы используете систему онлайн-торговли и поставщик платежных карт отправляется в автономный режим, не должны ли ваши клиенты просматривать ваши продукты и даже проверять использование разных вариантов оплаты?

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

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

Интеллектуальная защита от перегрузок

Скажем, что у вас есть часть администрирования в вашем приложении, в которой содержится довольно много информации о клиенте. Определенно, данные, которые вы не хотите, чтобы кто-то мог их взять. Даже если у вас есть хорошая соль и хорошие алгоритмы для хэширования ваших паролей, злое лицо все равно может выполнить атаку DOS/rainbow-table (грубая сила?) На ваши формы входа.

Первый вариант, очевидно, заключается в использовании автоматизированного программного обеспечения для выполнения этих атак и вторичных операций, делая это вручную, делая квалифицированные догадки пароля. Очень легко найти достаточную информацию о пользователе, чтобы угадать его или ее пароль, учитывая, сколько информации доступно там, просто используя Google. Кроме того, если вы живете в такой стране, как Швеция, вам не так много информации о том, что вы не можете узнать о человеке с одной телефонной связью с властями - номера социального страхования, имена партнеров, статус брака, дети имена, домашние животные и многое другое, что все объединяется как очень угаданные предположения о паролях для обычного пользователя.

Если бы у нас был взгляд на то, как обычные люди выбирают свои пароли, безопасность должна быть очень легко идти на компромисс. Конечно, мы могли бы устанавливать ограничения на пароли пользователей по длине, специальные символы и т.д., Но это не повлияло бы на ситуацию. Атаки грубой силы все еще могут быть сделаны.

Если пользователь пытается войти в систему и не выполняет свою вторую попытку с неизвестного IP-адреса, появляется ошибка recaptcha для предотвращения автоматического входа в систему. После неудачных попыток (n) учетная запись должна полностью заблокироваться и потребоваться повторная активация до того, как логин может быть выполнен.

Чтобы предотвратить автоматическую атаку от производительности, хорошей идеей, вероятно, было бы полное блокирование IP-адреса, который сделал (n) неудачные попытки входа в течение установленного промежутка времени, от доступа к странице входа, до тех пор, пока он снова не будет перезапущен вручную.

Ответ 17

WRT Конфигурировать не в базе данных, используйте memcache с, например, пятиминутным истечением срока действия. Более сложная опция - прикоснуться к странице "перезагрузить конфигурацию" всякий раз, когда изменяется конфиг; трюк заключается в том, чтобы убедиться, что вы касаетесь страницы на каждом экземпляре сервера приложений в ферме (именно поэтому я предпочитаю memcache).

Ответ 18

Функция delve в PHP позволяет:

$a = delve($array,'a.b.c.d','default'); // $a->b['c']->a
$b = delve($object,'a.b.c.d','default'); // $a->b['c']->a

Без этого вам придется делать болезненные иссеты, а пустые и контрольные данные проверят все кровопролитное время. Это, безусловно, самая любимая функция.

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

/**
 * Delve into an array or object to return the value of a set of keys
 * @version 1, December 24, 2009
 * @param mixed $holder
 * @param mixed $keys
 * @param mixed $default
 * @return mixed
 * @package balphp
 * @author Benjamin "balupton" Lupton <[email protected]> - {@link http://www.balupton.com/}
 * @copyright Copyright (c) 2009-2010, Benjamin Arthur Lupton - {@link http://www.balupton.com/}
 * @license http://www.gnu.org/licenses/agpl.html GNU Affero General Public License
 */
function delve ( $holder, $keys, $default = null) {
    # Prepare
    $result = null;
    $end = false;

    # Prepare Keys
    ensure_keys($keys, $holder);

    # Handle
    $key = array_shift($keys);
    if ( $key === null ) {
        # Reched the end of our key array, so holder must be what we want
        $result = $holder;
        $end = true;
    } else {
        switch ( gettype($holder) ) {
            case 'array':
                if ( array_key_exists($key, $holder) ) {
                    # We exist, so recurse
                    $result = delve($holder[$key], $keys, $default);
                } else {
                    $end = true;
                }
                break;

            case 'object':
                if (
                    /* Already accessible via normal object means */
                    isset($holder->$key)
                    /* Is Doctrine Record */
                    ||  (   ($holder instanceOf Doctrine_Record)
                            &&  ($holder->hasAccessor($key)
                                    ||  $holder->getTable()->hasField($key)
                                    ||  ($holder->hasRelation($key) && (!empty($holder->$key) || $holder->refreshRelated($key) /* < returns null, hence the OR and extra check > */ || isset($holder->$key)) ) // && $holder->$key->exists())
                                )
                        )
                    /* Is normal object */
                    ||  (   !($holder instanceOf Doctrine_Record)
                            &&  method_exists($holder, 'get')
                            &&  $holder->get($key) !== null
                        )
                ) {
                    # We exist, so recurse
                    $result = delve($holder->$key, $keys, $default);
                } else {
                    $end = true;
                }
                break;

            default:
                $end = true;
                break;
        }
    }

    # Check Default
    if ( $end && $result === null ) {
        $result = $default;
    }

    # Done
    return $result;
}

Полный файл (и библиотека) доступен здесь: http://github.com/balupton/balphp/blob/master/lib/core/functions/_arrays.funcs.php

Ответ 19

Автоматизированные модульные тесты

Важно, что важна страница здоровья. Как только мой код вырастет за 800 строк кода, я не могу вспомнить, что делал в строке 100, и я, скорее всего, сломаю его, не осознавая этого.

Ответ 20

Система реестра.

Я уже много раз говорил в отношении хранения объектов и проблем с областью, и наилучшим образом я знаю, что это происходит, используя класс Static/Abstract с геттерами и сеттерами, которые могут помочь вам переносить объекты вокруг вашего приложения и избавляя вас от необходимости изменять классы, чтобы вы могли специально импортировать объекты для использования.

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

Вот небольшой пример того, о чем я говорю:

abstract class Registry
{
    private static $objects = array();

    public static function set($name,$object)
    {
        self::$objects[$name] = $object;
    }

    public static function get($name)
    {
        return self::$objects[$name];
    }
}

глядя на простоту этого класса, нечего бояться, ничто не заставит вас изменить текущую структуру/приложение, чтобы принять этот метод, но если вы не знаете, как это работает, позвольте мне привести несколько примеров

Сначала давайте скажем, что у нас есть index.php, который включает startup.php и внутри startup.php, включая ваши библиотеки и базовый код ядра, но при загрузке вы загружаете следующие

  • База данных
  • Session
  • FileWriter
  • Ввод
  • Выход

теперь, если вы хотите использовать объект FileWriter в качестве инструмента для ведения журнала внутри объекта Database, у вас обычно будет переменная с именем $FileWriter, и вы бы использовали ключевое слово global в Database object

Но сделав следующее:

Registry::set('Database', new Database())
Registry::set('Session', new Session())
Registry::set('FileWriter', new FileWriter())
Registry::set('Input', new Input())
Registry::set('Output', new Output())

Сохранение всего содержимого объекта Registry позволяет взглянуть на наш объект/класс базы данных

class Database
{
    //..

    public function connect()
    {
        if(!$this->connected())
        {
            try
            {
                $this->connect();
            }catch(Exception $e)
            {
                Registry::get('FileWriter')->Write('db_logs',array($this,$e),'unable to connect to database');
            }
        }
    }

    //..
}

Теперь, когда вы можете видеть, что реестр доступен в рамках класса и его чистый, безопасный, вы не занимаетесь дополнительными переменными или не используете больше кодов с globalization, просто чистите простые и безопасные

Надеюсь, вам понравилось читать.

Ответ 21

Шифрование SSL/TLS всего сайта

Как показывает недавний выпуск Firesheep, тривиально красть файлы cookie сеанса в открытых средах WiFi (например, предлагаемые многими библиотеками, отели и другие объекты), а также все сегменты Ethernet без коммутации все еще работают. (Теоретически на переключаемых тоже)

Теперь, когда Firesheep делает операцию с двумя щелчками даже для среднего Джо, шифрование всего сайта уже не является чем-то, что нужно рассматривать как роскошь. (Наряду с настройкой безопасного флага на сессионных файлах cookie, чтобы гарантировать, что совместимые браузеры не будут случайно просачивать их в необеспеченные запросы) Ни, ни расширение или проблема не являются уходит.

Согласно блогу Адама Ланглы, Google обнаружил, что SSL/TLS не так плох, как люди склонны угадывать, и с небольшой настройкой (которые они используют в Chrome), даже компонент задержки для настройки соединения с дополнительными круглыми отключениями может быть эффективно устранен.

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

Ответ 22

Поддержка интернационализации/локали

Обеспечьте переводы приложений для разных языков и выполните соответствующий язык на основе пользовательских настроек локали.

Мобильная версия

Определите строку пользовательского агента и откройте мобильную/удобную для пользователя версию приложения. Это довольно легко сделать с помощью xhtml мобильных профилей.

Использовать ORM, поддерживающий несколько бэкэндов

Как разработчик, так и пользователь, приятно иметь возможность менять базы данных, редактируя файл конфигурации. Таким образом, вы можете запускать что-то вроде SQLite для использования dev/single-user и что-то вроде PostgreSQL или MySQL для производства.

(ненавязчивое) Уведомление, если Javascript отключен

Когда-либо было переполнение стека с выключенным или отключенным JS? Иногда я забываю, что noscript включен, и SO помогает мне. Тогда я могу принять решение о том, хочу ли я вернуть его обратно; но, по крайней мере, я знаю, что мне не хватает функциональности, а не просто думаю, что приложение хромает.

Запись журнала Firebug/Javascript

Предоставление большого количества журналов помогает отлаживать проблемы ajax. просто выполнение console.log(message) в javascript будет записывать сообщение в firebug. Имейте переключатель Production/Development в вашем конфигурационном файле приложения, который включает или выключает это (php не создает сообщения журнала в рабочем режиме)

Ответ 23

Я знаю, что это ужасный код, и он заслуживает того, чтобы его нивелировали. Просто хотел привести пример того, что Консолидация контента на самом деле легко достичь.

function q_order($src) {
    $src = str_replace(",", ";q=0.99,", "$src;last;q=0.975");   // inject placeholder values
    foreach (explode(",", $src) as $prt) {   // split entries
        $q[trim(substr($prt, 0, strpos($prt, ";")))]   // append TOKEN until ";" 
        = floatval(substr($prt, strpos($prt, "q=") + 2));  // and first float after "q="
    }  
   arsort($q);
   return($q);
}   

Это позволяет быстро сортировать заголовки HTTP_ACCEPT, что полезно для автоматического чередования форматов RSS и Atom. Или просто для установки языка по умолчанию. (В любом случае вам понадобятся языковые флаги/ссылки, но это лучший дефолт, чем просто отказ от английского.)

$lang = q_order($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
if ($lang["de"] >= $lang["en"]) { ...

Ответ 24

Данные конфигурации не в базе данных: данные приложения относятся к базе данных. Но настроек конфигурации нет. Почему?

  • Невозможно запросить базу данных для параметров времени выполнения для каждого запроса PHP.
  • Настройки не меняются ежедневно, для большинства случаев использования достаточно статического хранилища.
  • Несоответствие между файлом конфигурации базы данных, но с остальными параметрами времени выполнения в базе данных кажется глупым.
  • IMO это часто делается из-за ленивости, потому что безопасная настройка и изменение файла (ini) хранилища более вовлекает, чем просто другая таблица SQL.
  • В качестве исключения пользовательские настройки и конфигурации для каждого домена неуправляемы без хранилища базы данных.

В то время как редко требуется на практике, я действительно хочу, чтобы мои пользователи могли редактировать конфигурацию времени выполнения (один раз в год). Таким образом, я трачу больше времени на функции изменения файла конфигурации, чем это требуется в базе данных. Плюсы: упрощение резервного копирования и управления версиями, чем с таблицей конфигурации SQL.

Против. Если доступ/архивирование/управление версиями не является проблемой, то SQL создает хорошее хранилище конфигураций в сочетании с APC или memcached (для эффективного доступа). Кэш файлы также являются возможным решением.

Ответ 25

У вас есть персональные nitpicks и код хобби, особенно мелкие вещи это может считаться? Какой неподтвержденный кода или незначительной функциональности потратить чрезмерное количество времени на чтобы получить право?

Правильно ссылающиеся клавиши массива

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

$array['key'];

НЕ

$array[key];

Требовать/включать один раз

Всегда спрашивайте себя, почему вы используете require_once и include_once. В большинстве случаев, чтобы предотвратить дублирование кода, который вы можете или не могли бы уже вытащить, если это возможно, действительно ли вы написали свой PHP наиболее эффективным и эффективным способом?

Буферный выход для чистой загрузки и улучшения скорости

Добавление:

ob_start('ob_gzhandler'); 

К началу скриптов и:

ob_end_flush();

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

Предопределенные циклы

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

for($=0;$i<count($x);$i++){
// code
}

Это означает, что функция count запускается каждый раз, когда петли кода неэффективны. Гораздо лучше сделать следующее:

$stop=count($x);
for($=0;$i<$stop);$i++){
// code
}

RegEx vs PHP String/числовые обработчики

Уменьшите зависимость от RegEx, если вы обрабатываете строки, и есть PHP-эквивалент, stripos, strncasecmp и strpbrk быстрее. strtr быстрее, чем preg_replace примерно на 5x. ctype_alnum, ctype_alpha и ctype_digit могут использоваться для подтверждения проверки вместо RegExp.

Очистить рабочее пространство

Всегда закрывайте соединения с БД, когда закончите с ними, и всегда отключите свои переменные. Его хорошая, если перфекционистская, практика.

Согласованное использование цитат

Используйте одиночные и двойные кавычки СОГЛАСНО. то есть, если вы используете:

echo "this is a 'string' not a number";

Не используйте затем:

echo 'this is a "string" not a number';

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

echo "this and $thisvariable here";
// instead of
echo 'this and '.$thisvariable.' here';

Ответ 26

Автоматические постоянные ссылки

С помощью этой функции любой может установить ее как ссылку на ссылку href, и она автоматически получит URL-адрес страницы для простой пермалляции.

//Gets the URL of the current page
//set $p to yes to echo the urlturn the url or no to re
function page_url($p)
{
    $s = empty($_SERVER["HTTPS"]) ? ''
        : ($_SERVER["HTTPS"] == "on") ? "s"
        : "";
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
    $port = ($_SERVER["SERVER_PORT"] == "80") ? ""
        : (":".$_SERVER["SERVER_PORT"]);
    switch ($p)
        {
        case 'yes':
            echo ($protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI']);
            break;
        case 'no':
            return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
            break;
        default:
            echo('javascript:alert(\'invalid Argument in function page_url($p)\')');
        }
}
function strleft($s1, $s2)
{
    return substr($s1, 0, strpos($s1, $s2));
}

Ответ 27

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

Идентификаторы сеансов также часто являются cookie файлами, но не обрабатываются человеком и непрозрачными дескрипторами хранения. Поэтому вместо этого, если это простые пользовательские предпочтения (а не материалы для авторизации), мне нравится отправлять читаемые имена и значения файлов cookie, например. product_order=desc или fav_background=orange.

Обычно я тоже прибегаю к занятиям. Но для личных проектов, где я забочусь о конфиденциальности данных (что означает права пользователя), я терпел все недостатки:

  • Дополнительные расходы на микроуправление для нескольких файлов cookie.
  • Проверка достоверности каждого файла cookie отдельно, поскольку все это становится пользовательским вводом.
  • Возможно, потребуется определить дополнительный файл cookie истечения срока действия или иначе случайное обновление. (Из-за того, что я нахожу 2038 дней истечения срока действия cookie аналогично диссоциальным и использую только соответствующие времена.)
  • Нельзя использовать для каких-либо разрешений, связанных с авторизацией, а просто для пользователей и параметров отображения.
  • Я считаю важным распознать семантическую разницу между реальными куки файлами и кукисами сеансов. Но важно ли здесь заботиться, если вряд ли кто-нибудь это увидит?

Тем не менее, мой мозг конфиденциальности данных остается счастливым. И для некоторых вариантов использования это простой вопрос.

Ответ 28

Тестируемость

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

читаемость

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

for ( $i=0; $i < count($myList); $i++)  // obviously an index
foreach ( $k as $a => $b ) // wtf?
foreach ( $definitions as $word => $definition ) // better

Ответ 29

Обфускация (расширенный комментарий)

Это будет распространяться на комментарий, который я сделал ранее, который привлек ряд комментариев от пользователей, желающих узнать больше. Таким образом, я разделил его на предыдущий ответ.

Большое количество веб-приложений основано на Javascript (ориентировано), и поэтому способность к обратному проектированию огромна, так как клиент имеет доступ к действительно важной части кода, которая обычно обрабатывает пользовательский интерфейс и направляет бэкэнд в большинстве его задач. В какой-то момент script, скорее всего, будет обрабатывать или запускать трафик, содержащий большую часть данных, с которыми имеет дело приложение, и, как таковой, легко выявить большую часть базовой структуры более широкого приложения. Часто упускается из виду технику защиты вашего собственного IP-адреса, чтобы запутать код, скрывая истинную цель переменных, функций и объектов, которые вы написали.

Обфускация - это метод, используемый для усложнять код. Обфускация делает код сложнее понять, когда он скомпилирован, но обычно он не имеет влияют на функциональность код. Программы обфускации можно использовать для защиты программ Java путем им сложнее перепроектировать.

Обфускация: http://en.wikipedia.org/wiki/Obfuscated_code

Использование PHP для обмана вашего Javascript (JS) относительно просто, вы можете просто создать индекс терминов для замены, использовать PHP, чтобы открыть script заменить эти термины их обфускамированными аналогами и записать результат.

Обфускационный код "на лету" в PHP также прост, хотя и создает некоторую задержку (в зависимости от размера ваших файлов/индекса). Обфускация вашего JS "на лету" означает изменение значений между посещениями/просмотрами страниц, добавление дополнительного уровня шума, поскольку базовый код меняется каждый раз, когда страница загружается.

Чтобы проиллюстрировать, как можно ввести обфускацию в свое приложение, я рассмотрю одну возможную реализацию, в ней используется отличный отличный PHP script, PHP Minify, который предлагает дополнительные преимущества, которые будут объяснены.

Скажем, у нас есть 3 файла Javascript, JS1, JS2 и JS3. Эти скрипты должны отображаться в порядке 1, 2, 3 и в настоящее время связаны друг с другом в заголовке основного HTML файла (или PHP), который доставляет наше приложение пользователю. JS1 и JS2 находятся вне границ внешних фреймворков, таких как (например, jQuery и Prototype) (игнорируйте тот факт, что у вас, вероятно, не было бы и в вашем приложении). JS3 - это ВАШ javascript, где вы используете функциональность в JS1 и JS2, используя свои собственные функции, переменные, объекты, классы и т.д. Это ваша интеллектуальная собственность (IP) и/или должна быть запутана для юридических, финансовых или эгоистичных (!) Причин.

Очевидно, что нам не полезно запутывать наш JS, а затем развивать его дальше. Есть причина, по которой мы называем наши функции такими, как "function_to_save_secret_info", это упрощает, когда мы пишем наш код (хотя это подчеркивает, почему можно захотеть запутать). Таким образом, идеальным было бы сохранить наш JS файл, который мы разрабатываем, с общим названием имен, тогда каждый раз, когда пользователь запрашивает главную страницу HTML/PHP, запутанная версия этого создается на лету и обслуживается. Но как мы это делаем?

Один из лучших способов - использование PHP Minify (http://code.google.com/p/minify/). У PHP Minify есть ряд преимуществ. Одна из них - возможность группировать и обслуживать скрипты как единый пакет. Таким образом, вместо того, чтобы связываться с JS1, JS2 и JS3 в нашем заголовке, мы используем PHP Minify для настройки группы, которая состоит из этих трех, мы связываемся с этой группой в заголовке, поэтому имеем только одну ссылку. К преимуществам этого относятся:

  • Меньше запросов HTTP, более быстрая загрузка и лучшее кэширование (один не третий)
  • PHP Minify автоматически YUI сжимает скрипты внутри групп, делая время загрузки намного быстрее (также тип обфускации на своем пути)
  • Простое управление нашими JS, изменяющими группами - это легкий ветерок.
  • Меньше прямых, чтобы проверить наш код.

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

Однако теперь мы можем построить нашу процедуру обфускации для JS3. В groupConfig.php script, где мы определяем наши группы script в PHP Minify, мы меняем группу, заменяя JS3.js на JS3.obfuscated.js. Однако у нас все еще есть простая английская версия JS3.js, JS3.obfuscated.js не существует.

Таким образом, в основном наша главная/главная страница HTML/PHP ссылается на нашу группу JS в ее заголовке, которая является ссылкой на PHP Minify, где группа определяется как:

JS1.js
JS2.js
JS3.obfuscated.js

Теперь нам нужно создать таблицу/функцию ключа, чтобы обмануть JS3 и вывести JS3.obfuscated.js. На самом простом уровне мы пишем PHP, который содержит следующее (например, это не лучший код):

$terms_to_obfuscate=array(
   'my_secret_function',
   'my_secret_object',
   'my_secret_variable'
)

foreach ($terms_to_obfuscate as $key => $value) {
   //replace base64_encode(md5(rand(0,999))) with whatever you want to produce an obfuscated term
   $obfuscated_terms[]=base64_encode(md5(rand(0,999)));
}

$source_js=file_get_contents('JS3.js');
$fh = fopen('JS3.obfuscated.js', 'w+') or die("can't open file");
$obfuscated_js = str_replace($terms_to_obfuscate, $obfuscated_terms, $source_js);
fwrite($fh, $obfuscated_js);
fclose($fh);

Что этот script будет делать, это открывает нашу версию на английском языке JS3, ищите термины, которые мы хотим запутать и заменить рандомизированным контентом, записывая вывод в JS3.obfuscated.js. Если мы поместим этот код над определением группы в PHP Minify, он будет запускаться каждый раз, когда вызывается группа JS... поэтому каждый раз, когда основная страница HTML/PHP для нашего приложения загружается, наш script случайным образом запутывается. Обратите внимание, что это не лучшая реализация во всех случаях, это только иллюстрация.

Это всего лишь один из возможных способов выполнения обфускации, но то, что мы сейчас имеем, это сжатый JS, который быстрее обслуживается нашими пользователями, случайно запутывается, и мы все еще можем развить наш script в "простой английский". Все, что нам нужно сделать, - это обновить наш список терминов для обфускации. Есть лучшие способы сделать это, это означает только как иллюстрацию, а не определенную из общих идей, лежащих в основе концепции.

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

Ответ 30

Human-UNREADABLE и очень безопасные файлы cookie сеанса

Я считаю, что общедоступные файлы cookie, когда они относятся к вещам сессии (то есть к автологу), представляют собой угрозу безопасности. Из опыта работы с PHP-Nuke, который был полным (лет назад, вокруг версии 7) админов входа администратора, я стал шифровать файлы cookie. Кроме того, поскольку файлы cookie почти все передаются в ясном виде, я стал связывать их с IP или лучше подсеть.

I18n, l10n

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

Поддержка Theming

Веб-приложение выглядит очень профессионально для моих глаз, если пользователь может менять тему во время просмотра. Theming означает не только CSS, но и все графики (значки, кнопки), которые должны быть изменены, не касаясь ядра. Когда я писал phpMyBitTorrent до версии 1.2, я уделял много внимания тематике, что, к сожалению, привело к тому, разные цвета/шрифты/изображения. Тема нового поколения templating, поэтому вы можете полностью изменить внешний вид своего веб-сайта. Я считаю, что вам проще создавать шаблоны своего сайта, когда вы используете шаблон MVC.

Поддержка кросс-баз данных

Или, лучше, DB idependence. Мне не нравится явное вызов mysql_query() в моем коде. Я предпочитаю запускать запросы на уровне абстракции, что позволяет мне изменять СУБД (например, SQLite или Oracle) без перезаписи кода основных компонентов.

Logging

Ведение журнала - лучший способ облегчить отладку и собрать полезную информацию для FFDA (анализ данных о сбоях в полевых условиях). Apache log4php делает трюк, но вы должны правильно обрабатывать свой код с помощью соответствующих протоколов ведения журнала, чтобы получить полезную информацию. Многие академические исследования показывают, что разработчики никогда не достигают адекватного уровня регистрации: они регистрируются слишком много или недостаточно, и часто ошибки остаются неясными из-за отсутствия или неясных протоколирующих сообщений. К сожалению, журналы со временем становятся жирными, поэтому вы должны иметь возможность хранить только те записи, которые могут помочь вам найти проблемы с вашими приложениями. Журналы также могут использоваться для служебных целей, но никогда не забывайте, что вводятся служебные данные. Наконец, мой текущий тезис о старших классах - это научно доказанный набор правил ведения журналов, которые подходят для FFDA в сложных приложениях, на которые должен обратить внимание каждый разработчик.

ОРМ

Ну, этот последний момент больше связан с поддержкой кросс-баз данных. Честно говоря, я стал использовать NHibernate ORM, когда я отказался от PHP для ASP.NET. Если бы мне пришлось возобновить PHP, я бы сначала нашел подходящую ORM, чтобы избежать запросов в моем коде.

Это мои умные идеи