PHP

индекс
206,76

PHP и магия ООП

David: Magic OOP
Ага, вот эти ребята, сейчас я покажу Вам магию ООП.

Вместо предисловия. Об авторах языка



Точнее о траве которую курили разработчики, ну как так можно именовать функции? Ну возьмем для примера функции для работы со строками:
  • str_replace(ищем строку $search, заменяем на $replace, в строке $subject [, итого поменяли &$count ] )
  • strpos ( в строке $haystack, ищем $needle [, пропускаем $offset символов] )
  • substr_replace( в строке $string, заменям на $replacement, с позиции $start [, $length ])
  • nl2br (изменяем строку $string [, это $is_xhtml ] )

Как мы видим это очень мрачно, а если брать массивы — в одном месте у нас функция возвращает результат, в другом — работает по ссылке… брр…

Благодаря отсутвию стандартов даже в самом языке, мы имеем некий дискомфорт при работе с данным языком. Да и другие косятся…

PHP это не ООП язык



Эту сказку я частенько слышу. Решил я ее переписать :)

Решил, и переписал — на Ruby пару классов, которые будут представлять из себя обертку для строк и масивов. Данные классы включают в себя лишь часто используемые функции (по моему скромному мнению), а вызов остальных возложил на рефлексию.

Массив — oArray



Данный класс включает в себя следующие стандартные функции

  • array_diff — Вычислить расхождение в массивах
  • array_fill — Заполнить массив определенным значением
  • array_filter — Применяет фильтр к массиву, используя функцию обратного вызова
  • array_flip — Поменять местами значения массива
  • array_key_exists — Проверить, присутствует ли в массиве указанный ключ или индекс
  • array_keys — Выбрать все ключи массива
  • array_map — Применить функцию обратного вызова ко всем элементам указанных массивов
  • array_pop — Извлечь последний элемент массива
  • array_product — Вычислить произведение значений массива
  • array_push — Добавить один или несколько элеметов в конец массива
  • array_rand — Выбрать одно или несколько случайных значений из массива
  • array_reverse — Возвращает массив с элементами в обратном порядке
  • array_search — Осуществляет поиск данного значения в массиве и возвращает соответствующий ключ в случае удачи
  • array_shift — Извлечь первый элемент массива
  • array_slice — Выбрать срез массива
  • array_splice — Удалить последовательность элементов массива и заменить её другой последовательностью
  • array_sum — Вычислить сумму значений массива
  • array_unique — Убрать повторяющиеся значения из массива
  • array_unshift — Добавить один или несколько элементов в начало массива
  • array_values — Выбрать все значения массива
  • sort — Отсортировать массив
  • rsort — Отсортировать массив в обратном порядке
  • natsort — Отсортировать массив, используя алгоритм «natural order»
  • natcasesort — Отсортировать массив, используя алгоритм «natural order» не принимая во внимание регистр символов
  • ksort — Отсортировать массив по ключам
  • krsort — Отсортировать массив по ключам в обратном порядке
  • implode — Объединяет элементы массива в строку


А так же немного полезной отсебячины:
  • to_url — Обертка для http_build_query
  • clear — Убрать пустые элементы массива
  • odd — Оставить лишь нечетные элементы
  • even — Оставить лишь четные элементы
  • size — Врапер для функции sizeof


Для всех функций вида array_* сей префикс я убрал (ведь мы и так знаем, что работает с массивом), остальный функции — на совести метода __call и рефлексии.

Строка — oString



