ОПП и классы..

Автор kak2z, 22 сентября 2014, 18:12:13

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kak2z

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


<?php

class MyClass
{
    public 
$prop1 "Свойство класса ";

    public function 
setProperty($newval)
    {
        
$this->prop1 $newval;
    }

    public function 
getProperty()
    {
        return 
$this->prop1 "<br />";
    }
}

// Создаем два объекта
$obj = new MyClass;
$obj2 = new MyClass;

// Получаем значения $prop1 из обоих объектов
echo $obj->getProperty();
echo 
$obj2->getProperty();

// Устанавливаем новые значения свойств для обоих объектов
$obj->setProperty("Новое значение свойства");
$obj2->setProperty("Свойство принадлежит второму объекту");

// Выводим значения $prop1 для обоих
echo $obj->getProperty();
echo 
$obj2->getProperty();

?>



я не могу понять зачем так все усложнять...

1. Вот вижу создаются объекты. Нафига их создавать эти объекты? Ведь это теже самые переменные которыми я все время пользуюсь. Да благодаря классу им назначается значение по умолчанию, но я и так могу назначить им значение по умолчанию без класса..
2. Идем дальше устанавливаются новые значения свойств для обоих объектов. Зачем так усложнять? если уже объявил две переменные и назначил им значения, то что я не могу им дать новые значения?? Могу.. отлично даже могу это сделать..
3. Дальше мы выводим значение свойст на экран.. а что я не могу таким же образом вывести значения моих переменных.

Да я понимаю что класс может выполнять какие то подсчеты, операции с БД и т.п. Но я сейчас все тоже самое делаю с помощью функцию и вообще не ощущаю необходимости еще в чем то..

к примеру есть у меня функция которая создает массив объекта function CreateMyObject ().
в функцию я передаю значение какое то допустим id объекта в БД.
Хочу получить данные объекта 1 делаю запрос $object1 = CreateMyObject ('1');
хочу получить данные объекта 777 делаю запрос $object777 = CreateMyObject ('777');
и получаю тоже самое.
Хочу внести изменения в объект - запускают функцию ModifyObject и вуаля..
вот ответьте чем классы лучше? Ведь реально запись класса это вынос мозга..
чем это ОПП так хорошо и чем так плохо структурное програмирование?

П.С. Занялся этим делом потому что интересно и хочется понять почему про него столько разговоров.. может я действительно динозавр которые не хочет принимать что то новое и хорошее.
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

digger®

Цитата: kak2z от 22 сентября 2014, 18:12:13Ведь реально запись класса это вынос мозга..
А я вот кровавыми слезами плачу, когда в код SMF смотрю с его кучей функций плохо структурированных и документированных, где большая часть данных передается через глобальные переменные, которые неизвестно где в эти переменные попадают и неизвестно где их сто раз поменяли по дороге, пока они дошли до того места, где ты их выловил и хочешь использовать. И на каждом шагу воткнуто if(!empty()), потому что неизвестно, вообще, существует в данный момент нужная переменная или нет.

kak2z

Цитата: digger® от 22 сентября 2014, 19:15:38
А я вот кровавыми слезами плачу, когда в код SMF смотрю с его кучей функций плохо структурированных и документированных, где большая часть данных передается через глобальные переменные, которые неизвестно где в эти переменные попадают и неизвестно где их сто раз поменяли по дороге, пока они дошли до того места, где ты их выловил и хочешь использовать. И на каждом шагу воткнуто if(!empty()), потому что неизвестно, вообще, существует в данный момент нужная переменная или нет.
можете посоветовать какой нибудь небольшой простой движок который построен с учетом принципов ОПП??
хочется на примере посмотреть, но не хочется движки монстры разбирать.. что то небольшое но правильно построенное хочется увидеть работу скрипта и ОПП на практике.
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

digger®

