Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Вторая попытка написать что-то полезное. Надеюсь что не последняя
---
Очередная мини-статья расчитана на людей которые уже познакомились с пользовательскими ф-циями в php, так же для осознания материала необходимы и некоторые другие НЕ базовые знания php.
PHP и ООП
Что же это такое? Кому и зачем оно нужно?
Человеческий разум устроен так, что нам сложно осознавать что-либо абстрактное. И это является главной причиной того, что когда программисты начинают говорить терминами ООП, новички перестают понимать о чем речь. На самом деле нужно только правильно зацепиться мыслью за абстрактные понятия "класс", "объект" и прочие вкусности..
Так собственно не откладывая далее саму суть, начнем.
1. Функции
Небольшой откат назад нужен для того, чтобы освежить память о пользовательских функциях. Собственно типичная пользовательская функция выглядит так:
Сама функция может принимать аргументы, может что-то возвращать в качестве результата, а может принимать в качестве аргумента ссылку на что-либо и изменять значение этого "что-либо". Соответственно существуют все мыслимые и не мыслимые комбинации этих возможностей работы с функциями.
2. Абстракции
Как правило "в жизни" требуется писать не мало кода для какого либо функционала. Однако каждое действие можно разбить на самостоятельные завершенные "события". Если задуматься, то функции решают эту проблему с головой, если каждую описать как завершенное "событие". Да, в общем это неплохо. Написать с десяток функций которые будут работать с базой данных. Действительно, а зачем каждый раз повторять одни и те же действия на разных страницах сайта, или по нескольку раз на одной странице. Например:
Ну вот, уже гораздо аккуратнее. На самом деле это самое главное условие: Если вы хотите писать код с помощью ООП, вы просто обязаны придерживаться такого написания кода как показано выше, а именно - отделять логику приложения от вывода результатов пользователю.
Собственно в примере я обернул в удобный "метод" только одно действие - запрос к БД, который возвращает либо результат, либо null. На деле же естественно можно и даже нужно обернуть в такие вот "методы" все необходимые действия с базой данных: подключение, закрытие соединения, запрос на запись или апдейт в таблицах БД и пр..
3. Классы
Теперь же если взглянуть на этот набор "методов", можно увидеть, что совершают они один тип действий - работа с БД. И как вы думаете, разве не стОит их объеденить в один общий пласт? ну конечно же стОит
Объединение (не процесс объединения, а содружество функций) нескольких методов, которые выполняют один некий тип действий, это и есть - класс.
На самом деле использовать слово "метод" я стал не с проста, ведь функции находящиеся в классах именно так и называются - методы.
Итак, теперь вы уже знаете что такое метод класса Существуют еще и свойства объекта (вон как все запущено). Но об этом немногим позже.
4. Объекты
Для того чтобы вызвать функцию, её сперва нужно определить и описать выше по коду. Так и с объектами. Объект, это то что мы описали в классе. Т.е. класс это прототип будущего объекта. Сперва мы описываем класс с его методами и свойствами, а затем создаем объект на основе описанного класса:
// означает что мы будем обращаться внутри самого объекта,
// а вот этот значок -> говорит ЧТО именно мы будем изменять
// вот и получается, что меняем мы ТУТ ВНУТРИ ОБЪЕКТА ($this) свойство $name
// на значение, которое пришло в аргументе в наш метод $str
$this->name=$str;
}
function getMyName(){
// а тут мы просим вернуть нам значение внутреннего свойства нашего объекта
return$this->name;
}
}
// создаем наш объект на основе описанного класса
$object= MyFirstClass;
// устанавливаем значение свойства нашего объекта
// нужно заметить, что тут у нас есть волшебный значок ->,
// однако мы обращаемся к методу извне, поэтому $this использовать нельзя,
// нужно обращаться к самому объекту
$object->setMyName("Вася");
// теперь проверим установилось ли значение?
echo$object->getMyName();
// выведет "Вася"
?>
Если пытаться вызвать метод объекта который еще не создан - произойдет ошибка.
Собственно это как сходить пописать из несуществующей пиписьки.
Со свойствами та же история.
Однако самое интересное, это то, что внутри класса можно обращаться через $this не только к свойствам, но и к методам. Более того, любое свойство может содержать в своем значении число, строку, массив, объект и даже массив объектов. Методы могут манипулировать всеми этими свойствами. Например вот такая интересная запись:
... запись говорит о том что мы обращаемся к методу methodOfProperty() объекта $property который лежит в объекте $object в качестве его свойства.
Вложенность не ограничена.
Но самый главный плюс использования ООП в написании web-приложений это то, что единожды написав класс для работы с чем либо, больше НЕ придется писать еще, еще и еще раз одно и то же в каждом новом проекте. Кроме того если вдруг захочется какой либо класс переделать внутри, то совершенно не придется перелопачивать код приложения ВНЕ этого класса.
Продолжение следует...
P.S. Хотелось бы узнать от новичков насколько понятным языком я изъясняюсь и стОит ли продолжать в таком же духе далее.
P.P.S. Хотел бы сказать профессионалам, а именно модераторам, что если что-то стоит изменить/добавить, то, конечно, всегда пожалуйста.
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Это интересно, написано понятно. Хотелось бы только услышать мнение когда нужно использовать ООП, а когда не стоит.
DeepVarvar
Отправлено: 12 Ноября, 2011 - 20:10:22
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
tuareg пишет:
когда нужно использовать ООП, а когда не стоит
Хм...
Вобще, если уж начали писать объектами, то иначе и не выйдет продолжить.
Дело в том, что, да, ходит такая "утка" типа "ну сколько уже можно пихать это ООП".
Однако если посмотреть в исходники фреймворков - там только ООП.
На самом деле в статейке не раскрылось и одной десятой доли преимуществ ООП против "макарон".
Не все сразу.
Могу сказать на вскидку, что проекты с сложной логикой нужно делать на ООП, иначе дебажить не передебажить...
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
Классы помогают разбить вашу программу на логические и независимые блоки, которые можно в любой момент заменить или изменить, что сказывается на качестве программы, оптимизации, возможности в будущем легко разобраться в коде и исправить нужные детали.
Со стороны новичка сразу будет заметно, что теперь если размер кода в файле будет составлять более 100кб - его все равно будет легко читать и проследить, что происходит.
tuareg
Отправлено: 12 Ноября, 2011 - 20:43:53
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Спасибо, тогда буду ждать новых статей
caballero
Отправлено: 12 Ноября, 2011 - 20:49:41
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Хотелось бы только услышать мнение когда нужно использовать ООП, а когда не стоит.
Это примерно как спросить мнение когда нужно использовать функции или массивы. Когда есть смысл и необходимость для решения конкретной задачи тогда и нужно.
Или ты думал будет четкий ответ типа - используем ООП после 126 строки кода?
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Цитата:
К тому же мое мнение - не стоит перегружать не понимающий мозг лишней информацией.
Когда тебе про что-то рассказывают, даже у недоразвитых первым возникает вопрос: "Зачем мне это?" В любой книге первой главой идет "ля кого эта книга, зачем вам это нужно" ... вы сами понимаете, чем ООП отличается от процедурного программирования, АОП и тд ?
caballero
Отправлено: 12 Ноября, 2011 - 20:58:10
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
написано на си - чистый функциональный язык
С - процедурный язык а не функциональный
Цитата:
преимуществ ООП против "макарон"
Если человек пишет по китайски никакое ООП не поможет
можно и без ООП написать акуратный код и наоборот
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Я не об этом. Я использую на сайте jQeury.
Допустим вывод новостей. Я понимаю, что этот вывод можно сделать через плагин или виджет. Оцениваю возможность(+/-) пишу плагин или виджет.
Используя MySQL, я вижу что мне нужно будет сделать от 2 до N запросов. Я не думая сразу же пишу процедуру. Вот к чему я это и спрашивал
caballero
Отправлено: 12 Ноября, 2011 - 21:02:24
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Я понимаю, что этот вывод можно сделать через плагин или виджет. Оцениваю возможность(+/-) пишу плагин или виджет.
Используя MySQL, я вижу что мне нужно будет сделать от 2 до N запросов. Я не думая сразу же пишу процедуру. Вот к чему я это и спрашивал
Точно так же и с ООП. Я пишу код.
я "понимаю" или "вижу" что тут нужен класс и я его делаю
нет никаких критериев где использовать ООП а где нет кроме опыта приобретенного практикой
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Цитата:
С - процедурный язык а не функциональный
Блин , меня не в ту степь понесло, сори. В общем - надо объяснить, чем одно отличается от остального и зачем оно нужно, в чем преимущества
DeepVarvar
Отправлено: 12 Ноября, 2011 - 21:06:28
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Stierus пишет:
чем ООП отличается от процедурного программирования
Ыыыы....
Вот этим: ->
Конечно понимаю. Но я и слова не сказал о том, зачем это надо кому-то там.
Если читают, значит надо. Мне в свое время было очень сложно понять что же имел виду автор. Когда я читал начало, то самое "зачем мне это надо", я понимал о чем речь.
Вах, вах, вот мол так и так и все такое расписное да красивое...
А вот когда автор переходил к объяснению реализации, все - ступор от того, что автор бросается не понятными терминами, которые ему, конечно понятны, а мне - нет.
Да и как они могут быть мне понятными то?
----
Здесь же, напротив, я преднамеренно отказался от описания "зачем им это надо".
И попытался объяснить реализацию.
И даже задал в окончании вопрос к ним: понятно ли я излагаю?
Stierus пишет:
В любой книге
Да, я тоже подумал о книгах, когда писал что в одну статейку это не влезет всеравно. (Добавление) Stierus если хотите, дополните, я даже не то что не возражаю, я даже хотел бы чтобы вы добавили туда описание "зачем оно надо и чем отличается". (Добавление)
Могу даже выделить ключевые пункты всей статьи.
Большего я в ней и не преследовал.
А именно, медленно, но верно двигаться по пути осознания:
1) функции
2) "сообщество" функций
3) сначала логика, затем вывод
4) классы и методы
5) немного информации о возможностях
Все остальные плюшки, такие как приват, паблик, статик, синглтон, область видимости, наследование, интерфейсы - это слишком много для начала.
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Мне кажется, что идеальным вариантом для того чтобы проникнуться ООП.
Взять какой-то пример(сам не знаю какой )
И расписать его в стиле процедурного и ООП программирования. Тогда сразу были бы видны все +/- указанных подходов(легкость изменения и т.д)
DeepVarvar
Отправлено: 12 Ноября, 2011 - 21:58:39
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
tuareg это не возможно.
Дело в том что как уже сказали выше, реализовать конечно можно и так и так.
Но это не будет верным..
Слишком разные принципы.. (Добавление)
Я постараюсь найти "живой" пример и выполнить вашу просьбу.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.