powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Делать все методы статическими или класс абстрактным?
104 сообщений из 104, показаны все 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
Делать все методы статическими или класс абстрактным?
    #38048209
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,

вам же сказали в классах не должно быть get/post

Код: php
1.
2.
    public function init()
        switch (данные get/пост) {



замените на

Код: php
1.
2.
    public function init($param)
        switch ($param) {


хотя на самом деле мы прикапываемся к мелочам, в больших проектах или в серьезных фирмах за это бы уши оторвали. и не могли бы вы больше слушать свою любимую музыку.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048344
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. Заменил. К каким еще мелочам можно прикопаться? Как бы такую штуку построил крутой кодер? А суть штуки в том, чтобы облегчить разработчикам работу с картинками (аватарки, форумы, комментарии, посты в блогах и проч.), открытый же проект делаю, елки-палки :)
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048412
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2Ок. Заменил. К каким еще мелочам можно прикопаться? Как бы такую штуку построил крутой кодер? А суть штуки в том, чтобы облегчить разработчикам работу с картинками (аватарки, форумы, комментарии, посты в блогах и проч.), открытый же проект делаю, елки-палки :)

для меня идеальный подключаемый модуль - это такой класс, который одной строкой инклудится, одной строкой создаётся интерфейс(экземпляр класса для работы), одной строкой оглавляется скрипт в клиентской части, одной строкой скрипта (а то и вообще по селектору css) все выбранные элементы подменяются на нужные мне. К этому всему прилагается файл css для придания нужного внешнего вида.

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

В данном случае, класс должен просто предусматривать флаги convert, resize, avatar. А функция обработки одна (например make() или process(), понятно дело подгружающая 3 приватных метода). Тогда ресурс вообще хранить не прийдётся. Инициализировал, задал параметры, обработал, удалил.

И Вам легче, и программеру, который юзать бибилиотеку будет.

Я не крутой кодер, но моё видение задачи именно такое :)
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048457
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Ах да... забыл... ещё он не должен менять обычного поведения скриптов. То есть, не хорошо делать например move_uploaded_file, так как после Вашей обработки картинок, может последовать следующая (уже не Ваша), а это приведёт к ошибке (так как в _FILES будет записано, что такой файл был загружен, а физически он уже не там).
Нельзя жёстко привязывать, что клиентский скрипт должен обязательно отправить данные именно в Ваш серверный скрипт. Просто часто надо до сохранения файлов провести какие-нить валидации и типа того (например когда аватарку может только зареганый пользователь создавать), иначе сервак любой желающий загадить сможет.
Можно было бы выделить отдельный файл для валидации, но если модуль встраивается в Yii например, начнутся проблемы с его подгрузкой.

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

Идеальным являеться модуль который как черный ящик. Ему что то передал (чуствуете разницу с "он что то взял") и получил от него что то другое обработаное. И при этом ни мы не можем никак влезть в его внутрености (кроме конфигурации), и ни он не может покинуть свою черную коробку.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048532
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РенатПрограмёр,

Идеальным являеться модуль который как черный ящик. Ему что то передал (чуствуете разницу с "он что то взял") и получил от него что то другое обработаное. И при этом ни мы не можем никак влезть в его внутрености (кроме конфигурации), и ни он не может покинуть свою черную коробку.

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

Второе сообщение, вообще, темный лес для меня. Как сделать без move_uploaded_file?

Как тогда лучше настроить отправку из клиентского скрипта? Сейчас возможны такие случаи взаимодействия:
- передача картинки для обработки
- передача картинки вместе с данными (в случае если картинки не загружаются сразу на сервер, а ждут отправки вместе с формой)
- передача данных для обновления
- передача порядка расположения картинок
- передача команды на удаление
- запрос на получение списка картинок

Сейчас все отсылается одному скрипту с управляющими параметрами в GET. Имя скрипта нужно сделать в конфиге js, абсолютно согласен. А как быть с управляющими параметрами? Просто описать их в примечании, чтобы разработчик мог настроить свой скрипт? Лучше GET или POST их передавать?

P.S. Хотелось бы взглянуть на скрипты, приближенные к идеальным (особенно php), а то как-то плаваю сейчас
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048614
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрВ данном случае чёрного ящика не представляю, по выше описанным причинам (например предпроверка картинок). Если бы модуль был только серверный, а сейчас он клиент-сервер. это уже сложнее :)

чето то я текст полностью не читал, о предпроверки где то видимо упустил =)
может я конечно не то понял, но черный ящик может все сам проверить и плюнуть exception в случае чего. Аргуент у него - имя темп файла (черному ящику то какая разница, тем файл с картинкой или нет? едиснвтено его надо проверить до черного ящика реально ли он загружен)

Shitbox2,

откройте для себя фреймворки и mvc.
Современые фреймворки: Yii, Zend, Symfony etc делают занимаются роутингом автоматически. Единствено вам при отправке надо будет поменять адрес: http:.....ru/avatar/upload к примеру что запустит автоматически uploadAction у класса AvatarController.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048640
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2Насчет «размер аватар, размер сохраняемых картинок, исходящий формат, библиотека обработки и т.д. в конфигах» А если библиотека используется несколько раз с разными целями? Например, для создания аватарок, потом для обработки фоток в комментах, получается конфиги нужно переписывать?

Второе сообщение, вообще, темный лес для меня. Как сделать без move_uploaded_file?

Как тогда лучше настроить отправку из клиентского скрипта? Сейчас возможны такие случаи взаимодействия:
- передача картинки для обработки
- передача картинки вместе с данными (в случае если картинки не загружаются сразу на сервер, а ждут отправки вместе с формой)
- передача данных для обновления
- передача порядка расположения картинок
- передача команды на удаление
- запрос на получение списка картинок

Сейчас все отсылается одному скрипту с управляющими параметрами в GET. Имя скрипта нужно сделать в конфиге js, абсолютно согласен. А как быть с управляющими параметрами? Просто описать их в примечании, чтобы разработчик мог настроить свой скрипт? Лучше GET или POST их передавать?