Данный класс включает в себя следующие стандартные функции

  • addslashes — Экранирует спецсимволы в строке
  • count_chars — Возвращает информацию о символах, входящих в строку
  • crc32 — Вычисляет CRC32 для строки
  • crypt — Необратимое шифрование (хэширование)
  • explode — Разбивает строку на подстроки
  • html_entity_decode — Преобразует HTML сущности в соответствующие символы
  • htmlentities — Преобразует символы в соответствующие HTML сущности
  • htmlspecialchars_decode — Преобразует специальные HTML-сущности обратно в соответствующие символы
  • htmlspecialchars — Преобразует специальные символы в HTML сущности
  • ltrim — Удаляет пробелы из начала строки
  • md5 — Возвращает MD5 хэш строки
  • money_format — Форматирует число как денежную величину
  • nl2br — Вставляет HTML код разрыва строки перед каждым переводом строки
  • number_format — Форматирует число с разделением групп
  • parse_str — Разбирает строку в переменные
  • rtrim — Удаляет пробелы из конца строки
  • sha1 — Возвращает SHA1 хэш строки
  • sprintf — Возвращает отформатированную строку
  • str_pad — Дополняет строку другой строкой до заданной длины
  • str_repeat — Возвращает повторяющуюся строку
  • str_replace — Заменяет строку поиска на строку замены
  • str_ireplace — Регистро-независимый вариант функции str_replace()
  • str_word_count — Возвращает информацию о словах, входящих в строку
  • strip_tags — Удаляет HTML и PHP тэги из строки
  • stripslashes — Удаляет экранирование символов, произведенное функцией addslashes()
  • strstr — Находит первое вхождение подстроки
  • stristr — Регистро-независимый вариант функции strstr()
  • strpos — Возвращает позицию первого вхождения подстроки
  • stripos — Возвращает позицию первого вхождения подстроки без учета регистра
  • strrpos — Возвращает позицию последнего вхождения символа
  • strripos — Возвращает позицию последнего вхождения подстроки без учета регистра
  • strrev — Переворачивает строку
  • strtolower — Преобразует строку в нижний регистр
  • strtoupper — Преобразует строку в верхний регистр
  • substr_count — Возвращает число вхождений подстроки
  • substr_replace — Заменяет часть строки
  • substr — Возвращает подстроку
  • trim — Удаляет пробелы из начала и конца строки
  • ucfirst — Преобразует первый символ строки в верхний регистр
  • ucwords — Преобразует в верхний регистр первый символ каждого слова в строке
  • wordwrap — Выполняет перенос строки на данное количество символов с использованием символа разрыва строки


А так же немного полезной отсебячины:
  • add — Конкатенация строк
  • insert — Вставка строки в строку
  • size — Врапер для функции strlen


Для всех функций вида str_* и str* сей префикс был убран.

Так же выделил функции для работы с URL — и запихнул их в отдельный класс (oUrl):
  • parse_url
  • urlencode
  • urldecode


Слайды


Теперь приведу пример использования сего творения:
oArray()                   // создаем пустой массив
        ->range(,100,10)  // врапер для  range
        ->size()           // врапер для  sizeof
        ;


Как Вам? Даю еще пищу для мозга:
<?php
 
// создаем массив из элементов 
// =>  array('module', 'controller', 'action') 
oArray('module', 'controller', 'action') 
        // врапер для  array_combine
        // =>  array('module'=>'default', 'controller'=>'index', 'action'=>'index')
        ->combine(oArray('default', 'index', 'index')) 
        // врапер для   http_build_query возвращает oUrl
        // =>  module=default&controller=index&action=index
        ->to_url()
        // добавляем кусочек строки в начало
        // =>  http://domain.com/?module=default&controller=index&action=index
        ->insert('http://domain.com/?') 
        // врапер для  parse_url возвращает oArray                                       
        ->parse()
        // возвращает array['host']
        // =>  domain.com
        ->host                                        
        ;


И еще:
oString("It's my way")
        // str_replace       => "It's your way"
        ->replace('my','your')    
        // substr              => "It's you"
        ->sub(,  8)  
        // str_pad            => "It's you..."            
        ->pad(11, '.')  
        // str_repeat        => "It's you...It's you..."          
        ->repeat(2)    
        // получаем oArray => array('It's you','It's you', '')
        ->explode('...')  
        // удаляем пустые элементы        
        ->clear()
        // array_merge => array('It's you','It's you', 'Yes','No','Maybe')       
        ->merge(array('Yes','No'), array('Maybe')) 
        // implode => It's you;It's you;Yes;No;Maybe 
        ->implode(';') 
        // return It's you;It's you;Yes;No;Maybe 
        ->get()
        ;


Объект — oObject


Даже обычный класс можно улучшить — добавив ему хитрые гетеры/сетеры для свойств объекта (я это подсмотрел в RoR):

class MyClass extends Object_Object {
    // это действительно protected свойство
    protected $_protected;
 
    // для данных полей можно определить гетеры/сетеры
    protected $title;
    protected $description;
 
    // public свойство без гетеров/сетеров
    public    $data;
 
