Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1

Классы требуется разъяснение

16.08.2016, 07:54. Показов 4259. Ответов 94

Студворк — интернет-сервис помощи студентам
Начал изучение классов и тут возникли вопросы, может кто подсказать и прояснить ситуацию?
1. Не могу понять зачем создавать дочерние классы, можно же обойтись одним родительским классом?
2. На примере:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class OtherClass extends MyClass {
   public static $my_static = 'статическая переменная';
 
   public static function doubleColon() {
      echo parent::CONST_VALUE . "\n";
      echo self::$my_static . "\n";
   }
}
 
OtherClass::doubleColon();
?>
Как я понял, после extends указывается родительский класс MyClass?
Слово parent указывает что константа будет вызвана из родительского класса, а self из дочернего класса?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2016, 07:54
Ответы с готовыми решениями:

Требуется разъяснение по типам данных
Курю книгу по Java и алгоритмам,и наткнулся на такую фразу которая поменяла моё отношение к программированию,изучаю сам программирование,и...

Требуется разъяснение по системам векторов
Пусть дано две системы векторов. Как определить, будет ли одна линейно выражаться чкрез другую? допустим размерность первой системы 3х3, а...

Требуется разъяснение понятий GPT и MBR применительно к SSD
Здравия желаю. пытаюсь установить windows 7 максимальная на SSD жесткий диск. понятие GPT и MBR для SSD бывает? просто UEFI надо ставить на...

94
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
16.08.2016, 08:21
Цитата Сообщение от Gcom Посмотреть сообщение
Не могу понять зачем создавать дочерние классы, можно же обойтись одним родительским классом?
Всё зависит от задач. Если вам не нужны дочерние классы, то и не нужно их создавать.

Например, у вас есть 10 классов - User, Product, Order и т.п., и всем нужно подключаться к БД. Допустим, код подключения к БД примерно такой:
PHP
1
2
3
4
5
6
7
8
9
class SomeClass
{
    protected $db;
 
    public function __construct()
    {
        $this->db = Database::getInstance();
    }
}
Зачем 10 раз писать одно и то же? Можно вынести этот код в отдельный общий класс Entity (сущность), и все классы сущностей (Product, Order и т.п.) наследовать от него. Потомки будут выглядеть минималистичней:
PHP
1
2
3
4
5
6
7
class Product extends Entity
{
    public function getAll()
    {
        return $this->db->query('SELECT * FROM `products`');
    }
}
Цитата Сообщение от Gcom Посмотреть сообщение
Как я понял, после extends указывается родительский класс MyClass?
Да.

Цитата Сообщение от Gcom Посмотреть сообщение
Слово parent указывает что константа будет вызвана из родительского класса, а self из дочернего класса?
Да.
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 08:32  [ТС]
Jodah, Я теперь понимаю в чем у меня проблема, я понимаю конструкцию классов (т.е. как создавать их и как к ним обращаться) а вот с областью применения пока туго, ну т.е. реализовать ту или иную задачу используя классы (а в частности необходимость использование дочерних классов).

Добавлено через 2 минуты
Цитата Сообщение от Jodah Посмотреть сообщение
Можно вынести этот код в отдельный общий класс Entity (сущность)
т.е. будет что то подобное?
PHP
1
2
3
4
class Entity extends  SomeClass
{
 
}
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
16.08.2016, 08:47
Цитата Сообщение от Gcom Посмотреть сообщение
а вот с областью применения пока туго
Для меня это изначально было главной проблемой. Вроде бы всё просто и понятно, но как это применить в реальной среде... постепенно частями доходило.

Цитата Сообщение от Gcom Посмотреть сообщение
т.е. будет что то подобное?
Не, SomeClass - это пример потомка, если не применять наследование. Вот полный пример:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Entity
{
    protected $db;
 
    public function __construct()
    {
        $this->db = Database::getInstance();
    }
}
 
 
 
class Product extends Entity
{
    public function getAll()
    {
        return $this->db->query('SELECT * FROM `products`');
    }
}
 
 
class Order extends Entity
{
    public function getAll()
    {
        return $this->db->query('SELECT * FROM `orders`');
    }
}
 
 
 
class User extends Entity
{
    public function getAll()
    {
        return $this->db->query('SELECT * FROM `users`');
    }
}
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 09:40  [ТС]
Jodah, А что мешает запихать функцию getAll() в класс Entity не совсем понимаю зачем плодить столько классов?
Так же приходиться писать 10 раз функцию:
PHP
1
2
3
4
    public function getAll()
    {
        return $this->db->query('SELECT * FROM `users`');
    }
