Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 11.08.2021
Сообщений: 17

Мини-аналитика сайта ООП php

11.08.2021, 22:50. Показов 3427. Ответов 16

Студворк — интернет-сервис помощи студентам
Добрый день, осваиваю ООП php и любую новую задачу пытаюсь решить с его помощью.

Ранее использовала только функциональное программирования. Поэтому у меня есть сайт, личный кабинет которого написан на php, но основан на функциях. Работает и хорошо, но всё-таки хочется уже более профессионального уровня.

Задача в том, что в этом личном кабинете нужно вывести количество уникальных посетителей и визитов из базы данных по определенным параметрам (текущий день, неделя, месяц).

У меня была идея создать два класса, соответственно Посетители и Визиты. Эти два класса будут наследоваться от абстрактного класса Метрики и будут реализовывать метод получения количества.
Далее создать еще один класс Аналитика, который по-идее должен оперировать классами Посетители и Визиты.
Потом я думала, как решать вопрос с периодами с учётом добавления новых в будущем.
Тут классы ТекущийДень, ТекущаяНеделя и ТекущийМесяц. Все три класса реализуют метод, возвращающий период. И класс Период, в котором создаются экземпляры классов периодов и записываются в свойство класса (массив).
Понимаю, что не вижу дальнейшего решения, возможно моя абстракция в корне не верна. Дальше реализация только разрастается и становится уже нерасширяемая.

С функциями решала бы проще. Создала две функции, одна для формирования периодов. А вторая для запросов к базе и соответственно возврата значения. Но это решение опять же невозможно быстро расширить. Допустим нужно будет выводить количество посетителей за вчерашний день, прошлую неделю. Может даже добавится ещё одна метрика, например, количество покупок. Или потребуется не количество, а сумма покупок.

Подскажите, пожалуйста, как бы вы решали такую задачу именно на ООП?

Как вообще оценивать задачи с точки зрения решения на ООП? Т.е. я сейчас изучаю основы, решаю задачи по ООП на подобие создать фабрику мебели. Здесь понятно, как решать, а когда неконкретная, а прикладная задача уже сложно.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2021, 22:50
Ответы с готовыми решениями:

Срипт PHP Мини-чата для сайта
Ребят помогите найти скрипт php мини-чата, необезательно навороченного что-то типо мини-чатов Ucoza

Аналитика сайта
Добрый день. Прошу вашей помощи. Для примера, есть сайт например, http://expert.ru/. Каким образом я смогу узнать какие форматы и...

Где найти программы под Linux для создания сайта, мини сайта ?
Здравствуйте вот такая проблемка,пытался найти программу для создания МИНИСАЙТА, но не тут-то было.Все проги в exe.-формате. ...

16
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
12.08.2021, 06:41
Я считаю, что для вашей задачи использование такого уровня абстракции избыточно. Всю функциональность счётчиков можно заключить в один класс "Счётчики".
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
13.08.2021, 00:29
Поддерживаю, все это избыточно. Профессионализм заключается не в том чтобы использовать ООП, а в том чтобы использовать подходящие методы для решения задачи. А вы пытаетесь использовать ООП ради ООП и конечно пазл не сходится. ООП вообще спорная штука и уж точно не панацея.
Цитата Сообщение от web-junior Посмотреть сообщение
Как вообще оценивать задачи с точки зрения решения на ООП? Т.е. я сейчас изучаю основы, решаю задачи по ООП на подобие создать фабрику мебели. Здесь понятно, как решать, а когда неконкретная, а прикладная задача уже сложно.
Суть в том чтобы создавать только те классы и методы, которые наиболее точно выражают бизнес логику. Не надо везде создавать классы просто потому что можешь. Многое можно выразить и через обычные типы такие как строка, число, массив.
Более того, стоит помнить что каждый объект это дополнительные накладные расходы.
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,813
14.08.2021, 01:10
web-junior, В задачах изучают самые базовые механизмы ООП в виде полиморфизма, наследования и т.д. К сожалению зачастую их ставят не лучшим образом, впихивают их ради чтоб впихнуть, в тоже время могут нарушаться другие принципы, о которых начинающий программист еще не знает. Это вредит выработке правильного мышления в ООП парадигме.