    /**
     * Сеттер для свойства title
     *
     * @param string $value
     * @return mixed
     */

    function setTitle($value) {
        $this->title = ucfirst($value);
    }
 
    /**
     * Геттер для свойства title
     *
     * @return mixed
     */

    function getTitle() {
        return $this->title . '!!!';
    }
}
 
$MyClass = new MyClass();
$MyClass -> title = 'article title';
 
echo $MyClass -> title;


В результате сей махинации мы получим следующий результат:

Article title!!!


Как видим — подобный класс даже имеет право на существование ;)

Вот такое нехитрое творение у меня получилось, скачать его можно с моего блога:

oObject ver.0.1

P.S. Данные классы не претендуют на жизнь в реальных проектах, они предназначены дабы развеять миф о не-ООП-ешности PHP, а так же послужат неплохим материалом для изучения начинающими программистами…

P.P.S. Я же обещал сие написать ради холивара
+104
25 декабря 2008, 16:33
108

комментарии (114)

0
insaner #
Почти убедили
+15
twi #
Да знаем, знаем. Но любить не перестанем. :)
+13
beanime #
Таки раскукожил код…
+5
kashey #
пойду сейчас курну что пожжеще и чегонить сюда на boost вывал. Вот где шаманство — так это там
–1
AxisPod #
+
boost это вещь, давай, жги!
НЛО прилетело и опубликовало эту надпись здесь
+1
Ueasley #
Так есть же полиморфизм то. Или я чего-то не понял?

Если вас сжимает отсутствие множественного наследования и перегрузки — меняйте язык. Нет смысла кукожить обходными путями PHP.
НЛО прилетело и опубликовало эту надпись здесь
0
o_O_Tync #
+1. К тому же это заметно понижает скорость.
В одном из проектов 15% сжирало использование геттера вместо public свойства. Сам в шоке :) PHP 5.2.8
–1
apk #
еще в PHP нет поддержки utf-8 на уровне ядра, этот аспект Вы, как мне показалось, тоже пропустили?
+2
AntonShevchuk #
А может почитаем про PHP6?
0
apk #
а где-то в статье или в коде есть упоминание о php 6?
+13
AntonShevchuk #
А UTF-8 как-то связан с ООП?
+5
apk #
Нет, мне понравилась Ваша реализация работы со строками, но я указал на недостатки в Вашем классе, и это ложка дегтя в бочке меда.
Я не знал, что Вы писали эти обертки не для использования, а только ради ООП.
0
merlin_rterm #
Ну, это был очень прозрачный и удобный путь сделать все строковые функции UTF-aware…
+2
second_pilot #
а как вам такое?
Fatal error: Exception thrown without a stack frame in Unknown on line 0
0
Xobb #
у сервера скорее всего прав нет на чтение файла.
+15
udivankin #
Ха, названия функций — еще не вся бяда… те же строковые функции могут возвращать false, '', 0, -1 при отрицательном результате выполнения. Просто так повелось.
С опытом напрягает это все меньше и меньше. Но. Иногда хочется, чтобы настал такой момент, например к выходу PHP6 — хрен с ней с обратной совместимостью — чтобы причесали все названия функций и логику того что они возвращают.
+3
Floyd #
Иногда хочется, чтобы всю обратную совместимость вынесли в какой-нибудь mod_compat (mod_bc). Для новых проектов можно было бы его не подключать, и писать на новом красивом php.
–1
Pilat #
Новый красивый PHP? Новая свалка методик, как минимум.
+2
Lazin #
Это антипаттерн Blob, хотя я еще не видел класс строки, который не следовал бы этому антипаттерну :)
+1
nerezus #
jQuery в данном случае же вообще BL0B)
0
egorinsk #
Ох, а я уж лучше с синтаксисом повожусь. тем более что функции str_* и array_* нечасто использую, можно и мануал почитать.
0
heel #
oArray — я не сразу понял что имеется ввиду =)
+5
altern #
надо было назвать o_OArray ;)
–1
Jons #
и >_
+2
Jons #
моя хотел сказать… и >_<Exeption
0
jrip #
Тогда уж для класса oString метод get() не нужен, есть «волшебный» __toString()
0
AntonShevchuk #
__toString() и так реализован в Object_Abstract, метод get использовался только для примера…
0
ashofthedream #
oArray можно смело отправлять в топку. Все равно гибкости обычным массивам не добавляет, а для оопшности можно и STL-евские обертки поюзать
+2
AntonShevchuk #
Данный пакет не предназначен для реалий бытия, а лишь для самообучения, перечитайте P.S.
+1
v_k #
$_COOKIE!!!
+3
netwom #
это типа вместо Smokie!!! (фильм «Маска»©)?
0
KAndy #
Начало неплохое.
Неплохо бы интегрировать с Spl Types
К недостатком кода нужно отнести отсутствие интеграции с стандартными интерфейсами.
Посмотрите например на сlass ArrayIterator с пакета Spl.

