powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Делать все методы статическими или класс абстрактным?
25 сообщений из 104, страница 1 из 5
Делать все методы статическими или класс абстрактным?
    #38043449
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс, все методы которого должны быть статическими. Возникла идея оставить их как есть, а просто сам класс сделать абстрактным. Нельзя создать экземпляр => нельзя создать метод в нем!

Правильно мыслю или чего-то не понимаю?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38043486
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нифига не понимаешь.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38043531
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно разъяснить? Почему так не покатит?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38043571
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,

а ты попробуй
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38043596
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал. И так и так работает
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38043599
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,

а зачем тогда вообще это делать классом? если как от класса от него ничего не нужно.
может хватит и просто набора функций?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38043737
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топистартеру - юзайте:
Код: php
1.
protected __construct() {} protected __clone() {}
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044488
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, да классом делать не обязательно, но все делают. Хотя бы для того, чтобы упорядочить наборы функций и их имена не пересекались. У меня, да и во многих движках обращение к методам идет так Image::Resize('img.png','100','100'), к примеру.

Объясните тогда зачем нужны абстрактные классы? И при чем здесь __construct() и __clone? Вообще, зачем создавать экземпляры классов?

Все реже и реже встречаю использование классов по-назначению, в качестве пользовательского типа данных, как они и задумывались. Когда мы делаем слайдер, то создаем класс картинки с размерами и методами появиться плавно или с каким-то эффектом. Часто классы используют чтобы упорядочивать функции в библиотеки (моя случай), чтобы не плодить кучу функций в глобальной области, как тут советовали. Здесь экземпляры создавать, конечно не надо. А всякие новомодные фишки типа областей видимости, статичности и проч. ИМХО только для совместной разработки, чтобы Петя, когда юзал библиотеку Васи, получал бы ошибки, что Вася не разрешил пользоваться такими-то методами.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044561
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВсе реже и реже встречаю использование классов по-назначению, в качестве пользовательского типа данных, как они и задумывались
вот как раз ТАК они точно не задумывались.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044608
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2ИМХО только для совместной разработки, чтобы Петя, когда юзал библиотеку Васи, получал бы ошибки, что Вася не разрешил пользоваться такими-то методами.

Для таких случаев лучше юзать DI.
Вася объявляет интерфейс, в контроллере дает ему некий id который публикует. И Вася, Ваня и д.р. забирая его работают через интерфейс. Чётко ограничит кто к чему имеет доступ. А имплементация этого уже забота Васи.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044611
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2упорядочивать функции в библиотеки (моя случай), чтобы не плодить кучу функций в глобальной области, как тут советовали

Я тогда одного не понимаю зачем ограничивать доступ и видимость к библиотечным функциям?
Если они библиотечные то по определению должны быть обще доступными.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044618
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,

Если боитесь что ктото от Вашего класса наследоваться будет, и что-то расширять - объявите его как final.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044824
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не боюсь... Пусть даже экземпляры создают. Нафига тогда нужны абстрактные классы и статические методы? На практике-то они для чего применяются?

В документации куча примеров, где и так извращаются и сяк, то там виден метод, то сям, то он сам себя через пять наследований вызывает.

«Совершенно оболванен
от таких серьёзных тем,
Тихо ахнул поселянин:
«„Вот же круто!.. А зачем?“»
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044838
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,

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

сначала поймите что это и как это , а только потом, если это реально нужно и оправданно, начинайте использовать.
не обижайтесь, но помните басню - "Мартышка и очки". у нее были очки и она примеряла их то на спину то на задницу....
вот я вижу аналогию. абстрактные классы есть, но вы незнаете куда их "одеть", но непременно хотите одеть, хотя зрение у вас может и так отличное. то что вы описали выше, - это вы одели их на затылок. носить можно - но пользы ноль )))
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044867
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2Объясните тогда зачем нужны абстрактные классы? И при чем здесь __construct() и __clone? Вообще, зачем создавать экземпляры классов?

Вот вы спрашиваете зачем тогда область видения нужна? Пусть все методы публичный и пусть все юзают его как хотят. Это наглядный пример. Делаете конструктор протектед, и никто вне класса создать экземпляр класса не сможет.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38044895
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2Не боюсь... Пусть даже экземпляры создают. Нафига тогда нужны абстрактные классы и статические методы? На практике-то они для чего применяются?

В документации куча примеров, где и так извращаются и сяк, то там виден метод, то сям, то он сам себя через пять наследований вызывает.

«Совершенно оболванен
от таких серьёзных тем,
Тихо ахнул поселянин:
«„Вот же круто!.. А зачем?“»

Представим одну и ту же работу виполненую с помощью статических переменных/методов и без них.
Итак, есть у нас класс животные, а в нём переменная "количество ног"=4. А что будет, если мы создадим 1000 000 животных с четырмя ногами, а они в один момент вдруг должны стать прямоходячими?
Мы должны отыскать все 1000 000 экземпляров (хорошо, если это массив, а если нет? ) и поменять аттрибут "количество ног"=2.
ИЛИ
если наша переменная "количество ног" будет статическая, а в методах класса мы будем обращаться именно к ней (Zhivotnoe::$nogi) то изменив эту переменную, мы моментально поставим всех на 2 ноги :)