Я заметил общую проблему новичков, которые изучая ООП кроме наследования ничего знают и воспринимают ООП как гребаный кроссворд. Знаете как в школе нам давали домашнее задания составить кроссворд - чем больше пересечений, тем лучше - выше оценка. Они начинают тратить уйму времени, придумывая невероятные хитросплетения, чтоб сократить код - потом конечно же гордятся своими результатами)
Проблема заключается в том, что они зафиксировали систему в текущем состоянии, так сказать "сфотографировали" и завязали мертвым узлом. Тут стоит задуматься - а действительно ли отсутствие кода это хорошо? Что именно является хорошим кодом?

Чтоб ответить на этот вопрос - вы должны представить такую ситуацию, что в ваш проект приходит абсолютно левый программист, который совсем не знаком с вашим проектом и не знает предметной области. На сколько быстро он разберется в вашем коде и сможет безопасно внести изменения? Одна из проблем заключается в том, что многие программисты боятся вносить изменения, что могут что-то поломать и в таких ситуациях начинают костылять. Не нужно думать, что задача якобы заранее известна, а вы лишь пишете ее реализацию. Когда вы пишете код - вы как-бы рассказываете повествование для других будущих (в том числе и себя) программистов - он должен быть максимально очевидным, и не вызывать сомнений, что если здесь что-то изменить, то может что-то поломаться. Вы должны именно отразить то, как этот код работает на данный момент. Не стоит задумываться и делать заготовки на будущее - вы никогда не угадаете) Поверьте моему опыту - когда приходит время, все оказывается совсем не так, как вы могли себе предположить)

И такой поток левых программистов может быть достаточно большой - и вы устанете объяснять все ваши хитросплетения, что если ты хочешь сделать какую-то вещь, то нужно почесать правое ухо левой пяткой.

В реальных проектах ООП в первую очередь используется для построения архитектуры приложения. Код можно написать как угодно, и это будет работать. Проблемы начинаются, когда его нужно изменить - мы сталкиваемся с множествами проблемами:

1) Монолит, сильно связанный код. Чтоб сделать простейшее изменение - необходимо буквально изучить всю систему, которая настолько огромна, что не помещается в вашу голову.
2) Запутанный, хитросплетенный код. При малейшем изменении есть риск повредить уже работающие части нашей системы. Мы получаем бесконечные баги.
3) Низкоуровневый, сложночитаемый код, стоимость поддержки. Скорость печатания не влияет на скорость разработки, ведь большую часть времени программист читает окружающий код, даже тот, который он только что написал. Имеется в виду не то, что его в принципе трудно прочитать - а то, что при его чтении необходимо его каждый раз разбирать, держать в голове много лишней информации, тратя на это время и умственные ресурсы. В идеале должно быть достаточно одного взгляда, чтоб понять, что этот код делает, и то, что он 100% работает, т.е. он настолько очевидный, что не дает повода засомневаться в его работоспособности.

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

По сути ни один человек не сделал ни одного открытия с нуля. Все величайшие открытия базировались на многолетней работе и опыте тысячи людей. Невозможно просто так внезапно придумать телевизор или фотоаппарат - прошли тысячелетия от изучения простейших моделей анимационных и оптических эффектов/свойств.

Так же и в программировании, многолетняя практика тысячи программистов набивания шишек, попытки решить те или иные проблемы и обмен опытом родили некие принципы, следуя которым вы избежите большинство проблем. Такие как SOLID, GRASP, DRY, YAGNI, DDD... и еще куча букв. Каждая буква это не просто аббревиатура - это целая философия, про каждую из них есть целые книги). Все они сводятся так или иначе к деньгам, их так просто бы не придумали. Нужно в них верить и тогда сможете в итоге познать их целесообразность.

На данный момент я устал все это писать, позже распишу подробнее, в чем заключается ошибка ваших суждений.
2
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
16.08.2021, 14:23
Да, набор предлагаемых классов очень раздутый. Обычно на сайте всегда есть такая сущеность как "пользователь". Если её нет, то в качестве рефакторинга я бы предложил реализовать. К этому классу можно добавить статический метод получения количества посетителей, вот и всё.