ИМХО: юнит тестов нехватает, вообщем пялить и пялить :).

0
AntonShevchuk #
На SPL не покушался, хотя допилять до совместимости можно…
–2
coldFlame #
Зачем писать ruby-style на PHP? Чисто ради эксперимента?
Если так не нравится пхпшная каша из функций, не мучайтесь и пишите на RoR.
0
VolCh #
Довольно часто в ТЗ «среда выполнения» четко задана (в 99%, имхо, случаев шаредхостинг под LAMP)
НЛО прилетело и опубликовало эту надпись здесь
0
preprocessor #
Вы сильно заблуждаетесь думая, что это ruby-style.
0
ainu #
jQuery на php? Или нет?
0
AntonShevchuk #
Ну есть в запасе PHP класс для работы с jQuery:
anton.shevchuk.name/php/php-library-for-jquery/
0
Snick #
Оффтоп, конечно, но библиотека клевая и полезная. Любителям ZF <=1.6.x смотреть сюда: jquery.hohli.com/zf.html. Продвинутым (ZF >=1.7.x) смотреть сюда: framework.zend.com/manual/en/zendx.jquery.html
–1
ferrari #
ноги несомненно растут от туда :)
0
enartemy #
Не, не думаю. Если бы это был jQuery на php, то нужен некий god-обжект, в который входят все вышеперчисленныве классы, и работает с соответствующим в зависимости от запроса и аргуметов методов __get, __set и __call. А так — просто пара классов и все :-)
0
z_z #
Method chaining теперь навсегда ассоциироваться с jquery будет?
–2
django #
В велопарке подержанных велосипедов очередное пополнение
НЛО прилетело и опубликовало эту надпись здесь
+5
moore #
И… Это… ну… типа……… да…
На… всех хостингах…… ставьте……
НЛО прилетело и опубликовало эту надпись здесь
0
moore #
… Это… Ну… не на всех хостнгах…
пОцаны — это производное от ПОЦ… или… я… не…… понял?
:-D
0
chiaroscuro #
Это тонкая ирония?
НЛО прилетело и опубликовало эту надпись здесь
0
chiaroscuro #
Ну тогда я точно могу утверждать, что XForms и XQuery страдают от feature creep'а.

XSLT2.0 вообще так всего две реализации. Это о чем говорит? О неоправданной сложности.

Schema-aware XForms я еще не встречал. WXS это бегемот какой-то, никто его не может реализовать.

Впрочем, LAMP устарел, да.
НЛО прилетело и опубликовало эту надпись здесь
–1
altern #
как по мне, просто торжество абсурдизма) я очень долго смеялся
НЛО прилетело и опубликовало эту надпись здесь
0
altern #
нет, я действительно не думал что вы серьезно. не знаком с концепцией, которую вы упомянули. да и странным показалось упоминание каких-либо XML-технологий в топике про ООП. ни в коем случае не хотел обидеть
НЛО прилетело и опубликовало эту надпись здесь
0
altern #
Раз уж вы заговорили об этом всем, как вы вообще привыкли описывать структуру XML? XML Schema, Schematron? Какие инструменты используете если не секрет?
0
chiaroscuro #
> веб — это XHTML

Нет, веб это до сих пор (!) HTML 4, уже десять лет как (плюс припарки в виде CSS/JS). XHTML так и не получил должного распространения (и вряд ли получит: работы над XHTML2 все еще не закончены, а работы над XHTML1 уже давно прикрыты).