Цитата: kak2z от 22 сентября 2014, 19:29:26
можете посоветовать какой нибудь небольшой простой движок который построен с учетом принципов ОПП??
хочется на примере посмотреть, но не хочется движки монстры разбирать.. что то небольшое но правильно построенное хочется увидеть работу скрипта и ОПП на практике.
Посмотри любой PHP микрофреймворк - Silex, PHPixie, Fat-Free и уроки, типа, как сделать блог за 10 минут на фреймворке XYZ.
Код пиши не в блокноте, а в какой-нибудь IDE, сразу почувствуешь разницу между $context['member']['icq'] и $member->icq :)

kak2z

Цитата: digger® от 22 сентября 2014, 19:50:00а в какой-нибудь IDE,
а что посоветуете?? а то я только блокнот++ пробовал и все))
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)


kak2z

Цитата: digger® от 22 сентября 2014, 20:10:24
Можно начать с бесплатной NetBeans
спасибо)) скачал)) вроде неплохо.. единственное что немного раздражает, так то что заменяет табуляции на пробелы.

я по прежнему читаю про ОПП..  и по прежнему не понимаю удобства...
вот допустим мне на форуме надо сделать выборку первых постов топиков и отобразить их на какой то странице, например мне надо 100 топиков взять
1. как я это вижу при процедурном подходе - собрал mysql запрос, взял данные из smf_messages, smf_topcis, smf_attachments плюс взял карму... на это у меня уходит несколько запросов к базе и на выходе я получаю многомерный массив с топиками, первыми сообщениями в топиках, с вложениями в первом посте топик ну и значение кармы.. все просто..
потом этот массив я кручу верчу сортирую.. в общем что хочу то и делаю.

2. если я использую ОПП подход..
как я это понимаю..
у нас есть класс который позволяет получить первый пост топика с вложениями и кармой...
есть свойства ИД топика
есть метод чтения данных из таблицы smf_topics
метод получения  из таблицы smf_messages поста который относится к топику из верхнего метода
метод для получения вложений которые относятся к посту который мы взяли в smf_messages
и метод для получения кармы поста...
то есть получается я в каждом методе дергаю базу...

используя этот класс я создают 100 объектов и потом уже вывожу их на страницу...

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

или мое представление про ОПП в данном случае неверно?
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

iaroslav

Моё глубочайшее имхо что классы нужны для каких-то сложносочинённых действий, с кучей изменяемых переменных и прочего. То есть чего-то для чего одна функция уже не справляется и приходится делать несколько постоянно вызывающих друг-друга функций.
А если класс можно без проблем заменить всего одной функцией то лучше всё же заменить.

Кстати вроде как используя класс можно не создавать 100 объектов. А просто сделать один объект выводящий что надо куда надо и его гонять. Вроде как разные объекты всё-таки нужны для оперирования чем-то что должно работать параллельно друг с другом, друг-друга не изменяя. В случае же вывода на страницу такого не требуется.

Впрочем я и сам человек бесконечно далёкий от классов.

kak2z

Ну как я это вижу, еще раз объясню))
1. Процедурный подход - создал функцию которая делает выборку из базы, компонует как надо, а потом возвращает массив данных.
2. ООП подход. Топик это объект. Один класс включает в себя все методы для работы с топиком. Много объектов это много топиков. Для того что бы получить выборку топиков надо создать кучу объектов.
Только вот если я массив могу отсортировать, то как объекты сортировать я еще не понял.. но уверен есть какие то инструменты для этого.
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

digger®

Цитата: kak2z от 23 сентября 2014, 16:08:02вот допустим мне на форуме надо сделать выборку первых постов топиков и отобразить их на какой то странице, например мне надо 100 топиков взять

$topics = Topic::getAllFirstPosts()->orderBy('published_at', 'desc')->paginate(100);

foreach ($topics as $topic) {
  echo $topic->title;
}


getAllFirstPosts() - метод который одним запросом получит нужные данные из базы, отсортирует и выдаст массив объектов.


kak2z

