Духовность™
Продвинутый новичок
Процедурный подход в PHP и ОО. Налицо несовместимость синтаксиса.
Можете приготовиться кидать в меня тапки, ибо сейчас я замахнусь на самое святое.
В PHP реализовали возможность писать на ООПрограммировании. Классы, функции классов, фитчи в виде SPL.. а стал ли сам язык удобным для написания ОО-программ? Я думаю, что ни капли.
Если цитировать википедию, то "По мнению Алана Кея, создателя языка Smalltalk, которого считают одним из «отцов-основателей» ООП, объектно-ориентированный подход заключается в следующем наборе основных принципов 1. Всё является объектом."
Первый и основной принцип - все является объектом. Так же как в реальном мире все является объектом и состоит из объектов. В реальном мире примитивные объекты - молекулы. Из молекул состоит железо, из железа состоят автомобили как наивысшие по своей сложности объекты в цепочке молекула-железо-автомобиль.
Теперь вернемся к PHP. В PHP нет объектов низшего порядка - молекул - простых типов данных. Нет объекта массив, нет объекта число, нет объекта булев тип. Ничего этого на первых этапах создания языка разработчики не сделали. А нужны ли эти объекты? Я думаю, что нужны. И подтверждением этому может служить творение, называемое SPL - Standard PHP Library. Если взглянуть на эту "стандартную библиотеку", то можно сделать вывод, что суть существования этой библиотеки - заплатка для написания программ в ОО-стиле.
Попробую объяснить на примерах. Простой код:
возвращает с помощью метода __get массив данных с ключом "my_array" из хранилища объекта $object. Далее, допустим, мне нужно получить переменную этого массива. Что я должен сделать?
Отлично. А как мне добавить элемент в начало массива $object->my_array? Правильно, нужно писать страшный код - смесь структурного и ОО-подхода:
можно, конечно, вынести все это в метод класса к которому принадлежит объект $object
но это не правильно - нельзя писать для каждого класса, возвращающего массив, метод append.
Далее. Допустим, мы возвращаем наш массив с помощью функции foo() и хотим сразу же получить значение под индексом "key":
ну и так далее. Т.е. налицо конфликт синтаксиса двух подходов.
Теперь взглянем на SPL: класс ArrayObject, который, по идее, должен спасти отца русской демократии.
Теперь мы можем сделать так:
а можем и так:
- вообще замечательно!
А ну ка попробуем сделать так:
что мы получаем в итоге? А в итоге мы получаем, что значение под ключом "my_array" становится ОБЫЧНЫМ массивом, а не объектом типа ArrayObject. Соответственно, получить значение 'key' массива 'my_array' приходится опять через задницу, ибо не работает вполне логичная конструкция:
и не работает даже такая конструкция:
Зачем нужен ArrayObject? Кто-нибудь мне может объяснить? Какой смысл в этом объекте?
Подозреваю, что костыль ArrayObject как-то надо переделать, что бы вышеупомянутые конструкции работали. Т.е. на базе одного костыля мы делаем другой костыль. Замечательно! И это называется SPL!
У меня есть свой костыль - самописный ArrayObject, который легко делает такие вещи:
беда только в том, что этот костыль, созданный для удобства работы, несоизмеримо долго выполняется, ибо написан на PHP, а не является частью ядра языка.
И таких примеров у меня накопилось достаточно много. Если я не прав - поправьте меня, но я не понимаю, как на PHP можно писать нормальные приложения, у которых не было бы конфликта синтаксиса двух подходов.
Можете приготовиться кидать в меня тапки, ибо сейчас я замахнусь на самое святое.
В PHP реализовали возможность писать на ООПрограммировании. Классы, функции классов, фитчи в виде SPL.. а стал ли сам язык удобным для написания ОО-программ? Я думаю, что ни капли.
Если цитировать википедию, то "По мнению Алана Кея, создателя языка Smalltalk, которого считают одним из «отцов-основателей» ООП, объектно-ориентированный подход заключается в следующем наборе основных принципов 1. Всё является объектом."
Первый и основной принцип - все является объектом. Так же как в реальном мире все является объектом и состоит из объектов. В реальном мире примитивные объекты - молекулы. Из молекул состоит железо, из железа состоят автомобили как наивысшие по своей сложности объекты в цепочке молекула-железо-автомобиль.
Теперь вернемся к PHP. В PHP нет объектов низшего порядка - молекул - простых типов данных. Нет объекта массив, нет объекта число, нет объекта булев тип. Ничего этого на первых этапах создания языка разработчики не сделали. А нужны ли эти объекты? Я думаю, что нужны. И подтверждением этому может служить творение, называемое SPL - Standard PHP Library. Если взглянуть на эту "стандартную библиотеку", то можно сделать вывод, что суть существования этой библиотеки - заплатка для написания программ в ОО-стиле.
Попробую объяснить на примерах. Простой код:
PHP:
$object->my_array;
PHP:
echo $object->my_array['key'];
PHP:
$temp = $object->my_array;
array_unshift($temp, 'new_val');
$object->my_array = $temp;
PHP:
$object->append('new_val')
Далее. Допустим, мы возвращаем наш массив с помощью функции foo() и хотим сразу же получить значение под индексом "key":
PHP:
$object->foo()['key']; // так нельзя, это не JS
Теперь взглянем на SPL: класс ArrayObject, который, по идее, должен спасти отца русской демократии.
Теперь мы можем сделать так:
PHP:
$object->offsetGet('key')
PHP:
$object->append('123');
А ну ка попробуем сделать так:
PHP:
$object->offsetSet( 'my_array', array('key' => 'value') );
PHP:
echo $object->offsetGet('my_array')->offsetGet('key');
PHP:
echo $array->offsetGet('my_array')['key'];
Подозреваю, что костыль ArrayObject как-то надо переделать, что бы вышеупомянутые конструкции работали. Т.е. на базе одного костыля мы делаем другой костыль. Замечательно! И это называется SPL!
У меня есть свой костыль - самописный ArrayObject, который легко делает такие вещи:
PHP:
$cvar = new Cover_Var( array('value1', 245, 'my_array' => array('key' => 'value2')) );
echo $cvar->item(0); // value1
echo $cvar->my_array->key; // value 2
echo $cvar->my_array->count(); // 1
echo $cvar->my_array->append('привет, PHP!')->item(0); // привет, PHP!
echo $cvar->my_array->count(); // 2
И таких примеров у меня накопилось достаточно много. Если я не прав - поправьте меня, но я не понимаю, как на PHP можно писать нормальные приложения, у которых не было бы конфликта синтаксиса двух подходов.