Да и потом, если брать XHTML, то посмотрим на другие технологии их состояние:
— SVG (переусложнен, противоречив, никому из интырпрайза нафиг не нужен)
— SMIL (кто-нибудь вообще слышал о нем? %))
— MathML (ну и где они, реализации?)
— XForms (я видел только одну реализацию для браузера: плагин в FF, но он даже под 3-ю версию не портирован...)

В этих технологиях несомненно есть хорошие идеи, но на деле они никому не нужны.

> единственные «минусы» которых — отсутствие знаний у разработчиков

Ну да, а еще:
— непоследовательность (эх, W3C...)
— отсутствие интеграции (даже несмотря на то, что XPath 2.0, XQuery 1.0 и XSLT 2.0 используют одно представление XML)
— сложность реализации

Ну и прочие «мелочи».
0
Davert #
Супер! Дано так хотелось бы со строками работать. Т.е., в symfony есть похожий класс DbFinder, который по сути стал оберткой для встроенных ORM, запросы там строятся точно так же, очень просто и красиво. Если б ещё со строками и массивами столь непренужденно работать! Жду стабильный релиз, чтоб использовать в новом проекте :)
+1
chiaroscuro #
Откройте для себя композицию функций: g o f = g(f(x)).

Как это реализовать в PHP — думайте сами.
+2
ferrari #
нашел в одном из файлов «// return oInteger(strlen($this->var));», да уж, не доверять функции strlen — это жестоко :)
0
AntonShevchuk #
Тама есть класс Object_Integer, но поскольку какого либо функционала ему не придумал — решил интегер не делать объектом…
0
nerezus #
Сильно напрягает название методов one_two, когда по всем стандартам для PHP(Zend,PEAR, etc) принято oneTwo.
А так — спасибо) Переделаю под себя под UTF-8 с нормальными именами)
+4
ferrari #
$x->вСтроку('1234.5')->заменить('.',",")->развернуть(); ?
0
youROCK #
Скорее уж так:

%-ЮвСтроку(э1234ю5э)-Юзаменить(э.эб э,э)-Юразвернуть()ж


(а то лень раскладку постоянно менять...)
0
Sannis #
–2
udivankin #
10 раз сменяет раскладку правильно, 1 раз неправильно. И все равно бесит! Хотя эффективность 90%. Почему так? ))
0
enartemy #
Автору:

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

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

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

Вобщем, конечно красиво, но я бы не стал этим пользоваться. Потому что кроме красоты это мало что дает. Но за эту красоту надо еще заплатить 1) тем, что надо все-таки врубаться в ваши классы 2) что лишних ресурсов это чуть-чуть да сожрет. А при частом использовании может и не чуть-чуть.
0
AntonShevchuk #
И еще — автодополнение кода в IDE не будет работать ;)

Как я уже говорил, данный пример и не должен использоваться в живых проектах — лишь для самообразования… (хотя некоторые элементы реализации и имеют право на существование)…
0
sas171 #
Даёт. Если правильно абстрагировать большинство функций то намного проще писать unit test'ы. Попробуй написать тест кода который отсылает email.
–1
sphere #
Приходит мужик к врачу.

— Здравствуйте, — говорит.

И начинает раздеваться.
Снимает рубашку, складывает её по швам, пуговки застегивает и кладет на стул.
Снимает майку, тоже складывает и укладывает рядом с рубашкой.
Ботиночки рядом поставил, носки снял, разгладил и рядом положил.
Брюки по стрелочкам и на спинку стула, трусы снимает, тоже по швам разгладил рядом с майкой положил и говорит:

— Знаете, доктор, вот посмотрите, у меня одно яичко чуть выше другого.
— Ну и что тут такого?

— Как что? Неаккуратненько как-то.
+2
LDEV #
Не вижу здесь той самой удивительной уличной магии со словами «В РОТ МНЕ НОГИ, КАК ТЫ ЭТО ДЕЛАЕШЬ?». С удовольствием воскликнул бы так же, но увы…
+1
Ueasley #
Предлагаю файлы переименовать в *.class.php.
+1
crocodile2u #
После этого все сразу заиграет в новых красках.
–1
AntonShevchuk #
0
RayZ #
А это не является ли соглашением?
Или действительно существуют какие то ограничения на уровне языка?
0
AntonShevchuk #
Если не следовать правилам именования то не будет работать коректно автолоадер классов
–2
preprocessor #
О да, ООП как неймспейсы в лучших традициях PHP4. Вот уж действительно сила.