Осмелюсь порекомендовать изучение шаблонов программирования, например тут.
Только не делайте ошибку, которую допускают многие: не нужно старательно искать где применить эти патерны и не нужно их применять шаблонно. Это не руководство к действию, а сборник удачных решений часто возникающих задач. В "чистом виде" эти решения не должны применяться, лучше просто помнить об их существовании и когда возникнет схожая задача вы будете знать куда копать.
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
16.08.2021, 16:18
Цитата Сообщение от cia Посмотреть сообщение
К этому классу можно добавить статический метод получения количества посетителей, вот и всё.
Это путь к будущему божественному классу
1
0 / 0 / 0
Регистрация: 11.08.2021
Сообщений: 17
17.08.2021, 09:01  [ТС]
Добрый день. Спасибо за ответы. Да, реализация действительно избыточна. Попробовала создать один класс и в нём несколько методов, в т.ч. и статических. Однако столкнулась с ajax-запросом и не поняла, как его использовать в моём случае. В итоге, опять решила задачу с помощью функций. Конечно, такой код никому не покажешь(
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
17.08.2021, 09:42
Цитата Сообщение от web-junior Посмотреть сообщение
столкнулась с ajax-запросом и не поняла, как его использовать в моём случае
А как способ HTTP-запроса из браузера может усложнить использование того или иного объекта в PHP-скрипте?
Правильно, никак.

В чём ваша ошибка, сказать невозможно, не увидев код.
0
0 / 0 / 0
Регистрация: 11.08.2021
Сообщений: 17
17.08.2021, 10:37  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
В чём ваша ошибка, сказать невозможно, не увидев код.
вот такой класс Counter я создала. Немного сократила реализацию, для получения посетителей и визитов одинаковые функции.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
class Counter 
{
    private $times = [];
 
    public static $connection;    
 
    public static function Request($rqst, $param = null)   // запрос к базе данных
    {
        if($stmt = static::$connection->prepare($rqst))
        {
            if($param !== null) 
            {
                $stmt->bind_param("s", $param);
            }
            
            $stmt->execute();
            $rsp = $stmt->get_result();
 
            if($rsp->num_rows > 0) 
            {
                return $rsp->fetch_array(MYSQLI_ASSOC);
            }
        }        
    }
 
    public function __construct($connection)
    {
        $this->setupTimes();
        static::$connection = $connection;
    }
 
    private function setupTimes()   // установка временных периодов
    {
        $this->times["now"] = [
            "name" => "Сегодня",
            "date" => date("Y-m-d")
        ];
 
        $this->times["yesterday"] = [
            "name" => "Вчера",
            "date" => date("Y-m-d", strtotime("-1 day"))
        ];
 
        $this->times["now_month"] = [
            "name" => "Текущий месяц",
            "date" => date("Y-m")
        ];
 
        $this->times["last_month"] = [
            "name" => "Предыдущий месяц",
            "date" => date("Y-m", strtotime("-1 month"))
        ];
    }
 
    public function getVisits()   // получение визитов
    {
        $visits = [];
 
        foreach($this->times as $time)
        {
            $visits["Визиты"][$time["name"]] = static::Request(
                "sql запрос",
                $time["date"]
            );
        }
 
        return $visits;
    }
 
    public function getLastVisits()    // получение последнего визита
    {
        return static::Request("sql запрос");
    }
}
В index.php в папке модуля вот этой мини-аналитики создаю экземпляр класса. И вызываю метод getVisits.
Потом подключаю файл viewReport.php и распределяю данные из полученного массива по верстке.

Но пользователю должна быть предоставлена возможность строить график, переключая периоды: текущий месяц, прошлый месяц (в процессе реализации добавился ещё и год). Т.е. при нажатии на определенную кнопку я должна вызывать метод getVisits с параметром (тут я не реализовывала, поскольку не поняла, как дальше), а точнее отправить ajax запрос. Вот здесь я окончательно запуталась, если отправлю на index.php, то у меня получается пересоздастся экземпляр класса...
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
17.08.2021, 11:54
Лучший ответ Сообщение было отмечено web-junior как решение

Решение

1) Уберите статику, тут ей не место.
2) Свойство $connection сделайте приватным.
3) Вот этим times в данном классе не место. Он должен отвечать только за возвращение кол-ва визитов/посещений/товаров и т.п. за указанный ему извне период.
Представьте, что этот класс -- бухгалтерия огромной фирмы. Теперь подумайте, должна ли бухгалтерия сама определять даты, за которые она хочет выдавать те или иные выписки?

