За последние 24 часа нас посетили 30589 программистов и 1476 роботов. Сейчас ищут 895 программистов ...

Статические методы и свойства - это ООП?

Тема в разделе "PHP для новичков", создана пользователем Walk, 21 ноя 2017.

  1. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Является ли функционал, написанный исключительно на одних статических свойствах и методах (речь, разумеется, про PHP) - кодом, написанным на ООП? Объектов же не будет.

    Кто как считает?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Если только статические - нет, не ООП. Именно потому что нет объектов. А классы в этом случае просто в роли модулей. Работал с таким движком, даже несмотря на то, что в целом он не плох, не понравилось.
     
    Maputo нравится это.
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Хотя, конечно, в php умудрились впихнуть даже статический полиморфизм :) Пример - метод ActiveRecord::tableName() из Yii2
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ООП может и является, в очень ограниченном виде, но доброй практикой точно не является.
     
    MouseZver нравится это.
  5. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Это зависит от религии.
    Например, статику можно рассматривать как глобальный объект (разницы нет).
    А можно, как библиотеку функций со своей областью видимости.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Сформулирую так: объект это экземпляр данных, к которому по его природе, применимы определённые действия. С помощью классов мы указываем какие именно действия применимы.

    Когда у нас есть только "полностью статические" классы, у нас нет типизованных экземпляров этих данных. Мы вынуждены оперировать либо массивами, либо обезличенными объектами типа stdClass. Код с массивами может быть выполняется немного быстрее, но он точно менее предсказуем и труднее тестируется. А значит дороже в эксплуатации.

    В последние годы интересы пэхапэшников заметно сдвигаются от "быстрого" к "удобному".
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    nyet
    --- Добавлено ---
    можно, но на ООП это не тянет.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    N.B. В Ларавеле есть Facades. Но там статический вызов используется только для быстрой добычи объекта, а дальше работают не-статические методы.
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ага. Но если в проекте одни синглтоны, то это тоже уже не ООП.
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Формально, статика - ООП. Этож ооп-термин, часть классической ооп-механики и тд. Но если пишешь только на статике, а в резюме указываешь пункт "Владение ООП", то, по факту, лукавишь и сильно.
     
    Maputo нравится это.
  11. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Интересно, а что это за движок? И чем именно не понравилось?

    Интересное утверждение.
     
    #11 Walk, 22 ноя 2017
    Последнее редактирование: 22 ноя 2017
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Самописный, не публичный, был заказ на ряд доработок. Достаточно профессионально написанный, но на статике. Как раз и не понравилось, что из базы возвращаются ассоциативные массивы, а не объекты бизнес-логики. Не от чего унаследоваться. Ну правда, пока я был в границах уже существующего функционала, я писал так, как там уже было написано, когда стал дописывать совсем новый, я нашёл, где вставить нормальные классы.
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Объект - это тип. Что за ООП без единой переменной такого типа?
     
    mkramer нравится это.
  14. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    >> Объект - это тип.
    Серьёзно?
     
  15. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Прям, холивар намечается на пустом месте. Автор спрашивал про проект целиком на статике, а не то как правильно ее применять.

    @Walk, если в классах используются только статические методы (и свойства), то максимум, что можно реализовать из ООП в таком проекте - это наследование. А ООП этим не ограничивается.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    При том, что в языках вроде C++, класс переменной есть её тип, в PHP всё еще это разные вещи. Хотя хинтинг частично смазывает эти понятия.
     
  17. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @[vs]
    PHP:
    1. $object != Class;
    2. $object instanceof Class;
     
    Sail нравится это.
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Самое интересное что да как таковое оно отстутствует. Но при этом можно захерачить наследование. Что в обычных использованиях функций такое было бы не возможно. :)
    --- Добавлено ---
    А наследование у нас пошло от ООП. Ну это так пофилософствовать
    --- Добавлено ---
    я имею ввиду доступность свойств типа static и self
    --- Добавлено ---
    и parent доступность статических функций )
    --- Добавлено ---
    я бы сказал это тянет на уже реализованный объект... Который является единичным экземпляром самого себя.
    --- Добавлено ---
    это как объект в js который мы можем создать и не создавая экземпляра напрямую к нему обращаться.
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Объект это экземпляр класса, а не самого себя. КЛАСС НЕ ОБЪЕКТ, не надо блин путать эти слова.
    --- Добавлено ---
    и не надо сравнивать с js. там всё очень запущено с их прототипами. нет никакой аналогии.
     
  20. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    А я и не говорил этого. Я всего лишь сказал своё мнение на что это похоже по принципу своей работы. Я и не утверждаю что это ООП. Потому что ООП изначально задумывался как чертёж (класс) и станки(создание экземпляра класса т.есть Объект) реализующие детали(результат) по этому чертежу.
    --- Добавлено ---
    @artoodetoo я же написал :
    --- Добавлено ---
    js создадим объект на js. Там даже нет понятия класса. Зато там есть понятие объект. К которому можно обратится на прямую, а можно создать его экземпляр. через new что будет уже новым объектом с теми же условиями что и предыдущий. Наследования на прототипах я не трогал я лишь так привёл аналогию результат работы. Говорю же пофилософствовать.
    --- Добавлено ---
    Но при этом всём создавая статические методы и св-ва мы имеем права обращаться к ним напрямую не создавая экземпляра класса (Объекта). Но мы можем иметь наследование от предыдущего класса. Всё чётко, так именно она и работает. А на что это похоже по тому как выглядит сея работа статики?
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    аминь.
    PHP:
    1. <?php
    2.  
    3. function fn (int $var) {}
    4. function fn2 (object $var) {}
    5. function fn3 (CLassName $var) {}
     
    Maputo нравится это.
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да ты что?
    Так, завязывай раасуждать о том, чего не знаешь. new в JS работает не так. Ни от какого объекта он экземпляр не создает. Через new вызывается конструктор конкретного класса, возвращающий некий объект.
     
    askanim нравится это.
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    норм тема, чу... мало крови только в ооп, где хурма != помидор || картошка != киви
     
  24. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Fell-x27 я думал он ссылку на объект создаёт как в пыхе, если нет то сори не знал как он под коркой работает. Про классы соглашусь не знал и стало аж инетресно...
     
    #24 askanim, 23 ноя 2017
    Последнее редактирование: 23 ноя 2017
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я хз, о чем ты думал, но это вот:
    жесть.

    "Под коркой" даже на старом стандарте, где ключевого слова Class нет, все равно были конструкторы. Конструктором, в данном случае является любая функция. Вообще любая. При обращении к этой функции через new, яваскрипт даст ей отработать, а потом вернет ее this как экземпляр ее "класса". Либо, если функция сама явно возвращает какой-то объект, JS вернет его, а не this функции.

    P.S. Когда что-то утверждаешь или кого-то учишь, желательно знать, о чем говоришь, а не думать, что знаешь. Это опасная ловушка.
     
    #25 Fell-x27, 23 ноя 2017
    Последнее редактирование: 23 ноя 2017