Вызов функции класса. Преимущества и не достатки object::function?

Interprize

Guest
Вызов функции класса. Преимущества и не достатки object::function?

Доброго времени суток Аll
Возник следующий вопрос теоретического плана.
РНР позволяет обращатся к аттрибутам и функциям класса следующим образом:
PHP:
$object->function()
или
PHP:
object::function()
В первом случае обращение к созданному экземпляру, во втором конкретно к этой функции не создавая экземпляр класса (если я не прав буду признателен, если поправите)

Вопрос в следующем. Насколько накладно для системы второй вариант вызова. Например есть класс (типа funct) с основными функциями, из процедуры другого класса (к примеру constr) мы вызываем функцию класса funct при этом эта функция независит от аттрибутов класса, а выполняет например обработку переданного запроса. Как лучше поступать объявлять в функции класса constr экземпляр класса funct как глобальный или можно обойтись вызовом funct::function() ?


Заранее признателен за ответ ;)
 

SiMM

Новичок
Для нестатических функций второй способ вызова не имеет смысла. А беллетристику про "накладность" можешь забыть - выбор того или иного зависит от решаемых задач.
 

svetasmirnova

маленький монстрик
Посчитай ;)
А выбирать какой из методов использовать стоит по совокупности признаков, причём скорость работы на последнем месте. И ответь на вопрос, pls, PHP какой версии?
 

Interprize

Guest
2 SiMM
Спс за ответ, особенно за беллетристику

2 svetasmirnova
Опытный путь он конечно самый верный, я просто думал, есть ли по этому поводу какие либо наблюдения по поводу движка, в доках ничего по этому поводу не нашел.
Можно список признаков в вашей редакции в студию ;)
PHP 4.3.4RC1
 

svetasmirnova

маленький монстрик
>Можно список признаков в вашей редакции в студиюРецептов таких однозначных нет. В основном надо понимать следующее. Статические методы не могут работать с динамическими свойствами и методами объекта. Т.е. в них не позволен синтаксис $this->bar, $this->foo().
>PHP 4.3.4RC1
Ещё один сюрприз: если PHP5 выдаст parse error при попытке использования $this в методе, объявленном как static, 4 до последнего будет думать, что метод динамический.
>Опытный путь он конечно самый верный
Я когда-то задалась таким вопросом. За результатом: в поиск по форуму. Но там заморачиваться не стоит: статические методы много для чего полезного сгодятся =)
 

ForJest

- свежая кровь
$object->function() обеспчивает большую гибкость чем
class::function().
Почему?
1. $object можно передать в качестве параметра
2. $object можно создать любого класса - использование функциональности не изменится
3. class::function обычно используется для singleton-ов. Новички в ООП же часто используют его как замену для "библиотек".
Более подробное описание смотри в материалах конференции (в последнем номере PHPInside)
Доклад: "Влияние TDD на дизайн кода".
 

svetasmirnova

маленький монстрик
>class::function обычно используется для singleton-ов.
А причём здесь singleton-ы? Для другого class::function не используется? :confused:
 

ForJest

- свежая кровь
svetasmirnova
Я написал после точки ещё одно предложение :)
Если у тебя есть полезная информация или ты знаешь список возможных оправданных примемений статических методов - изложи и тогда мы можем обсудить. А так мне нечего тебе ответить :)
Или я всё же попытаюсь дать ответ.
> А причём здесь singleton-ы?
singleton'ы здесь к слову
> Для другого class::function не используется?
Уточни - кем? Или где? Если кем - тебе нужно спрашивать у конкретного человека. Если где - то конкретный проект. Я не могу отвечать всех программистов и все проекты - я делюсь своими знаниями и опытом :)
 

svetasmirnova

маленький монстрик
Если у тебя есть полезная информация или ты знаешь список возможных оправданных примемений статических методов - изложи и тогда мы можем обсудить.
Ты знаешь, я использую статические методы не по списку, а по необходимости. Поэтому приведу только один пример: паттерн фабрика. Если настаиваешь: ещё найду =)
>Уточни - кем? Или где?
Ну хотя бы здесь: http://phpclub.ru/talk/showthread.php?s=&threadid=70435&rand=15
 

ForJest

- свежая кровь
Да - найди пожалуйста :). Чтобы обсудить оправданность или не оправданность :)
http://phpclub.ru/talk/showthread.php?postid=417239#post417239
Тут ты утверждаешь что фабрика это тоже синглтон :).
Ну и уточни пожалуйста что такое паттерн Фабрика. Ты имеешь ввиду Abstract Factory?
 

svetasmirnova

маленький монстрик
Причём тут та тема? В той теме фабрика была синглтоном. Но это лишь одно из многих решений.
Да, Abstract Factory.
Статические методы могут применяться для изменения статических свойств объекта. (Они могут быть НЕ скалярными и/или такими, для которых простое присвоение Class::$propery = xxx; не пойдёт. В том числе закрытыми.) Ещё примеры?
 

ForJest

- свежая кровь
Окей. Давай попорядку.
Для чего в шаблоне Abstract Factory можно использовать статические методы? Явно не для создание экземпляров объектов.
Т.к. экземпляры создаются с помощью ConreteFactory, которая является наследником от.
И значит конструкция AbstractFActory::createProduct просто лишена смысла в пределах данного шаблона :)
т.к.
$factory->createProduct. Класс объекта factory нам неизвестен. Экземляр создаётся с помощью объекта, а не вызова статического метода.
Объект фабрики создаётся на основании настроек системы, её текущих потребностей.
---------------------------------
Либо я не понял где использовать в этом шаблоне статический метод :).

А вот зачем нужны статические свойста в объекте? Для реализации каких задач? Я предлагаю не говорить о неких абстрактных возможностях, а говорить о конкретной пользе, которую может приносить использование статических методов.
Пока что я знаю всего одно удачное применение - это singleton. Это способ создать "суперглобальный" инстанс и получать его отовсюду, где захочется. Т.е. по сути адекватная замена
function method1()
{
global $MagicObject;
}
Удобство вполне конкретное - не нужно "таскать" объект по всей иерархии делегирования/обработки событий. Можно на самом нижнем уровне безболезненно и контроллируемо получить нужны инстанс объекта - допустим тот же коннекшин к БД.
Разумный компромисс между "магией" и удобством :).
 

syfisher

TDD infected!!
Браво ForJest. Статические методы - это ЗЛО. Их нужно гасить. Синглтоны тоже нужно гасить :) . Статические методы применяем только для кода, который не имеет внешних зависимостей. Никаких. И только так. Точка. (получилось в твоем стиле? ;) )
 

ForJest

- свежая кровь
syfisher
/me ракланялся :)
Угу :). Ну я в принципе воспринял идеи из доклада - (за который вечное спасибо) и подумал чуток :). Синглтоны гасить да :). Вернёмся к магии на новом высокотехнологичном уровне :)
вместо
PHP:
function method1()
{
     global $MagicArray;
     $MagicArray['customer']['session']-> do_something();
}
Будем пользовать
PHP:
function method1()
{
     $MagicObject = &MagicWell::getInstance();
     $CustomerFactory = &$MagicObject-> get_customer_factory();
     $session = &$CustomerFactory-> get_session();
     $session-> do_something();
}
Плюсы - очевидны. Компилятор нам работать и жить помогает :). Ну хотя я ещё плохо понимаю промышленную магию :).
 

syfisher

TDD infected!!
Я или Павел сделаем пост в ближайшее время, как можно расширять твой MagicWell очень интересным способом. Чуток терпения :).

Кстати, MagicWell это пример паттерна Service Locator. Так что людителям - дигг диппер плиз.
 

svetasmirnova

маленький монстрик
Чуток я погорячилась с абстрактной фабрикой. Но я не считаю, что надо всегда на неё завязываться и отказываться от ConreteFactory. Взять хотя бы фабрику Primitive из проекта onPHP, на который я давала ссылку: зачем там AbstractFactory?
Далее. Объект коннекта базы данных может быть статическим свойством у нескольких объектов, которые его используют? Если сделать его синглтоном, мы не сможем использовать несколько баз в одном приложении.
Не говоря уже об элементарных вещах типа массивов общих свойств.
Ещё?

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

ForJest

- свежая кровь
svetasmirnova
Если у тебя есть полезная информация или ты знаешь список возможных оправданных примемений статических методов
Я не оперирую "лучше" или "плохо". Я говорю об оправданном или не оправданном примении статических методов.
Пока что я пользуюсь простым правилом
- Если я не знаю сделать ли его статическим - не делать его статическим
- Если я вижу статический метод - попытаться от него избавиться.
Я не собираюсь ограничивать или не ограничивать - я просто хотел обсудить оправданность применения. Конкретных примеров/обоснований использования я пока не вижу :).
------------------------------------------
> Взять хотя бы фабрику Primitive из проекта onPHP
Так что такое "фабрика"? :).
> Объект коннекта базы данных может быть статическим свойством у нескольких объектов, которые его используют? Если сделать его синглтоном, мы не сможем использовать несколько баз в одном приложении.

Если есть несколько баз данных, то это уже коллекция объектов. Если используется единый интерфейс - можно применить Proxy. Или ещё какой паттерн.
Я говорю только об одном. Вызов
class:method намертво привязывает к имени класса, что просто уничтожает преимущества ООП. Меньшим злом будет
просто method - нет никакой необходимости пихать в класс этот функционал.
Если ты не читала доклад "Влияние TDD на дизайн кода", то я настоятельно тебе советую это сделать.
------------------------
> Не говоря уже об элементарных вещах типа массивов общих свойств.
Можно подробнее про эти элементарные вещи? Я не пользуюсь "массивом общих свойств" в своей практике и с радостью готов услышать нечто новое.
 
Сверху