За последние 24 часа нас посетили 18644 программиста и 1604 робота. Сейчас ищут 1005 программистов ...

YII заморочил совсем

Тема в разделе "PHP для новичков", создана пользователем kakadyi, 24 сен 2015.

  1. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Зачем использовать метод
    Код (Text):
    1. Yii::$app->getSecurity()
    , который возвращает компонент сесурити, если я могу напрямую вызвать
    Код (Text):
    1. Yii::$app->security
    и эффект будет тот же?
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    для разнообразия.
     
  3. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    А если без подколок?
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а если без подколов то по принципу ООП свойство security должно быть скрыто (protected) и получить его можно только через getSecurity, но РНР в этом месте не очень дружит с ООП и по этому как правило такие свойства открыты (public).
     
  5. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    По принципу ООП так-то оно так, но $security - это Public Properties, согласно документации. С такой логикой, если бы $security был бы приватным или защищенным свойством - у меня бы и вопросов не возникало, потому что тогда бы код
    Код (Text):
    1. Yii::$app->security
    элементарно вывалился в Fatal Error. То есть две реализации совершенно одинакового способа, как наподобии echo и print. Вот и вопрос - зачем?
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    не принято в РНР скрывать свойства, вот и все, или там 10 свойств по мимо security и все они скрыты?
     
  7. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Все открыты. Если не принято скрывать свойства - тогда зачем вообще разработчики ввели этот геттер? Явно же не для красоты и разнообразия?
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    известно почему, потому что скрывать не принято, а вот геты и сеты они пишут как говорится по памяти, из других языков, там где это принято исходя из принципов ООП. Такой казус.

    что ты обращаешься к свойству на прямую, что через getSecurity разницы ни какой.
     
  9. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Забавно:)Спасибо Вам за ответы:)
     
  10. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Увы, но для красоты и разнообразия.
    Про "не принято", это забудьте. Как будто этого разговора не было.
     
  11. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Да уж. Я-то думал, что фреймворки облегчают написание кода, а тут такое:)
     
  12. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Тут на самом деле не сколько "красота", сколько не навязывание своего стиля. Т.е. программист может сам выбрать, как ему удобнее писать.

    Добавлено спустя 1 минуту 48 секунд:
    К инкапсуляции это отношения не имеет. На самом деле публичные свойства в PHP тоже не сильно нарушают инкапсуляцию, ибо останется механизм перехвата обращения к ним через магию в случае необходимости.
    Не самый красивый способ, но в некоторых случаях он предпочтительнее, чем рождение пустых геттеров/сеттеров.
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Кем не принято?
     
  14. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Теми, кто не любит "геттеры ради геттеров". А вообще это вид холивара такой.
     
  15. nek

    nek Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    23
    Симпатии:
    1
    Если для свойства существует метод-геттер или метод-сеттер, то его можно вызывать через конструкцию $object->getField($args), передавая аргументы, что недостижимо для обращения через $object->field.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Да, просто никто из отвечающих не знает Yii2. Когда вы пишите Yii::$app->security, магический метод __get(), определённый в базовом классе yii\base\Object, который на вершине иерархии классов Yii, вызывает getSecurity() скрыто. Поэтому здесь это одно и то же. Читайте доки и исходные коды: https://github.com/yiisoft/yii2/blob/master/framework/base/Object.php
     
  17. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    На самом деле нет, вы тоже не очень знаете ;)
    Yii::$app->security вызывает ->get('security')
    и Yii::$app->getSecurity() вызывает ->get('security');
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  19. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вроде это перегрузка называется, а не магия.
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764