За последние 24 часа нас посетили 50311 программистов и 1690 роботов. Сейчас ищут 1100 программистов ...

ООП

Тема в разделе "PHP для новичков", создана пользователем host, 2 авг 2007.

  1. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Автору топика. PHPInside #18. Советую прочитать статью Практические стороны ООП в PHP.
     
  2. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Sergey89
    Спасибо. Обязательно почитаю
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Те, кто не чуят разницу, при этом ещё и упёрлись рогами - встретимся через годик, за который я надеюсь вы поднатаскаетесь в ООП - тогда и поговорим о принципиальной разнице между этими двумя вариантами.
     
  4. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Psih
    Специально для тех, кто топики не читает, а просматривает - http://php.ru/forum/viewtopic.php?p=57911#57911
    И к твоему сведению, в ООП я разбираюсь не хуже тебя. Просто надо немного думать, где ООП имеет смысл применять, а где нет, и не пихать его куда попало.

    Еще раз, для тех умников, которые прибегают в тему с выпученными глазами и начинают орать, мол, ООП это будущее, а вы тут тормозите научно-технический прогресс - ПХП не Ява! Даже в Яве перед написанием слова "class" нужно немного думать головой. А в ПХП и подавно. Я не знаю, что еще можно к этому добавить. Если опять напишут "но ведь классы это круто!" и в десятый начнется сказка про белого бычка, я наверное свалю отсюда. Достало.
     
  5. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    не, ооп лучше изучать на базе яваскрипта, иначе будешь мыслить штампами типа "объект - это экземпляр некоего класса", "чтобы добавить метод нужно создать класс-наследник" и прочими
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Читал я, читал. Вы мыслите функциями а не объектом в целом. Придераетесь к кол-ву методов, тому, что объект нужно инициализировать и.т.д. Я даже не хочу начинать спорить, потому что в итоге всё выльеться в то, что при объектном подходе получиться больше кода. Вы не думаете о том, что мест применения может быть 10, 20, даже больше. И что будет если писать в каждом из этих мест если всё делать функциями, и что будет если писать это с помощью объекта типа Date.
     
  7. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Интересно, среди тех кто оставил более 1-го или 2-х сообщений в этом топике (т.е фанаты холиварщики) прочитали хоть раз в жизни http://phpclub.ru/detail/article/oop-vs-proc ?
     
  9. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Vladson, статья ни о чём..
     
  10. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    +1
    тема не раскрыта. ))
     
  11. Davil

    Davil Guest

    и не закрыта =))
    go дальше холиварить... ни о чем... =))

    P.S. http://ru.wikipedia.org/wiki/ООП
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    По поводу
    Код (Text):
    1. $b= new Date ();
    2. //vs.
    3. $b=time();
    В чём разница между процедурами и ООП подходом?

    1). В случае процедуры вам нужно применять разные функции для получения даты в зависимости от того, нужно ли вам текущее время или какая-то определённая дата. Объект может по умолчанию инициализироваться с текущим временем, но если ему передана дата/timestamp - он инициализируеться с указанной датой. В итоге у нас везде идёт одинаково: $b = new Date(); с единственной разницой что у него может быть параметр а может не быть.
    2). Объект в себе может хранить дату в каком-то конкретном формате вне зависимости от того, какой формат вы ему передали и какой вам нужен от него - он сам приобразует в указанный вами формат при выводе, который можно указать в конструкрое вторым параметром к примеру или методе получения даты. Вам не нужно помнить что у вас одна дата таймстамп а другая строка к примеру и перед вычислениями вам нужно преобразовать их к одному формату и в зависимости от формата ещё и применить одну или другую функцию.
    3). Найти потом в коде все места где есть объект проще чем набор функций (функций много, а у объекта название всегда одно).
    4). Калькуляции можно выполнять в пределах объекта а не отдельными функциями. Вообщем объект сам с собой может делать ВСЁ что ему надо.

    Вобщем-то те, кто скажут, что в данном случае не такая уж и большая разниа будут правы. Слишком мелка задача для целого класса, что бы бло разумно его создавать. Редко кому требуеться делать много вычислений и манипуляций с датами на PHP. Лично я с датами почти всегда работаю на уровне базы данных в SQL - там проще. А люди, работающие с всякими финансовыми штуками врядли делают это на PHP :)

    Вообщем пример на самом деле неудачен, хотя частично и тут ООП может себя проявить, но всё-же для большинства мои доводы будут в пустую.

    Я вижу нишу ООП в PHP - это CMS, CMF и всякие большгие вещи, где всего много и что-бы там не запутаться нужно исползовать ООП, что бы не погрязнуть в хаосе функций.
     
  13. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Psih, пример и правда никакой :). Да и вопрос ведь не о том, в чём разница, а зачем вообще ООП нужен :).

    Ща я попробую.

    host, пример приведённый тобой в первом посте очень плохой. Для такого класс действительно не нужен, даже отдельная функция и то перебор. Выкини этот учебник :). ООП нужен тогда, когда необходимо объеденить несколько функций. Я покажу, как мне думается, внятный пример, когда использовать функции это тупо и вообще бяка, а ООП самое оно.

    Читаем файл в php
    PHP:
    1. $fp = fopen('filename.txt', 'r');
    2. echo fread($fp, filesize('filename.txt')); // fread() тоже имеет алиасы, и это самое страшное в php - алиасы
    3.  
    4. // или так
    5. readfile('filename.txt');
    6.  
    7. // или так
    8. echo file_get_contents('filename.txt');
    9.  
    10. // даже так
    11. fpassthru('filename.txt');
    12.  
    13. // ты не поверишь, но и так
    14. echo join('', 'filename.txt')); // этот пример приводят на сайте php.net, как адекватный, так что в кучку
    15.  
    Читаем файл в python`е
    Код (Text):
    1. print open('filename.txt').read()
    Как было бы хорошо с ООП в php
    PHP:
    1. $open = new open('filename.txt');
    2. echo $open->read();
    Всё очень просто и внятно.

    Теперь, почему (точнее, "когда") ООП бяка, а функции хорошо.
    PHP:
    1. function hey($arg = 41){
    2.  // простые операции
    3.  return $arg
    4. }
    5.  
    6. echo (string)hey(); // переводим число в строку
    7.  
    PHP:
    1. class Hey {
    2.  function hey($arg = 41){
    3.  // простые операции
    4.  $this->arg = $arg;
    5.   return $arg;
    6.  }
    7.  function __toString(){ // переводим число в строку
    8.   return $this->arg;
    9.  }
    10. }
    11.  
    12. $hey = new Hey;
    13. echo $hey->arg;
    Во втором примере я пропустил все нудности.

    Как видишь, тут для простой задачи учудили целую катавасию с классом.

    P.S. И не слушай любителей Java, они вообще для всего классы городят, потому что банально иначе не умеют. :)
     
  14. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
  15. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Люди, можете поздравить, теперь понятно зачем ООП дано. На практике применил, удобно, и самое главное можно добавлять всякое причем все будет работать по описанному принципу.
     
  16. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Здравствуйте, наткнулся в учебнике, но по-моему здесь что-то не то.
    Вот код:
    PHP:
    1. <?php
    2. Class Integer
    3. {
    4.     private $number;
    5.     public function GetInt()
    6.     {
    7.         return (int)$this->number;
    8.     }
    9.    
    10. }
    11.  
    12. Class Float
    13. {
    14.     private $number;
    15.     public function GetFloat()
    16.     {
    17.         return (float)$this->number;
    18.     }
    19.    
    20. }
    21.  
    22. Class Math
    23. {
    24.     public function add ($a1, $a2)
    25.     {
    26.         return $a1->GetFloat() + $a2->GetFloat();
    27.     }
    28. }
    29.  
    30. ?>
    Мне кажется, что в этой строчке что-то не то:
    Код (Text):
    1. return $a1->GetFloat() + $a2->GetFloat();
    Скажите верна ли эта строка?
     
  17. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Верна. Но в Math::add можно передать только объекты Float.
    ps это целый пример или там ещё что-то есть?
     
  18. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Sergey89
    Это целый пример.
    Код (Text):
    1. return $a1->GetFloat() + $a2->GetFloat();
    Да, но в классе Math нет метода GetFloat, он же в другом классе, причем возвращает $this->number
    + Какая связь между $a1 и $this->number ?
     
  19. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    host подразумевается, что ты будешь передавать в add объекты. $a1 - экземпляр класса Float.


    Что за учебник?
     
  20. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Джонн Коггзолл РНР5 Полное руководство
    :) Спасибо, Sergey89

    PS Примерчик можно ? :D
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $math = new Math();
    3. print $math->add(new Float(), new Float());
     
  22. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Sergey89
    Но в методе add должны быть также и переданны числа ($a1, $a2), иначе нет смысла такое вытворять.
     
  23. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    добавь конструктор
    PHP:
    1. Class Float {
    2.     private $number;
    3.  
    4.     public function __construct($num) {
    5.         $this->number = $num;
    6.     }
    7.  
    8.     public function GetFloat() {
    9.         return (float)$this->number;
    10.     }
    11. }
    PHP:
    1. print $math->add(new Float(12.7), new Float(46.3));
     
  24. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Думаю последний вопрос: В каких случаях используется такой вид: MyClass::Method ? (static) ...