Своим постом вы только подтвердили убогость языка, называя ЭТО «магией ООП».
+1
dsCode #
> вы только подтвердили убогость языка, называя ЭТО «магией ООП»

какая еще «убогость»? что за «ЭТО»? Что есть «не убогость»? Где нет «ЭТОГО»?
+1
preprocessor #
«убого» это когда называют «магией ООП» засовывание кучи функций во враппер-класс. С тем же руби автор знакомился, видимо, исключительно по статейкам аля «Блог на рельсах за 15 минут»
–1
dsCode #
> С тем же руби автор знакомился, видимо, исключительно по статейкам аля «Блог на рельсах за 15 минут»

А Вы на каком уровне с Руби знакомы? Можно посмотреть сравнительные примеры «убогости» PHP и «неубогости» Ruby?
–1
preprocessor #
Во-первых, я сейчас даже не писал, что php — убог, а ruby — нет. Но данное «подтверждение» крутости ООП в php — это просто детский сад, тут и спорить не о чем.

Во-вторых, мне вот щас действительно не очень хочется расписывать какие-либо преимущества руби перед пхп. Если вам действительно интересно, посмотрите на рельсы, там вся эта магия руби очень основательно используется, даже слишком, благодаря чему исходники крайне запутаны, а конечные интерфейсы зачастую может и выглядит красиво, но до фига не удобны, когда хочется выйти за рамки задуманого разработчиками. Тем не менее мы сейчас говорим о возможностях языка, а он как раз позволяет делать такое. Для примера можете взглянуть на реализацию коллекций ассоциаций в рельсах и подумать как подобное можно было бы реализовать в пхп. Те кто думает что CakePHP — это «как RoR» сильно заблуждаются.
0
dsCode #
> я сейчас даже не писал, что php — убог

«вы только подтвердили убогость языка»habrahabr.ru/blogs/php/47785/#comment_1229894

> Те кто думает что CakePHP — это «как RoR» сильно заблуждаются.

А причем здесь какие-то Рельсы и какой-то там КейкПХП?

Вы дали четкое определение «убого» относительно ПХП: «убого» это когда называют «магией ООП» засовывание кучи функций во враппер-класс. Вот мне и интересно — где «не убого»? Определенно же — Вы должны знать ответ на этот вопрос, раз так категорично определяете «убогость» PHP. Или я ошибся?

> Для примера можете взглянуть на реализацию коллекций ассоциаций

а что за коллекции ассоциаций?
–1
dsCode #
> засовывание кучи функций во враппер-класс

а в Руби не так разве?
–1
second_pilot #
Для меня пхп убог тем, что на него нельзя положиться. тоесть если я знаю, что мне шарп или руби выдадут вменяемое сообщение о ошибке, то в пхп черти что может быть. а чего стоит то, что пыха выполняет редирект после несловленного эксепшена… или вообще не выдать ошибки, и ты ее должен определять по каким-то косвенным признакам. Только мне все это не мешает писать на пхп. Со времен набираются наработки, на которые вполне можно положиться.
–1
dsCode #
ну т.е. «убог» он, получается, в чем-то другом (относительно Ваших привычек-непривычек), а не в ООП, так?
–2
second_pilot #
ну, это первая строчка, который выдал поисковик в моем мозгу по запросу «убогий, пхп»:) Ну а вообще, есть некоторые вещи, которые меня слабо волнуют в ооп пхп, но все же: нужно явно вызывать отцовский конструктор при определении конструктора в классе-наследнике. То же и с деструктором. А еще не дай бог вы выбросите из деструктора иксепшн. Или вообще выбросится иксепшн при завершении скрипта. Или злостная функция unset, которая ни разу не вызывает деструктор объекта, а тупо приводит его в типу null. Или рэндомная последовательность вызова деструкторов при вызыве die().
Это все конечно мелочи, но крови попортили достаточно
–1
dsCode #
> нужно явно вызывать отцовский конструктор при определении конструктора в классе-наследнике

это во многих реализациях так
–1
second_pilot #
ну и я не испытываю религиозных чувств к этому) видать школа такая у меня языковая
–1
valer00n #
(Звучит как «Зазузааааа!»)
–2
RayZ #
Не, обертки — супер.
Но это все равно не ООП :)

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