Добавлено через 3 минуты
Увидел в запросе (FROM ?), но опять же в том же классе можно было реализовать эту функцию выбора(подстановки) для какого FROM делать запрос.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
16.08.2016, 10:01
Цитата Сообщение от Gcom Посмотреть сообщение
Так же приходиться писать 10 раз функцию:
Согласен. В моём примере getAll можно закинуть в родителя.

Тогда немного изменю пример:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?
class Entity
{
    protected $db;
 
    public function __construct()
    {
        $this->db = Database::getInstance();
    }
 
    public function getAll($table)
    {
        return $this->db->query("SELECT * FROM `$table`");
    }
}
 
 
 
class Product extends Entity
{
    public function getByViews()
    {
        return $this->db->query('SELECT * FROM `products` ORDER BY `view_count` DESC LIMIT 20');
    }
}
 
 
class Order extends Entity
{
    public function getByDates($date_start, $date_end)
    {
        return $this->db->query("SELECT * FROM `orders` WHERE `date_create` BETWEEN '$date_start' AND '$date_end'");
    }
}
 
 
 
class User extends Entity
{
    public function checkAuth($user, $password)
    {
        $result = $this->db->query("SELECT * FROM `users` WHERE `login` = '$login' AND `password` = '$password'");
        return (bool) count($result);
    }
}
Логика в том, что в родителя мы выносим нечто общее для всех, а потомок имеет свою реализацию (свойства, методы и пр.).
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 10:08  [ТС]
Jodah, а теперь что мешает закинуть функции getByViews(), getByDates($date_start, $date_end), checkAuth($user, $password) в класс Entity?
Как же мне понять когда применять эти дочерние классы?

Добавлено через 1 минуту
Ну может не в тему, а переменные нужно же объявлять? (не смотря на то, что они в дочернем классе)
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
16.08.2016, 10:25
Цитата Сообщение от Gcom Посмотреть сообщение
а теперь что мешает закинуть функции getByViews(), getByDates($date_start, $date_end), checkAuth($user, $password) в класс Entity?
Технически ничего, но мы получим кашу из кучи методов для всего и вся. Это называется "божественный класс" и считается дурным тоном.

Цитата Сообщение от Gcom Посмотреть сообщение
Ну может не в тему, а переменные нужно же объявлять? (не смотря на то, что они в дочернем классе)
У Entity могут быть свои переменные, у Product свои.
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 10:27  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Вроде бы всё просто и понятно, но как это применить в реальной среде... постепенно частями доходило.
Ну походу я первую часть получил уже
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
16.08.2016, 10:30
Цитата Сообщение от Gcom Посмотреть сообщение
Как же мне понять когда применять эти дочерние классы?
Я думаю, если почитаете про паттерны (в частности, active record и datamapper), это поможет понять. Классы создаются исходя из сущностей. Скажем, если в БД есть товары - создаём класс Product. Это класс сущности. Далее добавляем сюда класс работы с товарами в БД (это как раз AR или DataMapper). И далее для каждой задачи или группы задач свой класс.

Т.е. класс в идеале должен выполнять только 1 задачу - сущность, работа с БД, представление, генерация XML/Excel файлов и т.п.

А дальше можно смотреть, какие классы содержат нечто общее и как их можно объединить.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 11:13  [ТС]
Jodah, Да я сейчас работаю над проектом, который представляет собой вавилонскую башню из говнокода, а предпосылкой для изучения классов стало желание перевести все это согласно парадигмы MVC, так так с поддерживать проект в каком виде он сейчас уже очень тяжело, пока не разросся было решено перевести его в надлежащий вид.

Добавлено через 33 минуты
Jodah, И еще такое разъяснение, все переменные обвяленные в родительском классе наследуются в дочернем, если их явно не предопределили в дочернем? так?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
16.08.2016, 11:21
Цитата Сообщение от Gcom Посмотреть сообщение
все переменные обвяленные в родительском классе наследуются в дочернем, если их явно не предопределили в дочернем? так?
Не так. Только те, которые находятся в области видимости public и protected.
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 11:41  [ТС]
Para bellum, Такой вопрос, зачем клонировать объекты методом __clone(), где это на практике может пригодиться?