К тому же, если грамотно вынести массив times в другое место, его можно будет повторно использовать в шаблоне, где пользователю должна быть предоставлена возможность строить график, переключая периоды.
Цитата Сообщение от web-junior Посмотреть сообщение
Вот здесь я окончательно запуталась, если отправлю на index.php, то у меня получается пересоздастся экземпляр класса
Всё правильно. К моменту, когда клиент сможет в браузере переключать периоды, текущий процесс уже будет завершён.
AJAX-запрос спровоцирует запуск нового процесса, который тоже уже будет мёртв, когда в браузер вернутся от него данные.
Почитайте вот это: http://phpfaq.ru/newbie/na_tanke
1
0 / 0 / 0
Регистрация: 11.08.2021
Сообщений: 17
17.08.2021, 14:02  [ТС]
Спасибо. Обязательно попробую так сделать. Сейчас уже понятнее стало)
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
17.08.2021, 14:33
Цитата Сообщение от tarasalk Посмотреть сообщение
Это путь к будущему божественному классу
Да, верно. Но не забывайте контекст, в котором был задан вопрос. Речь явно идёт о чём-то простом, поэтому раздуваться тут нечему. И в таком контексте, по-моему скромному мнению, следует выбирать наиболее простой путь.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
17.08.2021, 16:33
cia, так контекст как раз таки изучение ООП, а по простому она и на функциях напишет)
И непонятно в чем тут упрощение. В том что отдельный файл не создали? Ну такое)
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
22.08.2021, 20:48
Цитата Сообщение от tarasalk Посмотреть сообщение
В том что отдельный файл не создали? Ну такое)
Знаю одного человека, который себя чтит как гуру. Он в 1 файле за 4 месяца написал 20 тысяч строк кода. Когда я спросил - зачем???? Он сказал - мне лень было создавать новые файлы

Добавлено через 1 минуту
Цитата Сообщение от OpXiv Посмотреть сообщение
20 тысяч строк кода
На новеньком PHP8 с JIT. Свой 3D простенький движок. Для визуализации моделей, что бы просматривать интерьеры квартир.

У каждого свои тараканы)))
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,813
23.08.2021, 17:07
Цитата Сообщение от OpXiv Посмотреть сообщение
Он сказал - мне лень было создавать новые файлы
Через IDE создать класс - это секундное дело. Мне трудно такое представляется для человека, привыкшего работать в ООП стиле. Тем более он сам признал, что это не правильно - ему просто лень)
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
23.08.2021, 17:11
Цитата Сообщение от sad67man Посмотреть сообщение
Через IDE создать класс - это секундное дело.
А потом нужно прописывать namespace и прочее. Тут в этом смысле ему лень было)
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,813
23.08.2021, 18:07
Цитата Сообщение от OpXiv Посмотреть сообщение
А потом нужно прописывать namespace и прочее. Тут в этом смысле ему лень было)
namespace прописывается автоматически.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2021, 18:07
Помогаю со студенческими работами здесь

Где лучше учить ООП PHP ? И зачем нужен ООП
Здравствуйте ! До того как начел учить ООП я кайфовал от программирования, после того как начел учить ООП нет мотивации ну и т.д общем...

Оптимизация мини-сайта
Привет всем. Дело вот у меня в чем. Создал два мини-сайта оптимизировал. И в итоге оба в бане у яндекса. Не знаю почему. Вообщем создал...

Средствами PHP и с использованием ООП php создать реализацию следующего интерфейса:
interface ArrayHelperInterface extends IteratorAggregate, ArrayAccess, Countable { /** * @param...

Мини блог PHP + MySQL
Здравствуйте. С наступающим Рождеством! Как всегда я накосил фегни, сам себя запутал и теперь у меня куча вопросов. В общем перешел к...

В мобильной версии сайта не открывается мини-корзина
Всем привет! Оптимизирую сайт: http://grandpa.com.ua. Прикрутила к хедеру кнопочку корзины, которая взаимодействует с плагином Woo Fly...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru