2009-08-22 2 views
34

Выполнение некоторых обзоров кода в последнее время я столкнулся с рядом классов, которые имеют значительное количество статических методов в них ... и я не понимаю, почему? Отсюда мой вопрос:Когда использовать статический модификатор в PHP

Каковы наилучшие практики использования статических методов в PHP?

Когда вы хотите использовать их и когда их не следует использовать?

Какова конкретная разница в том, как runtime обрабатывает статические методы? Они влияют на производительность или объем памяти?

+1

Никто до сих пор не ответил на последний вопрос - «Они влияют на производительность или память?» В Java на Static обычно не рекомендуется. Не уверен, что это также верно для интерпретации языка, такого как PHP. – powerboy

+0

, если вы выполняете OOP (как вы отметили), то никогда: http://stackoverflow.com/questions/5167660/static-method-get-is-this-bad-practice/23386464#23386464 –

ответ

23

Делая некоторые проверки кода в последнее время я наткнулся на несколько классов, которые имеют значительное количество статических методов в них ... и я не могу понять, почему

PHP не было пространства имен до 5.3, поэтому все функции/переменные будут в глобальной области, если они не принадлежат к некоторому классу. Включение их в класс в качестве статических элементов является обходным путем для отсутствия пространств имен (и, вероятно, поэтому вы видели их в «значительном» числе)

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

+2

Организация связанных функций как статика в классах также исследует мощную функцию на PHP: способность автоматически загружать классы по требованию. Если вы можете написать свой код, не заботясь о том, чтобы сделать правильный выбор, и без необходимости включать что-то, что вы не всегда можете использовать. Вы просто вызываете свой статический метод, а '__autoload()' делает свою магию. Чистое, оптимизированное и функциональное кодирование. Даже пространства имён пока не получили. – Havenard

1

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

5

Статические методы используются для

  • функций, которые связаны с целой коллекцией объектов данного класса (например, singleton pattern)
  • функции, которые не относятся ни к чему, но должны поставить ее под класс из-за OO (например, служебные классы)
4

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

Итак, используйте его всякий раз, когда вас интересуют эти свойства функции.

3

Нет ничего особенного в PHP, касающемся использования статических методов.

Статические методы могут быть вызваны непосредственно на класс - нет необходимости в экземпляре объекта.

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

Общим примером может служить пользовательский метод сравнения, который может быть передан, скажем, функции uasort() для сортировки массива объектов типа класса.

5

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

ПОЯСНЕНИЯ: Там, кажется, много недоразумений по этому вопросу. Отсутствие инъекции зависимостей является реальной проблемой. Прямо вызов статических методов просто является одним из наиболее распространенных способов попадания в эту ловушку.

+3

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

+1

Вы не рассматривали суть обеих ссылок - * зависимости *. Возможность переопределения зависящих от них функций имеет решающее значение для тестирования. Справедливости ради, * возможно * сделать это со статическими функциями (например, используя зависимости функций в качестве параметров). Тем не менее, идиоматическим решением в PHP является использование нестатической функции, которая может быть переопределена подклассом. Подробнее см. Http://kunststube.net/static/. –

+1

Правильно написанные статические функции * не имеют никаких зависимостей *, за исключением того, что передается непосредственно в функцию. Проверьте функцию, убедитесь, что она имеет ожидаемое поведение, а затем используйте ее во всех других тестах как есть. Примеры, приведенные в вашей ссылке, являются неправильным использованием, так как вызов функций более одного раза может давать разные результаты каждый раз. Я не знаю; Я просто не вижу преимущества использования методов 'static' таким образом. –

2

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

+0

Можете ли вы добавить ссылку, что они предлагают лучшую производительность? – Justin

Смежные вопросы