научите меня программировать на php oO

Krishna

Продался Java
Lightning
Я то спокоен. Я просто не люблю, когда несут чушь с авторитетным видом, которую потом читают новички и принимают её за истину.
 

Духовность™

Продвинутый новичок
на этом форуме вообще очень много ссылаются на всяких Фаулеров, только вот при конкретном вопросе ответ могут дать один-три человека. Создается впечатление, что все читали Фаулера, но никто не применял такие серьезные наработки в действительности.
 

Alexandre

PHPПенсионер
на этом форуме вообще очень много ссылаются на всяких Фаулеров, только вот при конкретном вопросе ответ могут дать один-три человека. Создается впечатление, что все читали Фаулера, но никто не применял такие серьезные наработки в действительности
очевидно возникающие вопросы требуют серьезной вдумчивости и продуманности (и соответственно времени), и очень даже часто дискуссионной противоречивостью
а тут быстро отвечают только на ламерские вопросы.

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

флоппик

promotor fidei
Команда форума
Партнер клуба
Некоторые базовые принципы подходят, некоторые - нет.
Поэтому собственно, почти все паттерны имеют своих антиподов. По хорошему говоря, Фаулер пишет о том, как разумней и правильней сделать то, что подсказывает опыт, и как это называть при общении с другими разработчиками. Но и это - немало, ящитаю.
 

Lightning

Трудоголик
Krishna
Я то спокоен. Я просто не люблю, когда несут чушь с авторитетным видом, которую потом читают новички и принимают её за истину.
А я не люблю, когда кто-то считает свое мнение единственным правильным, а все остальные - чушью. А еще не люблю предвзятого отношения.

Вернемся к ОО языкам.
Krishna
Да, я тоже в курсе, что дядя Фаулер так думает
Фаулер тут ни при чем. Это известный факт. ООП зародилось в Симуле-67, а затем в 1980 году было развито в Smalltalk-80. Можешь назвать ОО язык, который появился до 80 года (кроме Симулы)?
Тут спорить бессмысленно, даже в Википедии ты найдешь эти факты.

nerezus
В пхп все с джавы слизано в плане синтаксиса.
Многое слизано, но не все и не "в плане синтаксиса".
1. В Java и статические и динамические обращения осуществляются через точку, а в PHP различаются -> и :: , что больше похоже на C++
2. В Java поля класса видны в методе, а в PHP для тоступа к ним приходится использовать $this->
3. В Java для обращения к методам родителя использется super. , а в PHP parent :: ( при этом почему-то :: )
4. В PHP нет пакетов и соответсвенно нет модификаторов доступа к классам, только к методам.
5. try/catch слизали, finally не долизали.
6. В PHP есть __construct() __destruct(), в Java имя конструктора совпадает с именем класса, а деструкторов нет вообще.
7. В PHP конструктор наследуется, если его не переобъявить в потомке, а в Java - нет.
8. В PHP есть функции, в Java их нет.
и т.д....

Krishna
zerkms
Теперь по вашим просьбам поясняю как определить более и менее чистые ОО языки.
Для этого обратимся к основоположникам ООП. Цитирую Алана Кея:
объектно-ориентированный подход заключается в следующем наборе основных принципов:
1. Всё является объектом.
2. Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
3. Каждый объект имеет независимую память, которая состоит из других объектов.
4. Каждый объект является представителем (экземпляром) класса, который выражает общие свойства объектов.
5. В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.
6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
Теперь обратим внимаение на то, как реализуются эти принципы в Smalltalk, Java и PHP:

1. Всё является объектом.
В Smalltalk реализуется полностью: все, включая константы и управляющие структуры, является объектами; свойства объекта являются объектами; объекты посылают сообщения, которые сами являются объектами.
В Java есть сущности не являющиеся объектами: базовые типы данным, массивы, управляющие структуры, операторы и т.д.
В PHP кроме того, что есть в Java, есть еще функции, ассоциативные массивы и глобальные переменные, что не вяжется с ООП.

2.Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
В Smalltalk как раз реализован механизм сообщений.
В Java используется концепция "вызовов метода как отправка сообщения", что является разумной практичной альтернативой. Но не все действия являются отправкой сообщения, т.к. существуют операторы и управляющие структуры.
В PHP также как в Java, но еще есть вызовы функций.

3. Каждый объект имеет независимую память, которая состоит из других объектов.
В Smalltalk свойства объекта действительно являются объектами.
В Java свойства объекта могут быть как объектами так и данными базовых типов.
В PHP свойста так же могут как объектами так и данными базовых типов.

4. Каждый объект является представителем (экземпляром) класса, который выражает общие свойства объектов.
5. В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.
Тут все нормально, кажется.

6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
В Smalltalk реализовано в полной мере.
В Java тоже (корнем иерархии классов является класс Object).
В PHP нету общего корня иерархии (или я плохо читал мануал?)

Теперь понятно какой язык можно считать более ОО.

PHP все-таки мультипарадигменный язык и изучать на его основе одну из парадигм не очень хорошая идея, ИМХО.

