За последние 24 часа нас посетили 31876 программистов и 1821 робот. Сейчас ищут 1044 программиста ...

ООП

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

  1. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    Здравствуйте, можете помочь сделать инкапсуляцию, наследование и полиморфизм? (пример 3 в одном, желательно с комментариями). Заранее спасибо.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Куда тебе что надо сделать?
     
  3. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    да сказали простой пример, чего угодно, хоть например юзеры, админ, редакторы и т.д. наследование я понимаю и могу привести пример, а вот инкапсуляция (именно использование) с полиморфизмом не могу
    ну чтобы несколько полей и методов каких-нибудь простых было
     
    #3 artemka, 8 сен 2017
    Последнее редактирование: 8 сен 2017
  4. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А на работе потом за тебя работать тоже мы будем? Может потрать сколько-то времени, да сам научись?
    --- Добавлено ---
    Ну гляди, инкапсуляция - это сокрытие реализации под капотом. Если у тебя есть приватные методы и свойства, используемвые при работе объекта, то это уже инкапсуляция. Да даже если неприватные.. Суть в том, что у объекта есть ряд методов, торчащих наружу, все. Остальное скрыто в черном ящике, инкапсулировано. Например, есть какое-то свойство. Ты можешь отдавать или сохранять его напрямую, а можещь через специальные методы - геттеры и сеттеры. При этом у этого присвоения и чтения может быть даже определенная бизнес-логика, отличная от простого чтения/записи в лоб.

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

    Полиморфизм же - это про переопределение классов, про использование производных в роли базовых, про "утиную типизацию" в том числе..в ряде случаев.
     
  5. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Полиформиз
    PHP:
    1. class Person {
    2.     public function tryToSearchInGoogle(){
    3.         return true;
    4.     }
    5. }
    6.  
    7. class Artemka extends Person {
    8.     public function tryToSearchInGoogle(){
    9.         return false;
    10.     }
    11. }
    Инкапсуляция
    PHP:
    1. class Artemka {
    2.     private function wannabeProgrammer(){
    3.         return false;
    4.     }
    5.     public function whoami(){
    6.         return $this->wannabeProgrammer();
    7.     }
    8. }
     
    _ne_scaju_ и Dimon2x нравится это.
  6. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    PHP:
    1.  <?
    2. class GuestBook
    3. {
    4.     private $name;
    5.     private $email;
    6.     private $msg;
    7.  
    8.  
    9.  
    10.     public function getName()
    11.     {
    12.         return $this->name;
    13.     }
    14.     public function getEmail()
    15.     {
    16.         return $this->email;
    17.     }
    18.     public function getMsg()
    19.     {
    20.         return $this->msg;
    21.     }
    22. }
    23. ?>
    это же тоже инкапсуляция, правильно? обращаться к полям из др класса мы можем с помощью публичных методов. так?
     
  7. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Инкапсуляция - это скрытие переменных в классе от пользователя. Т.е. все переменные (свойства) класса вы делаете private, а методы public.
     
  8. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    ну как я и сделал же, правильно?
     
  9. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    и еще вопрос

    PHP:
    1. class User{
    2.  
    3.     private $name;
    4.     private $password;
    5.     private $email;
    6.  
    7.     public function getName()
    8.     {
    9.         return $this->name;
    10.     }
    11.  
    12.     public function getEmail()
    13.     {
    14.         return $this->email;
    15.     }
    16.  
    17.     public function getPassword()
    18.     {
    19.         return $this->password;
    20.     }
    21. }
    22.  
    23. class Admin extends User{
    24.  
    25.  
    26.     public function getName(){
    27.        
    28.         $this->name = "Артем";
    29.     }
    30.  
    31. }
    32.  
    33. class Noadmin extends User{
    34.  
    35. }
    у меня есть класс user. Как мне в классе админ задать ИМЯ?
    PHP:
    1. public function getName(){
    2.      
    3.         $this->name = "Артем";
    4.     }
    так не работает из-за PRIVATE
     
  10. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Да, правильно.
    Все правильно. Ты написал private $name - следовательно это работает только на этот класс(User). protected работает на этот класс(User) и все последующие классы(т.е. Admin и т.д.), которые наследуют этот класс.
    --- Добавлено ---
    Измени на protected $name - тогда все будет нормально.
     
  11. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    PHP:
    1. <?php
    2.  
    3. class User{
    4.  
    5.     protected  $name;
    6.     protected  $password;
    7.     protected  $email;
    8.     protected  $status;
    9.  
    10.     public function getName()
    11.     {
    12.         return $this->name;
    13.     }
    14.  
    15.     public function getEmail()
    16.     {
    17.         return $this->email;
    18.     }
    19.  
    20.     public function getPassword()
    21.     {
    22.         return $this->password;
    23.     }
    24.  
    25.     public function getStatus()
    26.     {
    27.         return $this->status = 'Undefined';
    28.     }
    29.  
    30.  
    31. }
    32.  
    33. class Admin extends User{
    34.  
    35.  
    36.     public function getName(){
    37.         echo 'Admin name:' . $this->name = "Artem";
    38.     }
    39.  
    40.     public function getEmail(){
    41.         echo 'Admin email:' . $this->email = "temchan5@list.ru";
    42.     }
    43.  
    44.     public function getStatus(){
    45.         echo 'Status:' . $this->email = "Admin";
    46.     }
    47.  
    48. }
    49.  
    50. class Noadmin extends User{
    51.     public function getName(){
    52.         echo 'Noadmin name:' . $this->name = "Pavel";
    53.     }
    54.  
    55.     public function getEmail(){
    56.         echo 'Noadmin email:' . $this->email = "pavel@list.ru";
    57.     }
    58.  
    59.     public function getStatus(){
    60.         echo 'Status:' . $this->email = "No admin";
    61.     }
    62. }
    63.  
    64. $obg = new Admin();
    65. $obg2 = new Noadmin();
    66. $obg->getName();
    67. echo '<br>';
    68. $obg->getEmail();
    69. echo '<br>';
    70. $obg->getStatus();
    71. echo '<br><br>';
    72. $obg2->getName();
    73. echo '<br>';
    74. $obg2->getEmail();
    75. echo '<br>';
    76. echo '<br>';
    77. $obg2->getStatus();
    78. ?>
    вот сделал инкапсуляцию наследование и полиморфизм. вроде все правильно
     
  12. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Это можно изменить на private, так как ты не используешь это нигде кроме class User {}
     
  13. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    ну да. спасибо что объяснили, вроде как точно понял))