P.S. Хотелось бы взглянуть на скрипты, приближенные к идеальным (особенно php), а то как-то плаваю сейчас

1. Поэтому и говорю, должна быть возможность менять поведение модуля заданием нужных атрибутов экземпляру класса... + в таком случае можно как-то покрутому соорудить загрузку конфигов (хотя не знаю. 10 конфигов - это как-то не круто). Ещё при этом (при возможности менять поведение) хорошо бы пакетную обработку сделать (или метод, который позволил бы эту картинку выгрузить и следующую картинку загрузить в этот же экземпляр для обработки).
2. Можно использовать например какую-нить copy.
3. Всё лучше отправлять одним методом (или пост или гет). В данном случае наверное POST (ведь файлы отправляются).
4. По поводу идеальных скриптов, даже не знаю что сказать... Под рукой таких нету :) Хотя в принципе любая модульная хорошая система так работает (только более глобально). Например тот же fckeditor (только js часть): строка инклуда, файл настройки, файл внешнего вида (в каких-то версиях в одном с настройкой), строка для замены textarea на продвинутые. в нём встраиваемый модуль ckfinder который грузит файлы на сервер. У него в конфигах по-моему предусматривается проверка переменных (своего рода валидация на серваке и всё такое).
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048688
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меняю входные данные на $param

Всего скрипт может получать 3 типа данных
$_GET['type'] (получает всегда)
$_GET['id']
$_POST['sort']

Как понимаю, в качестве $param лучше передавать что-то одно, например, POST, тогда все управляющие запросы так же нужно в POST запихнуть. Получится
Код: php
1.
2.
3.
4.
5.
$album = new Album;
$album->init($_POST);

public function init($param)
        switch ($param['type']) {


Логика верна?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048689
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренатможет я конечно не то понял, но черный ящик может все сам проверить и плюнуть exception в случае чего. Аргуент у него - имя темп файла (черному ящику то какая разница, тем файл с картинкой или нет? едиснвтено его надо проверить до черного ящика реально ли он загружен)


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

Сайт конечно не убит, но работает с глюками.
так что такой простой проверки явно недостаточно. :) Ещё и хорошо бы картинку на серваке по определённому принципу именовать (это тоже должен быть атрибут класса). Тогда можно избежать засорения папки аватарками одного юзера, если при отправке дать программеру на серваке задать определённый шаблон имени (например id-юзера_avatar).

Так что нет... явно чёрный ящик тут не прокатит :) Он должен быть чёрным, но "с дырочками, ручками для переноски" и всё такое :)
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048716
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На счет фреймворков, Yii, Zend, Symfony... Я же не знаю, чем пользуется тот человек, кто использует этот плагин или библиотерку или как его еще назвать. Чем бы он не пользовался ему должно быть максимально удобно взять и прикрутить ее хоть к чистому ПХП, хоть к Зенду. К сожалению, С ПХП не очень понимаю, как сделать универсальные вещи. С JS проще. написал плагин к JQ и ОК.

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

Всего скрипт может получать 3 типа данных
$_GET['type'] (получает всегда)
$_GET['id']
$_POST['sort']

Как понимаю, в качестве $param лучше передавать что-то одно, например, POST, тогда все управляющие запросы так же нужно в POST запихнуть. Получится
Код: php
1.
2.
3.
4.
5.
$album = new Album;
$album->init($_POST);

public function init($param)
        switch ($param['type']) {


Логика верна?

да. :)
кстати в таком модуле хотелось бы видеть возможность обработки ещё и серверных картинок (скажем, когда я ранее 10 картинок загрузил на сервак, а теперь из одной хочу аватар сделать). мне такая функция кажется востребованной... :) просто как предложение.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048725
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Кстати, файлы отправляются ни GET и не POST, а в FILES. Поди разбери что это :)
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048746
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2На счет хакера. Думаю, это забота движка, отслеживать, чтобы картинки могли только зарегистрированные пользователи загружать. Это в примере только все для всех. Т.е. для незареганного просто не подключится класс. Опять же, клиентский скрипт должен отслеживать это и выполнять колбек функцию исходя от типа ошибки сервера. Ух... Сколько работы-то
вот-вот... Это ответ Ренату, к тому, что надо отправлять не сразу в скрипт своего модуля, а в скрипт, который программер выберет (может он какой-нить контроллер фрэймворка туда укажет)... Тогда забота проверок падёт на него. Ты просто кода ошибок ему напиши(константы/переменные статические вбей например) пускай орудует и скрипту возвращает. Это вообщем на твоё усмотрение (вариантов уйма) )))
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38048761
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так есть же такая функция. Специально сделал графическую библиотеку:
Код: php
1.
2.
3.
4.
include_once('lib/gd.php'); //или lib/magickwand.php, если она есть на хостинге и работает лучше.
				
$preview_name = Image::makeavatar($this->upload_dir . $file_name, $this->previews_dir . $file_name, 164, 'png');
$file_name = Image::trueresize($this->upload_dir . $file_name, null, 1000, 1000, 'jpg', 75, true);



Здесь $this->upload_dir . $file_name имя вашего файла, $this->previews_dir . $file_name имя нового файла или false, если нужно перезаписать старый. Подсовывайте любой и обрабатывайте.

Вообще, сейчас примерно такая структура:
jquery.damnUploader.js — загрузка миниатюр и отправка на сервер
jquery.fancybox.js — просмотр картинок
jquery.autogrowtextarea.js — автомасштабирование текстовых полей
lib/графическая библиотека.php
Это конкретные черные ящики

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

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

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

Про sql и xss инъекции почитайте плис
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38049609
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да-да, знаю. Ну, sql и xss остается полностью на совести разработчика. По идее все запросы к БД он должен обернуть функциями своего движка. Хотя, если напишите пару легких оберток, внесу их как образец
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38049642
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в классе Album есть метод savefile(). Его задача проверить соответствует ли полученный файл условиям и записать его на диск, т.е. метод достаточно универсальный. Условия он берет из параметров класса: allowed_type, max_file_size и других методов: number_of_files, files_size. Кажется, было бы правильнее передавать ему параметры там где он вызывается. Правда, тогда получится такая страшная конструкция:
savefile($this->allowed_type, $this->max_file_size, number_of_files, files_size)

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