ну да.. запись лаконична..
правда я еще не видел такой записи где два указателя ->
Цитировать$topics = Topic::getAllFirstPosts()->orderBy('published_at', 'desc')->paginate(100);
смысл понял, но как это не знаю еще))
спасибо)
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

kak2z

а я вот что только что понял...
Класс это грубо говоря симбиоз переменной и функции.
По мере выполнения скрипта сохраняет значение, но и может менять его в случае его если вызываешь с параметрами или передаешь переменные в его свойства..
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

kak2z

Диггер, подскажите пожалуйста)
$topics = Topic::getAllFirstPosts()->orderBy('published_at', 'desc')->paginate(100);
а где написано про эти каскадные вызовы методов?
как я понимаю тут надо идти справа - налево
1. Сначала paginate(100) - берем 100 записей
2. Потому orderBy('published_at', 'desc') - сортируем их по дате публикации
3. потом берем getAllFirstPosts() только первые посты
4. и все это получаем в переменной $topics.

а еще не понял почему тут Topic::getAllFirstPosts()  функция вызвана без создания класса? зачем такой ход нужен? где про это почитать)) я попытался сделать такую конструкцию)) мне сказало " Non-static method Test::firstFunc() should not be called statically"
Спасибо))
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

digger®

Цитата: kak2z от 27 сентября 2014, 20:56:29а где написано про эти каскадные вызовы методов?
Это конструктор для передачи параметров. Тут уже про ORM, скорее.

Цитата: kak2z от 27 сентября 2014, 20:56:29а еще не понял почему тут Topic::getAllFirstPosts()  функция вызвана без создания класса? зачем такой ход нужен? где про это почитать)) я попытался сделать такую конструкцию)) мне сказало " Non-static method Test::firstFunc() should not be called statically"
Это статический метод, он для того и нужен чтобы можно было обращаться к методам без создания экземпляра класса.
Нужно static public function объявить в классе, чтобы так можно было обращаться.

GeorG

Цитата: kak2z от 27 сентября 2014, 20:56:29а еще не понял почему тут Topic::getAllFirstPosts()  функция вызвана без создания класса? зачем такой ход нужен? где про это почитать))
Я пытаюсь не в вмешиваться в разговор, потому что считаю его не форумной темой, а чем-то примерно в виде толстого учебника.
Примерный ответ, по тому что спрашивается - тут
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

kak2z

Цитата: GeorG от 29 сентября 2014, 13:36:41
Я пытаюсь не в вмешиваться в разговор, потому что считаю его не форумной темой, а чем-то примерно в виде толстого учебника.
Примерный ответ, по тому что спрашивается - тут
читаю)) кучу разных самоучителей нарыл и читаю)) спасибо большое))
просто возникает иногда вопрос)) а как его искать в гугле не знаю)) потому что не знаю что искать, как это называется))
я вон искал "каскадный вызов методов" - сам придумал что так может называться)) ничего не нашел))
а оказывается это называется "цепочки вызовов))"
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

Серый Лис

#16
Тоже не хотел бы вмешиваться. Не припомню ни одного случая чтобы digger®  не знал ответ на любой из вопросов по smf.  А если что то такое по smf,  чего не знает digger®?  (хотя подпись под ником более чем убедительна)

Mavn

кстати говоря есть довольно интересный курс на тему ооп и классов. для новичков как раз. там довольно понятно все рассказано на эту тему.\
https://www.udemy.com/object-oriented-programming-in-php/
только написал что курс бесплатный ... как решил перепроверить... оказался платным.... на сколько я помню взял этот курс без денег, наверное акция какая-то была или еще что-то. в общем если немного подождать то я думаю можно будет и бесплатно взять или за какие-то смешные деньги.
SimpleMachines Russian Community Team
п.1 Пройду курсы гадалок для определения исходного кода по скриншоту.

п.2 У вас нет желания читать правила раздела, у меня нет желания одобрять темы, которые не соответствуют этим правилам.