Krishna
Пояснения я привел. Если от тебя последуют ответы вроде "Это не аргумент" или ты начнешь придираться к мелочам, то я буду считать, что ты занимаешься троллингом.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
6. В PHP есть __construct() __destruct(), в Java имя конструктора совпадает с именем класса, а деструкторов нет вообще.
PHP4
В PHP нету общего корня иерархии (или я плохо читал мануал?)
stdClass


Предлагаю сравнить еще и с JS! =)
 

nerezus

Вселенский отказник
Lightning окей. Теперь посмотри на приведенные тобой пункты для ООП и на Java. Не сочетается что-то.
 

Lightning

Трудоголик
флоппик
Я про PHP5. В PHP4 даже модификаторы доступа к методам не реализованы.

Я думал, что StdClass - это просто стандартный класс, который не имеет методов. Объект для хранения данных. А где написано, что он базовый для всех?
 

A1x

Новичок
в Java есть еще перегрузка методов - чего как раз нет php
 

Krishna

Продался Java
Lightning
Это уже больше похоже на предметный разговор.
Однако, ты касательно Явы лишь привёл несколько пунктов, некоторые соответствуют отличиям синтаксиса, что имхо вообще мелочь в контексте вопроса о ООП возможностях языка, некоторые показывают, что PHP ближе к приведённым тобой же версии критериев ООП

6. В PHP есть __construct() __destruct(), в Java имя конструктора совпадает с именем класса, а деструкторов нет вообще.)
Явно, наличие возможности реализовать деструктор не является признаком "меньшего ООП" :)

7. В PHP конструктор наследуется, если его не переобъявить в потомке, а в Java - нет.
То есть, PHP под духу ближе к следующему критерию:
6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
Да, нет finally в исключениях. Но, как ты мог заметить из приведённых критериев, механизм исключений не является частью ООП-парадигмы, хотя и реализован в большинстве ООП-языков. Так что, сей нюанс, формально, не влияет на ООПшность PHP относительно Явы.

Собственно, основной недостаток PHP судя по твоему списку заключается не в том, что он недостаточно ООП (собственно что и требовалось доказать), а в том, что он по совместительству слишком процедурный. Ну так извините, швейцарский нож не перестаёт быть ножом, оттого, что в нём есть ещё шило и ложка.

Я согласен с тем, что PHP не подходит для обучения программированию и ООП в частности, но никак не по причине своей мифической недоООПшности.
PHP - полноценный объектно ориентированный язык, потому, что он предоставляет бОльшую и вполне достаточную часть ООП механизмов.
А не подходит он для обучения тому же ООП и программированию в целом по другим причинам, прежде всего нестрогой типизации, правда тут уже были холивары на эту тему, неохота начинать по новой :)

-~{}~ 06.07.09 21:17:

в Java есть еще перегрузка методов - чего как раз нет php
Это как раз следствие нестрогой типизации, о которой я говорил. Это плохо в учебном плане, т.к. лучше позволяет демонстрировать сущность полиморфизма.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Блин, пруфлинка нет. Просто написано, мол зарезервированное имя, вы не должны этого хотеть... но вроде в старом мануале было. Врать не буду, не помню.
 

Sherman

Mephi
2 копейки

btw, один из главных бонусов статитической типизации, это error в compile time.

Про перегрузку методов и операторов, думаю, что это можно было бы реализовать, но это сииильно замедлит код, потому что многие вещи из compile time придеться тащить в runtime. А полезность сомнительна.
 

Lightning

Трудоголик
Однако, ты касательно Явы лишь привёл несколько пунктов, некоторые соответствуют отличиям синтаксиса, что имхо вообще мелочь в контексте вопроса о ООП возможностях языка,
Это было касательно отличия PHP и Java. По критериям ООП я расписал в том же посте ниже.
7. В PHP конструктор наследуется, если его не переобъявить в потомке, а в Java - нет.

То есть, PHP под духу ближе к следующему критерию:

6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
Конструктор родителя _доступен_ в потомке в Java, но в каждом классе должен быть объявлен свой конструктор, пусть даже пустой или включающий только вызов конструктора родителя. Т.е. можно представить, что в Java конструктор при наследовании становиться как бы protected :) Это, конечно, не очень удачное решение с точки зрения практичности. А с точки зрения теории - трудно сказать.
Я согласен с тем, что PHP не подходит для обучения программированию и ООП в частности, но никак не по причине своей мифической недоООПшности.
Я говорил про чистоту языка с точки зрения ООП, а не про недоООПшность. Сошлемся на то, что я не четко выразился, а ты не так понял.
Сказал бы сразу что согласен, так нет жеж...
 

Krishna

Продался Java
шет, php круче java?
Ява и пхп - разные вещи, этож очевидно.
Ява строготипизирована (свои бонусы, например проще работать с бухгалтерией), побыстрее и на порядок более экономна по использованию памяти, многопоточна.
 

Духовность™

Продвинутый новичок
вот нет бы что-нибудь ПОЛЕЗНОЕ обсудить, так нет, они из пустого в порожнее перебирают в стотысячпервый раз одно и тоже.
 
Сверху