action.php
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
namespace album;

...

$album = new Album;
$album->init($_POST);

class Album {

    ...

    include_once('lib/gd.php'); //или lib/magickwand.php, если она есть на хостинге и работает лучше.
    $preview_name = \image\Image::makeavatar();

    ...
    
}


lib/dg.php и lib/magickwand.php
Код: php
1.
2.
3.
4.
5.
namespace image;

class Image {

}
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38051117
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по неймспейсу покатит.
Или можно "по старому", делать префиксы к имени класса к примеру: Kj_Albom, Kj_Image etc и все что начинаеться с Kj сразу будет понятно из какого модуля. Да и настроить автолоадер по префиксу не сложно.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38051120
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2Еще... Если возникнет ситуация, что в системе уже будет класс Album или Image, как решить эту проблему? Такой вариант покатит?

action.php
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
namespace album;

...

$album = new Album;
$album->init($_POST);

class Album {

    ...

    include_once('lib/gd.php'); //или lib/magickwand.php, если она есть на хостинге и работает лучше.
    $preview_name = \image\Image::makeavatar();

    ...
    
}


lib/dg.php и lib/magickwand.php
Код: php
1.
2.
3.
4.
5.
namespace image;

class Image {

}



лучше придумай своим классам какой-нить префикс нормальный (например Sb - взято с твоего ника), да и пиши классы SbAlbum, SbImage. Я пространства имён никогда в php не пользовал... Это походу менее удобно.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38051199
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот не знаю, не знаю. В крутых движках используется. Да и спецы говорят, что с ними лучше, только примеров не приводят. В общем, нужно получить консультацию у человека, который с ними на ты. В одном движке, например, подключение экземпляра класса описывается так: $db = \lib\db();

А так же стоит ли использовать ErrorException или слишком накручено будет?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38053908
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по исключениям. Сейчас обрабатываю их так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
if ($file['error']) {			
	$this->errors['file'] = $file['error']; //Загружен с ошибкой...
	return false;				
}
if (!array_key_exists($file['type'], $this->allowed_type)){		
	$this->errors['file'] = 10; //Файл неразрешенного типа
	return false;	
} 	

$new_file_name = uniqid() . '.' . $this->allowed_type[$file['type']];

if (!move_uploaded_file($file['tmp_name'], $this->upload_dir . $new_file_name)) {
	$this->errors['file'] = 9; //Не удалось переместить из временной директории
	return false;
}

return $new_file_name;	
...



Код: 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.
...
function error() {

	$error_report = '';
	switch ($this->errors['file']) {		
		case 1: //Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini
		case 2: //Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
		case 5: //Размер загружаемого файла превысил все мыслимые значения.
			$error_report = 'Файл ' . $_FILES['name'] . ' слишком большой. Размер загружаемого файла не должен превышать ' . round(MAX_FILE_SIZE/1048576, 2) . ' Мб';
			break;
		case 3: //Загружаемый файл был получен только частично.
		case 4: //Файл не был загружен.
		case 6: //Отсутствует временная папка. Добавлено в PHP 4.3.10 и PHP 5.0.3.
		case 7: //Не удалось записать файл на диск. Добавлено в PHP 5.1.0.
		case 8: //PHP-расширение остановило загрузку файла.
		case 9: //Не удалось переместить из временной директории
			$error_report = 'Загрузка не удалась';
			break;
		case 10: $error_report = 'Файл неразрешенного типа'; //Файл неразрешенного типа
			break;
		case 11: $error_report = 'Обновите браузер'; //Старые браузеры пока не поддерживаются
	}

	die($error_report); //Или дальнейшая обработка
}



В книжках рекомендуют использовать Exception. И с одной стороны к ним подходил и с другой, никак не догоняю куда их прицепить в моем случае. Т.е. прицепить не трудно, но сложность понимания и размер кода увеличиваются в полтора раза. Да и, вообще, не видел рабочих примеров с подобными конструкциями. Обычно всегда переменная errors заводится, как у меня. А вы использовали бы Exception в подобном случае и как?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38053934
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
...
if ($file['error']) {			
switch($file['error']) {
		case 1: //Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini
		case 2: //Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
		case 5: //Размер загружаемого файла превысил все мыслимые значения.
			throw new Exception('Файл ' . $_FILES['name'] . ' слишком большой. Размер загружаемого файла не должен превышать ' . round(MAX_FILE_SIZE/1048576, 2) . ' Мб');
		case 3: throw new Exception('Загружаемый файл был получен только частично.');
		case 4: throw new Exception('Файл не был загружен.');
		case 6: throw new Exception('Отсутствует временная папка. Добавлено в PHP 4.3.10 и PHP 5.0.3.');
		case 7: throw new Exception('Не удалось записать файл на диск. Добавлено в PHP 5.1.0.');
		case 8: throw new Exception('PHP-расширение остановило загрузку файла.');
}
}
if (!array_key_exists($file['type'], $this->allowed_type)){		
	throw new Exception('Файл неразрешенного типа', 10);
} 	

$new_file_name = uniqid() . '.' . $this->allowed_type[$file['type']];

if (!move_uploaded_file($file['tmp_name'], $this->upload_dir . $new_file_name)) {
	throw new Exception('Загрузка не удалась', 9);
}

return $new_file_name;	
...


Код: php
1.
2.
3.
4.
5.
6.
...
try {
// ваш код
} catch(Exception $e) {
  print $e->getMessage();die();
}


ps. die использовать плохой тон. Если будите Unit тесты писать он вам все тесты поломает
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38054051
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. предлагаете вынести swith в место проверки... Так не получится, т.к., к примеру, case 5: берет свои значения не от $file['error'], а из другого места (проверка data-lenght). Но, в общем-то можно передавать так же номер, и перебор делать уже в catch. Код и вправду выглядит здорово. Спасибо за ответ! )

P.S. die() там временно как заглушка. Код будет отправляться как ответ серверу
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38054356
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторберет свои значения не от $file['error'], а из другого места (проверка data-lenght)
вот тут какраз и появлятсья прелесть exception. Они позваляют "прыгать не на 1 уровень вверх как делает это return false; а сразу на несколько. Чтов ам мешает прямо там при проверке data-length выкидывать exception ? Какраз для этого они и нужны.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38059116
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там и выкидываю. А потом собираю все коды в catch и прогоняю по списку, группируя как надо...
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38059416
прочёл топ (посмотрел сорцы) - бегло...
совет - почитай про основы ООП - любую книгу! - особое внимание удели главам о связях и зависимостях!

class Album
там вообще не нужен никакой инит - используй конструктор!
выдели логику по работе с бд в отдельный класс!
не привязывайся к пост\гет - уже советовали!
вообще не понял - почему "ALBUM"?!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061031
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за совет. Книжку на днях прочел, уже все переделал в традициях ООП, как разберусь со всеми проблемами, так выложу. К примеру с тем же конструктором возникли вопросы: /topic/987490&pg=-1 Думаю, что должно быть готовое решение такой задачи.

Что касается этой ветки, то возникла сложность с исключениями:
Код: php
\r\npublic function init($param) {\r\n    ...\r\n    if ($row[\'quantity\'] >= $this->maxNumberOfFiles) {\r\n    try {\r\n        throw new Exception(\'Превышено количество загружаемых элементов\', 13);\r\n    } catch(Exception $e) {\r\n\t??? //Нужно и это исключение обрабатывать в нижнем блоке catch\r\n    }\r\n    ...\r\n}\r\n\r\npublic function savefile($maxSize, $allowedType) {\r\n    try {\r\n        if(!empty($_FILES)) {\r\n            ...\r\n            if ($file[\'error\']) {\t\t\t\r\n                throw new Exception(\'Загружен с ошибкой...\', $file[\'error\']);\r\n            }\t\t\t\r\n            if ($file[\'size\'] > $maxSize){\t\r\n                throw new Exception(\'Превышен допустимый размер файла\', 12);\r\n            }\r\n    } catch(Exception $e) {\r\n        switch ($e->getCode()) {\t\t\r\n            case 1: //Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini\r\n            case 2: //Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.\r\n            case 5: //Размер загружаемого файла превысил все мыслимые значения.\r\n            ...\r\n        }\r\n    }\r\n    return false;\r\n}\r\n
\r\n
Т.е., чтобы сделать все с одним блоком catch, придется брать в try, вообще, весь код. А если в этом коде еще и другие блоки try будут, например, относящиеся к БД, то произойдет их пересечение и будет все очень запутанно.

На счет того, чтобы без init() делать... Ну не в конструктор же логику выносить. Просто init() будет запускаться из конструтора. Или это идет вразрез с ООП?

Обертку над БД, наверное, заменю комментарием, все равно в каждом движке она своя... Чтобы не усложнять модуль.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061553
авторНа счет того, чтобы без init() делать... Ну не в конструктор же логику выносить. Просто init() будет запускаться из конструтора. Или это идет вразрез с ООП?
вразрез пойдёт тогда, когда тебе или др. программисту будет неудобно использовать твоё творение! Остальное ИМХО - надумано ;)
обычно, в конструкторе инициируют объект, а всё остальное делают через методы класса
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class Image {

        private $_params = array(
            'opt1' => 'val0',
            'opt2' => array('o1' => 0, 'o2' => 0, 'o3' => 0),
            'opt3' => 'val0'
        );

	public function __constuct($params) {
		$this->_params = array_replace_recursive($this->_params, $params);
	}
        
        public function save() {blah...blah...}
        public function resize($x, $y) {blah...blah...}
        public function watermark($watString = "blah...blah...") {blah...blah...}
        
        //проверять можно в конструкторе - а можно оставить отдельный метод!
        public function validate($validateParams = array('type' => array('image' => ('jpg', 'bmp', 'gif')))) {blah...blah...}

        and etc.
}



авторЧтобы не усложнять модуль.
Module !== Class
когда определишься, что ты создаёшь, тогда придёт осознание всего остального!

Успехов!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061565
ещё совет!
не распихивай эти throw по всему коду - они используются немного ;) в других целях...
к примеру, заведи переменную класса - $error = FALSE - и записывай код ошибки в неё!
после проверяй, если $error не пустая, то была ошибка!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061592
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так...ещё совет!
не распихивай эти throw по всему коду - они используются немного ;) в других целях...
к примеру, заведи переменную класса - $error = FALSE - и записывай код ошибки в неё!
после проверяй, если $error не пустая, то была ошибка!

а сами ошибки вынеси в отдельный участок кода (и создай статические константы класса)... где для каждой константы дай адекватное название типа ELOAD или LOADERROR (по аналогии SAVEERROR, SIZEERROR и т.д.) и соотнеси его с кодом ошибки, а по коду подтягивай текст ошибки (какой-нить массив создай...). Просто я думаю в нынешнем виде сменить язык модуля или просто изменить текст ошибки будет очень сложно... а это уже не идеальный модуль. Сами константы позволят легче ошибками управлять из вне (если кому вдруг понадобится), ведь запомнить имя констант легче чем номера ошибок....
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061619
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначально у меня и было все без throw и складывалось в массив ошибок. Только вчера его убрал. Вообще, с ошибками надо определиться. Обязательно должны быть исключения/ошибки для пользователя. Это:
- файл слишком большой (не должен превышать Х МБ)
- файл неверного типа (в т.ч. если не удалось обработать)
- превышено кол-во загружаемых файлов
- закончилось отведенное место
- браузер не поддерживает загрузку
- ошибка сервера (попробуйте загрузить файл позже)

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

Далее о константах. К примеру, нужно вывести: «файл не должен превышать Х МБ», где Х переменная. Это уже в константу не запихнуть. Опять же не знаю как лучше, формировать текст ошибки, на сервере или отсылать код + дополнительные значения (те же Х МБ) JS-скрипту и там уже обрамлять в текст.

P.S. В каких же тогда целях используется throw?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061621
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так...ещё совет!
не распихивай эти throw по всему коду - они используются немного ;) в других целях...
к примеру, заведи переменную класса - $error = FALSE - и записывай код ошибки в неё!
после проверяй, если $error не пустая, то была ошибка!
Ага и потом програмист возмет этот модуль подключит и будет гадать, как же мне понять почему не сработал функция? То ли в $error смотреть, то ли в $error_code, То ли куда. Зачем придумывать что то, если есть Exception который умею тработать и с $message и с $code ?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061658
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, просто исходя из определения слова «исключение» (а ведь называют их именно исключениями, а не ошибками и проч.), они нужны для обработки любых событий, не входящих в основную ветку программы. Т.е. это ошибки любого уровня критичности, пользовательские промахи (напр., неверный логин и пароль), внеплановые внутренние проверки и проч. То, что они не до конца в ПХП реализованы, другой вопрос. Сейчас плохо, потом хорошо сделают, если уж ООП в этом направлении развивается...

В связи с исключениями появилось два вопроса:

1. throw без блока try не работает (т.е. вызывает ошибку), поэтому если захочу использовать функцию dbconnect в другом месте
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function dbconnect() {
    ...
    throw new Exception('...');
    ...
}

try {
    dbconnect(); //работает
} catch(Exception $e) {
    ...
}

dbconnect(); //ошибка

то она без внешнего блока try просто не будет работать

2. Немного напрягает то, что блок catch нельзя отделить от try. Либо просто не умею их готовить. К примеру
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
try {
    dbconnect();
} catch(Exception $e) {
   ...
}

try {
    filesave();
} catch(Exception $e) {
    ...
}

try {
    userlogin();
} catch(Exception $e) {
    ...
}


Основной код слишком загроможден проверками. Попробуем избавиться:
а) можно вынести исключения в общий блок. Но тогда наступит момент, когда этим блоком придется обертывать всю программу
Код: php
1.
2.
3.
4.
5.
6.
7.
try {
    dbconnect();
    filesave();
    userlogin();
} catch(Exception $e) {
    ...
}


б) Тоже самое, только более ООПшно и в 20 раз сложнее
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
try {
    dbconnect();
} catch(Exception $e) {
   throw new dbException('...');
}

try {
    filesave();
} catch(Exception $e) {
    throw new fileException('...');
}

try {
    userlogin();
} catch(Exception $e) {
    throw new userException('...');
}

class dbException extend Exeption ...


Как поступить лучше?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061704
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2,


Shitbox2hrow без блока try не работает (т.е. вызывает ошибку), поэтому если захочу использовать функцию dbconnect в другом месте
Работает, пробрасывает ошибку выше если она Вами не перехватывается то и будет показана пользователю - всё логично.

Shitbox2можно вынести исключения в общий блок. Но тогда наступит момент, когда этим блоком придется обертывать всю программу
Зачем обёртывать всё программу??? Не понятно. Если Вы будуту использовать их сознательна для сигнализации ошибок, то сам бог велел Вам самому их ловить.
Если Вы хотите пользователю как-то по своему показывать об ошибке - то ставте свой глобальный обработчик прерываний.

Shitbox2Как поступить лучше?
Последняя лесенка - ужасна в практическом плане.
Лучше в этом случае что бы исключения нужного типа генерили сами методы. И тогда Вам либо в общём try их ловить "если надо", если надо чтоб выше то вообще try catch Не нужен.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061864
авторАга и потом програмист возмет этот модуль подключит и будет гадать, как же мне понять почему не сработал функция? То ли в $error смотреть, то ли в $error_code, То ли куда.
хм... вообще-то throw - это как-бэ своё исключение... например
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Image {
         public function __constuct($params) {
		$this->_params = array_replace_recursive($this->_params, $params);
                if($this->_params['someparam'] !== $this->_someValue ) {
                           throw new Exception('blah...blah...');
                }

	}
}

try {
    $img = new Image($params);
} catch(Exception $e) {
    ...
}


проверяется\обрабатывается оно как-бэ не в самом классе, а за его пределами, по усмотрению тех программистов, которые будут использовать класс!
а если программер будет обрабатывать\пробрасывать все возможные исключения в коде класса, то и класс он никогда не напишет... (что, собственно, мы и наблюдаем у ТС ;)
авторЗачем придумывать что то, если есть Exception который умею тработать и с $message и с $code ?
вызов exc довольно накладная процедура и, по пустякам (как правило!) его не вызывают!
авторИМХО, просто исходя из определения слова «исключение» (а ведь называют их именно исключениями, а не ошибками и проч.), они нужны для обработки любых событий, не входящих в основную ветку программы. Т.е. это ошибки любого уровня критичности, пользовательские промахи (напр., неверный логин и пароль), внеплановые внутренние проверки и проч. То, что они не до конца в ПХП реализованы, другой вопрос. Сейчас плохо, потом хорошо сделают, если уж ООП в этом направлении развивается...
ты ошибаешься! то, что ты пытаешься подвести под опр. исключение, на самом деле и есть банальнейший error, который не нуждается в отдельной обработке...
зы: вполне себе нормально они проработаны в PHP
Код: php
1.
2.
3.
4.
5.
try {
    dbconnect();
} catch(Exception $e) {
   throw new dbException('...');
}


ты не понимаешь самого простого - любой коннект и без тебя (прекрасно) выкинет ошибку при сбое...
как эту ошибку будет обрабатывать программист, использующий твой класс, тебя вообще не должно волновать!!!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38061888
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38062003
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приметил конструкцию
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Image {
    ...
    throw new Exception('blah...blah...');
    ...
}

try {
    $img = new Image($params);
} catch(Exception $e) {
    ...
}


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

В случае с классом Album ловля исключения за пределами класса вполне оправдана, т.к. в коде он вызывается только в одном месте, а как быть с классом Image и подобными? Оборачивать каждый вызов в try-catch?

Идеальный вариант, когда в случае неудачи функция/класс молча возвращает false, но в случае необходимости мы могли бы узнать конкретно чем вызвана неудача. Т.е. функцией можно было бы пользоваться так:
Код: php
1.
if (!func()) ...;


или так:
Код: php
1.
2.
3.
4.
5.
try {
    func()
} catch (Exception $e) {
    //детализация. $e - код ошибки...
}


Это к примеру. В современно ПХП такие механизмы существуют?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38062075
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторкто должен обрабатывать исключения, тот кто написал класс или тот кто этот класс использует
тот кому это исключение нужно
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38064476
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, вопрос не к ПХПшникам, а к тем, кто знаком с более ООПшными языками. В какую сторону развиваются исключения? Можно ли предположить, что в будущем механизм try ... catch будет использоваться для любых исключительных ситуаций и валидаций? Например, появится оператор продолжения скрипта (если ошибка не критична, но ее нужно зарегистрировать) или оператор повторения блока try, если ошибка исправлена?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
try {
    ...
    throw new Exception('Исключение', 1);
    ...
} catch(Exception $e) {
    ...
    continue; //или repeat, чтобы повторить блок try
}


Или этот механизм останется только для узкоспециализированных ситуаций?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38064483
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНапример, появится оператор продолжения скрипта

Код: php
1.
2.
3.
4.
5.
try {
    ...
    throw new Exception('Исключение', 1);
    ...
} catch(NotCriticalException $e) {



авторператор повторения блока try, если ошибка исправлена

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$result = false;
while($result){
$result = true;
try {

    ...
    throw new Exception('Исключение', 1);
    ...
} catch(NotCriticalException $e) {
$result = false;
}}
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38064800
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круто! Но не могу найти ничего о NotCriticalException (и код не работает). Он в PHP есть?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38064824
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет. это ты сам делаешь исключение.
class NotCriticalException extends Exception
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38064833
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эм... Не понял. А чем этот класс должен отличаться? Что в нем прописать, чтобы после обработки возвращалось управление к месту выброса?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065290
13576000 - жесть! пробросить исключение только для того, что бы самому его и поймать в блоке!!!
авторВ какую сторону развиваются исключения?
ни в какую!!!
авторМожно ли предположить, что в будущем механизм try ... catch будет использоваться для любых исключительных ситуаций и валидаций? Например, появится оператор продолжения скрипта (если ошибка не критична, но ее нужно зарегистрировать) или оператор повторения блока try, если ошибка исправлена?
нет!!!

просто вдумайся в пример - ме думает он будет тебе полезен!!!
Код: php
1.
2.
3.
4.
5.
6.
while (list($key, $value) = each($arr)) {
    if (!($key % 2)) { // skip odd members
        continue;
    }
    do_something_odd($value);
}
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065316
что бы было с чем сравнить! твой вариант...
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
while (list($key, $value) = each($arr)) {
    try {
        if (!($key % 2)) {
             throw new Exception('Исключение', 1);       
        }
        do_something_odd($value);
    } catch(Exception $e) {
        continue;
    }    
}


извини, но это - капец!!!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065477
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2а к тем, кто знаком с более ООПшными языками. В какую сторону развиваются исключения?
ООП и исключения это разные вещи. в Java исключения они работают аналогично. что значит развиваются?...........

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

помите. без этого вы так и будете задавать подобные вопросы, на которые даже отвечать нет желания, ибо видна ваша полная неосведомленность в этих вопросах. а следовательно объяснять бесполезно.
вы не поймете, пока не сядете и серьезно не разберетесь. и наши примеры кода вам нифига непомогают. это видно невооруженным взглядом.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065478
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так...извини, но это - капец!!!
+1
исключения ради исключений)) топик бреда
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065504
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читал и достаточно досконально. Пример на ПХП http://www.php.net/manual/ru/features.file-upload.errors.php#89374
Тут исключения используются, чтобы обработать ошибку при загрузке файлов. А это можно считать ошибкой пользовательского ввода?

В zend, yii, simfony все построено на исключениях, даже классы валидаторов.

Тут http://wiki.agiledev.ru/doku.php?id=ooad:exception_using говорится, что в java пользовательский ввод обрабатывается исключениями.

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

Ну и код... Если вы поняли почему этот код должен возвращать к месту выброса исключения и как должен быть описан класс NotCriticalException
Код: php
1.
2.
3.
4.
5.
try {
    ...
    throw new Exception('Исключение', 1);
    ...
} catch(NotCriticalException $e) {


Объясните, пожалуйста.

Так же не понимаю, чего ругать вариант:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$result = false;
while($result){
$result = true;
try {
    ...
    throw new Exception('Исключение', 1);
    ...
} catch(NotCriticalException $e) {
$result = false;
}}


По-моему человек ясно показал, что возможность сделать, как я говорил есть, но код будет ужасным.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065578
авторЕсли вы поняли почему этот код должен возвращать к месту выброса исключения
да не должен он возвращать к месту... т.к. ты и так находишься в этом месте
Код: php
1.
2.
3.
4.
5.
6.
7.
try {
    ...
    //throw new Exception('Исключение', 1);    
    //ЗДЕСЬ МЫ ЖЕ УЖЕ ЗНАЕМ, ЧТО ЧТО-ТО НЕ ТАК =>
    //вместо перехода в блок catch обрабатываем "ошибку" по месту и двигаемся дальше
    ...
} catch(NotCriticalException $e) {


авторТак же не понимаю, чего ругать вариант
13578251 + 13578291 за такое, как минимум, лишают премии...
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065670
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2Читал и достаточно досконально...
В zend, yii, simfony все построено на исключениях, даже классы валидаторов...

Хм... как-то плохо читал )) валидаторы в yii тебе не выбрасывают исключения, а позволяют узнать об ошибках с помощью методов класса (по крайней мере всегда с ними так работал).
"Исключения" так названы потому, что они требуются в исключительных(нестандартных/нештатных) ситуациях, когда последующее выполнение кода может привести к ошибке или само выполнение данного кода при данных обстоятельствах - это уже ошибка. В принципе, в любой ситуации можно и без них обойтись (не помню случая, когда был вынужден их использовать). Как я понимаю, они нужны только для того, что бы программист более высокого уровня (то есть пользующий твои библиотеки) смог узнать причину ошибки в библиотеке, и для того, что бы он эту ошибку не смог проигнорировать (например, ты не смог считать файл из-за того, что его формат не соответствует ожидаемому).
В случае с валидаторами, неправильно заполненная форма - это не исключительный случай (вполне нормально например, что я в одной букве в пароле ошибусь). Но при этом является исключительной ситуацией, если у меня в модуле для записи файла на сервер человек должен обладать определёнными правами, а он ими не обладает (то есть программист "провтык", и не проверив права доступа выполняет код записи файла).

Вообщем в моём понимании как-то так.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065711
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё пример... есть модуль управления пользователями. У него в конфигах записаны параметры подключения к базе. Так вот, невозможность соединиться с сервером, отсутствие базы или таблицы в базе - это исключение. Отсутствие пользователя в базе - это нормально (человек пароль неверный ввёл, или просто пользователя такого нету). Тут тоже можно исключение бросить, но зачем? Есть конечно смысл, если библиотека включается единственным инклудом в начале файла, и при какой-либо ошибке (недостатке прав, отсутствии пользователя) останавливает выполнение (что есть логично, так как дальше выполнять ничего не надо, а надо отреагировать на ошибку). Вот тогда бросаем exception, а вот если мы предоставляем интерфейс управления пользователями, то в случае отсутствия пользователя лучше просто вернуть false вместо идентификатора.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065720
ещё раз - на "живом" примере...

есть класс file -> в нём есть метод save
при сохранении файла (сохраняем на диск ;) в методе save проверяем количесво свободного места на диске и смотрим размер файла, если размер больше свободного места, бросаем exc "нехватает свободного места" - дальше продолжать метод нет смысла - всё равно не сохранится!!!
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
класс file {
   function save() {
       if(freeSpaceOnDisk < this->size()) {
             throw new myException('blah-blah', 1);
       }
       //логика по сохранению файла
   }
}


те кто используют класс , не\обрабатывают исключения
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
foreach($files as $file) {
   try {
       file->save();
   } catch (myException $e) {
       //тут логика обработки нехватки места
       //полагаю она проста - выход из цикла - т.к. следующему файлу так же не хватит места
       exit;
   }  catch (Exception $e) {
       //тут обрабатываем др. исключения 
       //не критично - записываем лог идём дальше по циклу
   }
}


фуух... надеюсь понятно объяснил, для чего нужны throw ?! ;)

p.s. боюсь тебе рассказывать о существовании блока finnaly ;)))
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065777
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордальше продолжать метод нет смысла
есть варианты когда дальше подолжать смысл есть.
авторжесть! пробросить исключение только для того, что бы самому его и поймать в блоке!!!
я за такой подход: функции должны возвращать либо правильный результат, либо исключение.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065877
авторесть варианты когда дальше подолжать смысл есть.
ты ошибаешься...
авторя за такой подход: функции должны возвращать либо правильный результат, либо исключение.
спс КЭП!!! но из твоего кода, этого не видно...
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065911
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowесть варианты когда дальше подолжать смысл есть.
раз можно продолжать дальше, значит это чтото некритичное, те мы можем както исправить или обойти эту ситуацию. это уже не исключение а просто ветвление в логике работы.

исключения кидают в местах где немогут или недолжны исправлять ситуацию. т.е . обработка будет на другом уровне абстракции.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065914
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowя за такой подход: функции должны возвращать либо правильный результат, либо исключение.
а зачем тогда в самой функции кидать исключение , тутже его ловить и обрабатывать? явно используете их не по назначению
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38065970
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавтордальше продолжать метод нет смысла
есть варианты когда дальше подолжать смысл есть.
авторжесть! пробросить исключение только для того, что бы самому его и поймать в блоке!!!
я за такой подход: функции должны возвращать либо правильный результат, либо исключение.

очень интересно... разработчики php явно "придерживались" этого мнения, когда писали функции: realpath, intval, iconv, strtotime и т.д.
Я бы придерживался структуры (идеи) используемой самими разработчиками.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38066204
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор разработчики php явно "придерживались" этого мнения, когда писали функции: realpath, intval, iconv, strtotime и т.д.
осталось выяснить в каком году они и зачем они это делали.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38066283
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавтор разработчики php явно "придерживались" этого мнения, когда писали функции: realpath, intval, iconv, strtotime и т.д.
осталось выяснить в каком году они и зачем они это делали.
http://php.net/manual/ru/function.strtotime.php Возвращает временную метку в случае успеха, иначе возвращается FALSE. До версии PHP 5.1.0 в случае ошибки эта функция возвращала -1.
Ну, в версии 5.1 исключения уже точно были (и по ходу давно уже). Так что даже после организации поддержки исключений разработчики продолжают придерживаться мнения "ошибка не значит исключение". Просто мне очень интересно, как бы выглядел следующий код (представим, что нам надо было отделить числовые значения от строковых), если бы например intval выбрасывала исключение:
Код: php
1.
if(intval($var)){$res1[]=$var;}else{$res2[]=$var;}


уверен, что кто-то щас напишет:
Код: php
1.
2.
3.
4.
5.
6.
try{
 intval($var);
 $res1[]=$var;
}catch(){
 $res2[]=$var;
}


но тогда начинаются танцы с бубном вокруг "а не ошибка ли это из-за того, что $var является объектом?", и мы всёровно попадаем на if().
Вот теперь вопрос, а есть ли смысл? Может всё таки посчитаем разработчиков умными и предусмотрительными?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38066291
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь начинаем медитировать зачем те же разработчики сделали ErrorException
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38066296
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто нам надо было отделить числовые значения от строковых
Код: php
1.
if(intval($var)){$res1[]=$var;}else{$res2[]=$var;}


дальше разговор бессмысленен.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38066304
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторчто нам надо было отделить числовые значения от строковых
Код: php
1.
if(intval($var)){$res1[]=$var;}else{$res2[]=$var;}


дальше разговор бессмысленен.
варианты...!?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38066317
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38066583
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

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

P.S.

ScareCrow, так... к слову, вместо intval могла быть любая другая (например самописная) функция.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067025
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторда не должен он возвращать к месту... т.к. ты и так находишься в этом месте
Код: php
1.
2.
3.
4.
5.
6.
7.
try {
    ...
    //throw new Exception('Исключение', 1);    
    //ЗДЕСЬ МЫ ЖЕ УЖЕ ЗНАЕМ, ЧТО ЧТО-ТО НЕ ТАК =>
    //вместо перехода в блок catch обрабатываем "ошибку" по месту и двигаемся дальше
    ...
} catch(NotCriticalException $e) {


Тут try и не нужен
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
try {
    ...
    functionWithThrow();
    //ЗДЕСЬ МЫ ЖЕ УЖЕ ЗНАЕМ, ЧТО ЧТО-ТО НЕ ТАК =>
    ...
} catch(NotCriticalException $e) {
    //тут мы это исправляем и должны вернуться обратно в functionWithThrow и продолжить ее выполнение
}

[/quote]
А вот тут хорошо бы.

----------------

На счет исключения при загрузке файла. С местом на диске отличный пример! Смотрите, у нас есть три ошибки: закончилось место на сервере, пользователь пытается загрузить файл большего объема, чем можно и файл не того расширения.

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

Нужно ли прерывать на таких ошибках скрипт и выдавать их пользователю по-очереди (извините, не то расширение. А сейчас слишком большой) или поступать как с формой и выдавать разом все несоответствия?
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067075
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНужно ли прерывать на таких ошибках скрипт и выдавать их пользователю по-очереди
не любите вы своих пользователй
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067082
автор Ведь пользователь может их исправить, загрузив меньший файл.
пользователь ничего исправить не может - он уже отослал файл, который не влез - код уже отработал и выкинул исключительную ситуацию - всё!!! до следующей отправки файла сервер стоит и молчит!!!
авторНужно ли прерывать на таких ошибках скрипт и выдавать их пользователю по-очереди (извините, не то расширение. А сейчас слишком большой)
не то расширение или размер превышает установленное ограничение - это не исключительная ситуация - это просто ошибка пользовательского ввода, которая не нуждается в throw!!! они (ошибки) обрабатываются совершенно по другому - http://php.net/manual/en/book.filter.php - например так!!!
автор//тут мы это исправляем и должны вернуться обратно в functionWithThrow и продолжить ее выполнение
у тебя не всё впорядке с логикой - советую подтянуть этот пробел, только потом можно продолжать конструктивную беседу!!!

Успехов!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067292
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторне любите вы своих пользователйЧего это? Зачем их грузить лишней информацией?

автору тебя не всё впорядке с логикой - советую подтянуть этот пробел, только потом можно продолжать конструктивную беседу!!!Что не так? Мы делаем запрос к БД, но там не оказалось нужной информации, поэтому выходим из всех функций и делаем запрос к резервной БД, если там есть то, что нам надо, возвращаемся обратно и дорабатываем часть скрипта. Можно усугубить и предположить, что наш код — это отдельная библиотека и мы не знаем, есть ли резервная БД или другой способ получения недостающих данных, поэтому тут логично выбросить throw, чтобы тот кто использует нашу библиотеку сам решил, что ему делать
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067616
авторМы делаем запрос к БД, но там не оказалось нужной информации, поэтому выходим из всех функций и делаем запрос к резервной БД, если там есть то, что нам надо, возвращаемся обратно и дорабатываем часть скрипта.
твой класс вообще понятия не имеет о существовании той или иной БД!!!
он просто соединяется по коннекшн стрингу (утрировано), который ему скормили при инициализации, с сервером БД - и обрабатывает данные!!!
если тот кто использует класс, затупил и скормил стринг несуществующей СУБД - это его проблема - он получит отлуп и без твоего throw!!!
класс вцелом не работоспособен, до тех пор, пока этот кто-то не вставит в него корректный кон.стринг!!!
Код: php
1.
2.
3.
4.
5.
6.
7.
try{
    $myClass = new myClass('faked DB connection string');
} catch (NotRightConnectionStringExc $e) {
    $myClass = new myClass('right DB connection string');
}

//работаем с классом $myClass


авторэто отдельная библиотека и мы не знаем, есть ли резервная БД или другой способ получения недостающих данных, поэтому тут логично выбросить throw, чтобы тот кто использует нашу библиотеку сам решил, что ему делать
пойми - throw - это окончание всех действий в текущем коде !!! всё - ппц - код дальше выполняться не будет - АВАРИЙНЫЙ ВЫХОД ИЗ КОДА!!!
ты можешь его поймать на другом уровне - попытаться исправить ситуацию и запустить снова - но продолжить что-то после throw уже нельзя!!!
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067818
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень часто мы можем это исключение обработать прям у себя в коде и продолжить дальше.
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067861
авторочень часто мы можем это исключение обработать прям у себя в коде и продолжить дальше.
13580168
...
Рейтинг: 0 / 0
Делать все методы статическими или класс абстрактным?
    #38067938
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowочень часто мы можем это исключение обработать прям у себя в коде и продолжить дальше.
можно реальный пример? а то обсуждаем коня в вакууме
...
Рейтинг: 0 / 0
104 сообщений из 104, показаны все 5 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Делать все методы статическими или класс абстрактным?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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