Здравствуйте, можете помочь сделать инкапсуляцию, наследование и полиморфизм? (пример 3 в одном, желательно с комментариями). Заранее спасибо.
да сказали простой пример, чего угодно, хоть например юзеры, админ, редакторы и т.д. наследование я понимаю и могу привести пример, а вот инкапсуляция (именно использование) с полиморфизмом не могу ну чтобы несколько полей и методов каких-нибудь простых было
А на работе потом за тебя работать тоже мы будем? Может потрать сколько-то времени, да сам научись? --- Добавлено --- Ну гляди, инкапсуляция - это сокрытие реализации под капотом. Если у тебя есть приватные методы и свойства, используемвые при работе объекта, то это уже инкапсуляция. Да даже если неприватные.. Суть в том, что у объекта есть ряд методов, торчащих наружу, все. Остальное скрыто в черном ящике, инкапсулировано. Например, есть какое-то свойство. Ты можешь отдавать или сохранять его напрямую, а можещь через специальные методы - геттеры и сеттеры. При этом у этого присвоения и чтения может быть даже определенная бизнес-логика, отличная от простого чтения/записи в лоб. Но снаружи это выглядит как обычное присвоение и обычное чтение. Происходящее под капотом остается под капотом. Остальному приложению вообще пофиг, что там. Есть точка взаимодействия, есть ответ. Полиморфизм же - это про переопределение классов, про использование производных в роли базовых, про "утиную типизацию" в том числе..в ряде случаев.
Полиформиз PHP: class Person { public function tryToSearchInGoogle(){ return true; } } class Artemka extends Person { public function tryToSearchInGoogle(){ return false; } } Инкапсуляция PHP: class Artemka { private function wannabeProgrammer(){ return false; } public function whoami(){ return $this->wannabeProgrammer(); } }
PHP: <? class GuestBook { private $name; private $email; private $msg; public function getName() { return $this->name; } public function getEmail() { return $this->email; } public function getMsg() { return $this->msg; } } ?> это же тоже инкапсуляция, правильно? обращаться к полям из др класса мы можем с помощью публичных методов. так?
Инкапсуляция - это скрытие переменных в классе от пользователя. Т.е. все переменные (свойства) класса вы делаете private, а методы public.
и еще вопрос PHP: class User{ private $name; private $password; private $email; public function getName() { return $this->name; } public function getEmail() { return $this->email; } public function getPassword() { return $this->password; } } class Admin extends User{ public function getName(){ $this->name = "Артем"; } } class Noadmin extends User{ } у меня есть класс user. Как мне в классе админ задать ИМЯ? PHP: public function getName(){ $this->name = "Артем"; } так не работает из-за PRIVATE
Да, правильно. Все правильно. Ты написал private $name - следовательно это работает только на этот класс(User). protected работает на этот класс(User) и все последующие классы(т.е. Admin и т.д.), которые наследуют этот класс. --- Добавлено --- Измени на protected $name - тогда все будет нормально.
PHP: <?php class User{ protected $name; protected $password; protected $email; protected $status; public function getName() { return $this->name; } public function getEmail() { return $this->email; } public function getPassword() { return $this->password; } public function getStatus() { return $this->status = 'Undefined'; } } class Admin extends User{ public function getName(){ echo 'Admin name:' . $this->name = "Artem"; } public function getEmail(){ echo 'Admin email:' . $this->email = "temchan5@list.ru"; } public function getStatus(){ echo 'Status:' . $this->email = "Admin"; } } class Noadmin extends User{ public function getName(){ echo 'Noadmin name:' . $this->name = "Pavel"; } public function getEmail(){ echo 'Noadmin email:' . $this->email = "pavel@list.ru"; } public function getStatus(){ echo 'Status:' . $this->email = "No admin"; } } $obg = new Admin(); $obg2 = new Noadmin(); $obg->getName(); echo '<br>'; $obg->getEmail(); echo '<br>'; $obg->getStatus(); echo '<br><br>'; $obg2->getName(); echo '<br>'; $obg2->getEmail(); echo '<br>'; echo '<br>'; $obg2->getStatus(); ?> вот сделал инкапсуляцию наследование и полиморфизм. вроде все правильно