Почему не глобальная переменная? А потому, что если мы начнём наследовать классы, то получим часть животных прямоходячих, а часть ползающих, таким образом мы сможем их разделить.

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


А абстактные классы вообще отношения не имеют к этому. Скажем мы создали класс Жизнь. В этом классе описываются аттрибуты присущие всему живому: длина жизни, тип организма, список органов и куча всего другого (сорри, не биолог :) ). А от этого класса наследуем классы грибы, животные, одноклеточные, растения и т.д. Так вот, мы можем создать экземпляр любого животного, растения... НО МЫ НЕ ДОЛЖНЫ иметь возможность создать экземпляр класса Жизнь (так как сам класс не является завершённым описанием чего-либо). Вот тогда мы и делаем класс Жизнь абстрактым.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38046100
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр, отлично объяснил! Спасибо! Статическая переменная — общая для всех потомков, абстрактный класс — набор свойств и методов для добавления к другим классам. Если бы так начиналось описание каждой особенности, изучение ПХП пошло бы в 10 раз быстрее!

Что мне тогда использовать в своем случае? Случай такой:
скрипт action.php получает от js указание добавить/удалить/обновить картинку в БД и на сервере или получить список картинок, соответственно есть функции add, del, update, getlist. В данный момент эти функции реализованы как методы класса Action (чтобы потом не было конфликтов имен)

В случае добавления картинки происходит ее обработка, для чего подключается графическая библиотека. Сейчас у меня написаны два идентичных класса Image (одинаковы названия, методы, свойста) для GD и MagickWand, т.е. какая бы библиотека не была подключена, функции будут работать.

Собственно, как лучше построить такую систему? Классы Action и Image сейчас абстрактные, но, может быть, вообще, их делать не стоило? Нужно ли применять namespace в моем случае?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38046320
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо знать больше о структуре твоего приложения, но так сходу - статические методы можно сделать. Хотя впринципе, всё зависит от того, что дальше с картинкой делать надо.
Может вместо голых экшенов контроллеры писать? Тогда при запросе подрузил нужный контроллер, создал экзеспляр и выполняй какие угодно экшены не переживая за пересечение имён вообще.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38047486
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот проект полностью: https://github.com/tamtakoe/photoalbum
См. action.php. Графические классы в папке lib
Соответственно, хотелось бы построить его так, чтобы можно было легко использовать в других проектах. Кстати, почему-то не получается обращаться к классу Album без создания экземпляра (Album::init())
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38047590
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,

может потому что там не хвататет слова static?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38047672
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эм... Но и в классе Image нет этого слова и все работает!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38047678
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы вынуждаете процитировать сюда несколько глав из первого попавшегося учебника.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38047694
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду признателен если их удастся сжать до нескольких обзацев.
«Не корысти ради, а токмо волею пославшей меня жены»
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38047843
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,

Начнём с того, что является очень плохим тоном делать свой класс зависимым от внешнего мира. Скажем, а что если я не могу по какой-либо причине использовать GET запросы при передаче параметров (например мне нужно передавать информацию об экшене постом). Вот и первая проблема, надо все геты отлавливать и менять на пост (хотя и быстро, но делать так не надо). Во вторых, почему бы не использовать классы полноценно? А если мне надо будет картинку уменьшить, конвертировать и создать к ней аватарку? Трижды создавать одни и те же ресурсы и всё такое?
А я бы создал ресурс картинки при создании экземпляра класса, записал бы этот ресурс как атрибут объекта и орудовал бы с ним (и так же поступил бы с другими переменными). С классом Image разобрались (то есть лучше делать его не абстрактным).
Класс album как я уже говорил лучше сделать независимым из вне, ну и так же полноценным (без разных там static методов). А ещё бы я создал файл конфига, который позволял бы выбрать библиотеку для обработки картинок, и другие параметры.

вообщем как и обычно, я не вижу смысла в статике вообще :)
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38047942
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И почему же класс Album получился зависимым? От чего?

В движках обычно получают значения так:
Tools::getValue('zoom'))
$app->getParam('postPage');
Причем это просто обертки над $_POST. Тоже самое, что есть обертки над БД и т. д. Т. к. мы не знаем, что за движок будет, то делать их нет смысла. Или есть?

Согласен, что обработку картинок хорошо было бы сделать по типу jQuery, чтобы она передавала изображение от одной функции другой. Опять же как это сделать? Ресурсы картинки нужно уничтожать чем быстрее тем лучше, т.к. они занимают память. Тут мне видится выход сделать огромную функцию-комбаин с 200 параметрами, что совсем плохо

Выписал классы. Ткните пальцем, где зависимости?

action.php
Код: 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.
$album = new Album;
$album->init();

class Album {
    public $errors
    public $field_name
    public $upload_dir
    public $previews_dir
    public $allowed_type

    public function init()
        switch (данные get/пост) {
            case add:
                savefile() - запись файла на диск
                Подключение графической библиотеки
                Image::trueresize()
                Image::makeavatar()
            case delete:
            case update:
            case getlist:
            case sort:
       }
    public function savefile() {}
    public function error() {
}



имя_библиотеки.php
Код: php
1.
2.
3.
4.
5.
class Image {
    public function trueresize()
    public function makeavatar()
    public function convert()
}
...
Рейтинг: 0 / 0
25 сообщений из 104, страница 1 из 5
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Делать все методы статическими или класс абстрактным?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]