–1
dsCode #
> Но это все равно не ООП :)

а что есть ООП? В Вашем понимании.
0
Snick #
Ага, вот эти ребята, сейчас я покажу особую, php ООП-магию
НЛО прилетело и опубликовало эту надпись здесь
0
AntonShevchuk #
Перечитайте внимательней пост, особенно P.S.
–1
scarych #
забавно, почитаем
–1
dsCode #
насчет того, что в PHP до сих пор (!) (или пока?) нет стандарта на имена built-in-функций/объктов — это да, плохо (как плохо и то, что язык не чувствителен к регистру)

насчет того, что функция может «портить» аргумент, работая с ним по ссылке и никак этот факт визуально не определить — тоже плохо (например, можно было бы помечать такие имена функций знаком восклицания в конце — obj.sort!), но с другой стороны — можно посмотреть всегда документацию и уточнить такие моменты (поскольку все случаи невозможно предусмотреть и где-то нужно, чтобы функция преобразовывала объект-параметр)

насчет неинтуитивных возвращаемых значений ('', 0, false) — да, тоже бы неплохо иметь хоть какой-нибудь конвеншн, но и в других языках, я не уверен, что с этим моментом все четко

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

А устраивать какие-то сомнительные холиворы (не являясь при этом создатилями ни PHP, ни Ruby) — вообще какая-то ерунда.
0
dsCode #
опечатки:

— чье-то => чьей-то*
— создатилями => создателями*
0
dsCode #
да и, у кого возникнет ощущение, что я отстаиваю PHP, оносительно других языков (Python, Ruby), скажу, что в настоящий момент уже давно не пишу на PHP, а занимаюсь только JavaScript'ом (и вместе с тем, Python и Ruby (их я практикую для себя, в свободное от работы время) мне нравятся больше, чем PHP); поэтому — я не отстаиваю PHP и его идеологию, мне просто интересна тенденция цепной реакции и холиворов на этой почве.
0
chiaroscuro #
ООП оно неуловимо, как Джо.

Настоящее ООП, по всей видимости, присутствует только в Smalltalk, но и там основным элементом является посылка сообщения, а не объекты, хе-хе.
0
dsCode #
> Настоящее ООП… только в Smalltalk

в Smalltalk — одна из реализаций объектной системы; любая иная реализация вправе вносить свои изменения, если они технически и идеологически обоснованы и отвечают тербованиями поставленых задач.
–2
kaffeine #
oMG()
–1
siberian #
Автор не думает об оптимизации, а только усложняет код излишними классами.
Фтопку.
0
AntonShevchuk #
Автор комментария не читал топик внимательно…
0
siberian #
Нуну. Давайте-давайте. Пишите классы, обертки для стандартный функций, потом это еще раз оборачивайте…
Только в конце не забудьте циклом фор например сравнить скорость работы с и без этих оберток. И прозреете. :)))
–1
AntonShevchuk #
Для особо одаренных — перечитайте P.S.
0
kaffeine #
возьмем ВАЗ 2101 и приделаем к нему 2 ракетных двигателя

PS: данный кастом не претендует на жизнь в реальных условиях, он предназначен дабы развеять миф о черепашности 2101, а так же послужит неплохим материалом для изучения начинающим психиатрам
0
siberian #
отлично!!! 8))))))))))
0
coylOne #
0
cowsam #
Осталось только узнать, сколько скорости при этом теряем, а так каждый сам себе хозяйн.
Меня устраивают и базовые функции php (как названия, так и return'ы — привыкнуть можно)
0
merkushin #
По-моему, про сеттеры и геттеры писать было излишне. В любой книжке, где упоминается ООП (включая, наверное, практически любой ман по PHP), пишется, что доступ к свойствам объекта лучше осуществлять как раз через геттеры/сеттеры.
Или я тут чего-то очень интересного/удобного не заметил (добавление восклицательных знаков и ucfirst не в счет, думаю, и так понятно, что в геттере/сеттере можно обрабатывать значения)?
Мне кажется, интереснее было бы написать о реализации «виртуальных» геттеров, например. Ну это так…
0
akalend #
оч много здравого в статье

ка-то на пхп-Клубе высказался, что согласно классификации Буча, пхп не явл объектно-ориентированным языком. Объектным — да… за что был закидан помидорами.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.