Добавлено через 15 минут
И еще какова область применения абстрактных классов, чем они отличаются от "нормальных"?
0
23 / 23 / 7
Регистрация: 27.07.2015
Сообщений: 149
16.08.2016, 11:54
Цитата Сообщение от Gcom Посмотреть сообщение
И еще какова область применения абстрактных классов, чем они отличаются от "нормальных"?
Абстрактный класс должен содержать абстрактный метод. Объект абстрактного класса сам по себе создан быть не может.
Т.е. есть какой-нибудь Абстрактный класс, у него есть свойства и методы и один метод просто описание(абстрактный)
Если мы например наследуем этот класс например ОбычнымКлассом то объект мы не сможем создать без описания в ОбычномКлассе, абстрактного метода... Т.е. в Абстрактном классе мы описываем абстрактный метод и вызываем его, а в дочернем его исполнение должно быть описанно... Как-то так...

Я лично использовал его при построении сайта.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 12:00  [ТС]
Цитата Сообщение от Programust Посмотреть сообщение
Т.е. есть какой-нибудь Абстрактный класс, у него есть свойства и методы и один метод просто описание(абстрактный)
Что значит "просто описание" можно пример этого "простого" и "не простого" описания?

Добавлено через 2 минуты
Цитата Сообщение от Programust Посмотреть сообщение
Абстрактный класс должен содержать абстрактный метод.
Это я понял, только теперь не понять зачем нам эти абстрактные методы? Чем они отличаются от "простых"?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
16.08.2016, 12:04
Цитата Сообщение от Programust Посмотреть сообщение
Абстрактный класс должен содержать абстрактный метод.
Абстрактный класс никому ничего не должен.
PHP
1
2
3
4
5
6
abstract class Abstr
{}
class Derived extends Abstr
{}
//$a = new Abstr;
$d = new Derived;
Цитата Сообщение от Jodah Посмотреть сообщение
Для меня это изначально было главной проблемой. Вроде бы всё просто и понятно, но как это применить в реальной среде...
Поэтому лет 20 назад и появились паттерны, они описывают как все это правильно применить на практике.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 12:07  [ТС]
Jewbacabra, зачем абстрактный класс я так и не понимаю, так что работать не будет?
PHP
1
2
3
4
5
6
class Abstr
{}
class Derived extends Abstr
{}
//$a = new Abstr;
$d = new Derived;
0
23 / 23 / 7
Регистрация: 27.07.2015
Сообщений: 149
16.08.2016, 12:11
Прости нет времени долго писать, просто зачитай статейку... может и разберёшся)))
http://phpclub.ru/detail/article/oop_classes

Добавлено через 1 минуту
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Абстрактный класс никому ничего не должен.
Тогда его создание теряет смысл нет?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
16.08.2016, 12:13
Цитата Сообщение от Gcom Посмотреть сообщение
так что работать не будет?
PHP
Это был просто сферический пример в вакууме, демонстрирующий что абстрактный класс может не иметь абстрактных методов, и не имеющий практической ценности.
Цитата Сообщение от Gcom Посмотреть сообщение
зачем абстрактный класс
В рамках темы форума ответить на этот вопрос невозможно. Тебе нужно для начала разобраться с ООП на уровне как работают все конструкции, не вникая в их смысл. Когда вопросов "как это работает" не останется переходить к паттернам проектирования.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
16.08.2016, 12:14  [ТС]
Jewbacabra, И кому верить?
Абстрактные методы
Метод может быть объявлен как abstract, таким образом отложив его определение наследуемым классом. Класс, который включает абстрактные методы, должен быть объявлен как abstract.
PHP
1
2
3
4
5
<?php 
abstract class MyBaseClass { 
     abstract function display(); 
} 
?>
Читал ТУТ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2016, 12:14
Помогаю со студенческими работами здесь

Задача (разъяснение) в алгоритм (программа, используя базовый и производный классы, создавала массив объектов типа производного класса)
Задача на наследование классов, базовый класс - &quot;люди&quot;, производный - &quot;студенты&quot;...как я понял, а базовом надо создать символьную...

Требуется разработать классы для объектов и вывести списки
Мальчики, помогите решить задание, никак не могу разобраться что и как делать, я новенькая в пхп, начала проходить курс и не могу...

Механизм наследования. В программе требуется описать базовый и производные классы
В программе требуется описать базовый и производные классы. Базовый класс (возможно, абстрактный) с помощью виртуальных или абстрактных...

Разъяснение
Ребят, может кто-то сможет объяснить новичку в данном языке программирования, что требуется сделать в данной работе

Разъяснение по ТЗ
Доброго времени суток, суть вопроса состоит в том что бы вы помогли мне разобраться с данным ТЗ. Что вам не ясно в данном ТЗ и какой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru