Apple, речь идёт не о статических классах в полном смысле этого слова, а о классах, обладающих статическими свойствами. У меня это самые ходовые инструменты. Глобальны по праву рождения, это да. Если понимать в том контексте, в котором я это описал, то по удобству доступа им нет равных. PS: Я сторонник того стиля программирования, который оправдан в конкретной ситуации. Но глубоко уважаю программистов функционального стиля. Кто понял о чём, тот, наверняка, согласится со мной.
Слушайте, а код функции внутри класса действительно выполняется каждый раз заново, при обащении к свойству объекта, который с этой функцией сопоставлен? Что-то это фигня какая-то, мне кажется... Неужели разработчики PHP не предусмотрели способа, при котором функция внутри класса определяла бы значение ключа всего раз - при первом обращении к ней?
код функции внутри класса находится в методах. если их вызывать, то код действительно выполняется каждый раз заново. КО. с этого места поподробнее. если мы говорим про геттеры и сеттеры, то просто погуглите "геттеры и сеттеры в php" мне тоже так кажется функция внутри класса - это метод, будем называть вещи своими именами. я считаю, что это верно не знать в каком состоянии находится объект класса, если вы об этом не заботитесь. яркий пример. у меня есть объект класса, с которым я что-то делаю. выработав свою часть работы я пересылаю это объект в сериализированном виде вам на сервер, где работу с ним продолжаете вы. если контролем состояния объекта занимался бы php, то при сериализации необходимо было бы использовать макрер контроля состояния - который прозрачен и отлично подходит для правки руками. черевата такая конструкция новыми инжектами - класс-стэйт инжекты) звучит неплохо. что по делу - напишите костылик. все костылируют, это не стыдно =)
Вот так вот сторнников ОПП поставили в тупик Не кто не может привести толкового наглядного примера с ОПП... который бы явно демонстрировал превосходство ОПП кодинга над процедурно-функциональным В общем это серьезная задача на сообразительность пошел соображать, соображу отпишусь )))))
Куда круче привести обратный, доказать, что там, где без ооп никак, лучше применять процедурный. На счет примера про ооп. По моему он дается в любой книжке про введение в ооп. Это пример с геометрическими фигурами.
Есть CMS система, которая разбита на модули. Каждый модуль представляет собой отдельный класс. У каждого модуля есть: - версия - заголовок - информация о модуле - функция для отображения - функция для доступа ко внутренним файлам - функция установки модуля - функция удаления модуля - административный интерфейс - и т.д... Однако, чтобы создать свой первый модуль, достаточно просто написать Код (Text): class controller_module extends base_controller {} и данный модуль будет выполнять все базовые возможности модуля. Почему? Да потому что все методы, общие для всех модулей, достаются данному модулю по наследству - нет необходимости каждый раз заниматься копи-пастой. Нужно чтобы наш новый модуль что-то делал по другому? Нет проблем - взяли, и изменили функцию внутри модуля. У всех остальных данная функция будет работать по старому. Как можно реализовать подобное с помощью чистых функций?
+1 Функциями это не реализуемо, можно написать другую функциию, но это уже будет не то, когда к примеру в цыкле перебираешь данные и обращение должно идти к одному методу функции, при этом ожидаемые ответы функций должны быть разными тут уже не как без ОПП Разжую 1) foreach( $array as $item ) { $result = myfunc( $item ); } 2) foreach( $arrayObject as $itemObject ) { $result = $itemObject->method(); } вариант 1 результат всегда будет получаться однородным. ( хотя как альтернатива сама myfunc может быть модифицирована с добавлением условий зависимых от полученных данных ) вариант 2 метод обьекта всегда один но результаты которые мы будем получать могут быть общитаны соверщенно по разному ( данные для общета уже не передаються они есть свойствами объекта ) Вывод: получаем некую абстракцию "пространства имен" для методов (функций) в процедурном стиле это не реализуемо.
еще во втором варианте - объекты могут принадлежать к разным классам, соответственно method() у них может быть реализован по-разному. В случае с функциями - пришлось бы вызывать разные функции)
Ну собственно это я и пытался показать, а будет это другой класс или переопределенный родительский это уже ньюансы.
А может вы не правильно его понимаете Давайте отбросим пехепе, и подумаем что такое инкапсуляция... Возьму я обычную баскетбольную биту которая висит на стенке как украшение и ничего не делает (у нее нет применения, методов), но тем не менее она инкапсулирует(содержит) в себе такие понятия как вес, ширина, форма, цвет, длинна и т.д. Все это можно описать массивом? Однозначно да, следовательно массив это инкапсулятор какихто свойств или значений Доказал что в массиве есть инкапсуляция? Теперь докажите обратное.
Инкапсуляция - это управляемое ограничение доступом + возможность "расширяться внутрь". Все мои методы - это мои методы. Захочу внутренний класс - больше его никто не получит. Захочу закрытый метод - будет мой метод. Вот есть у объекта вес, ширина, форма, цвет, длина и т.д.. Но тебе, лысый, я телефон не скажу!.. (с) А в случае с массивом любой желающий придёт и сделает с вашим массивом всё, что захочет.
Массив это не инкапсуляция - это абстракция. А вот классы, объекты - могут инкапсулировать некую информацию. В принципе, если работать с массивами через специальные функции и в соответствии с некоторыми правилами, то можно организовать поддержку инкапсуляции на массивах.
О Инкапсуляции в php заговорили за долго до того как там появились private и protected а единственным показателем этих свойств был подчерк в начале методов. А если обьект использувался как массив для хранения данных без единого метода то это уже не обьект и он ничего не инкапсулирует я понимаю википедия это хорошо, но реально инкапсуляция это абстракция, а все остальное побочные эфекты и не более
PHP: <?php //в php не поддерживаются! приводится как пример! class Outer { class Inner { $a; function __construct() { $a=7; } } $inner; function __construct() { $inner = new Inner(); } } $v_Outer = new Outer(); //можно $v_Inner = new Inner(); //нельзя ?>