Статические функции-члены класса - противопоказания ?

KElena

Новичок
Статические функции-члены класса - противопоказания ?

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

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

lucas

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

А-ля:
PHP:
$object = & foobar :: get() ;
$object -> buzz() ;
Или более жизненно (в db :: query):
PHP:
$result = mysql_query($query,db_connection :: get()) ;
 

KElena

Новичок
lucas
Да , я знакома с этим паттерном.

но вопрос не в том - есть ли какие-либо минусы в использовании статических функций ?
 

lucas

Guest
Минусы в каком смысле: в отношении произодительности или идеологии ООП?

В первом -- нет, во втором -- Тони уже сказал :).
 

KElena

Новичок
lucas
в большей степени интересует идеология

но производительность тоже
 

lucas

Guest
1. Производительность.

В PHP вызов метода класса почти ничем по стоимости не отличается от вызова функции. Оценки отличий разнятся, но они не больше 5-10%.

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

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


2. Идеология.

Понятен приведенный пример: создать объект и выполнить действие над ним внутри статического метода.

Это очень удобно, например, для добавления записи в лог: log_file :: append(LOG_REASON_EXCEPTION,$data) -- и все. Метод сам создаст объект лог-файла, передаст ему данные, а там это уже не наше дело, как запись добавится в файл. :)

Так что, я считаю, здесь все лежит на совести разработчика -- явно работать с объектом или "маскировать" это в опр. случаях. Я стою за второй вариант.
 

su1d

Старожил PHPClubа
KElena, вполне нормальный и приемлемый способ, когда, например, используешь разные Стратегии для решения похожих задач. я что-то подобное делаю у себя в DB-layer'е, и особо на косяки ещё не натыкался.
 

Screjet

Новичок
Статический метод удобен тогда, когда новому(дочерному) объекту нужно влиять/иметь доступ к свойствам и методам родителя. Еще удобен, когда результатом обработки может быть false например.

А вот когда есть публичные методы/свойства, однозначно нужно создавать объект. В этом случае статический метод, возвращающий объект = (имхо) просто лишний код.
 
Сверху