PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (16): В начало « ... 8 9 10 11 12 13 [14] 15 16 »

> Найдено сообщений: 232
_Dark_ Отправлено: 19 Февраля, 2013 - 21:48:59 • Тема: Статические классы или объекты? • Форум: Объектно-ориентированное программирование

Ответов: 40
Просмотров: 6828
OrmaJever пишет:

Если класс чисто статический то он может существовать только в одном экземпляре, а этого иногда не хватает.

То есть, если класс используется только в одном экземпляре и мне не нужны магические методы — то я могу смело использовать чисто статический класс?
_Dark_ Отправлено: 19 Февраля, 2013 - 21:18:38 • Тема: Статические классы или объекты? • Форум: Объектно-ориентированное программирование

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

Какие минусы использования чисто статических классов?

Допустим, есть класс \System\Output\html

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. namespace System\Output;
  3.  
  4. class html
  5. {
  6.     use \System\Output\Traits\Output, \System\Output\Traits\Macroses;
  7.  
  8.     public function __construct($styleId)
  9.     {
  10.         $this->setStyle($styleId);
  11.     }
  12. }

(в трейтах объявлено несколько методов, например, assign)

В данный момент это можно использовать так (через реестр, Registry):
PHP:
скопировать код в буфер обмена
  1. \System\Registry::getInstance()->output->assign(/* ... */);


Но ведь я могу немного все это и тогда работа с классом сведется к виду


Я просто смотрю, вот в моей всей системе есть базовые классы, составляющие основу, ну или ядро, как угодно.
Эти классы в общем-то существуют в одном-единственном экземпляре (при поддержке Registry), зачем тогда вообще объекты мне нужны?
Пока что выходит, что я вообще могу обойтись без единого экземпляра класса, просто нет необходимости.
Значит ли это, что я могу отказаться от объектов?
Возможно, я недальновиден и не вижу минусов такой архитектуры, вот в этом то как раз и заключается вопрос.
Спасибо.
_Dark_ Отправлено: 09 Февраля, 2013 - 20:05:30 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
DelphinPRO пишет:
_Dark_ пишет:
Как я понял, класс-наследник исключения пустым должен быть, он нужен только для определения типа исключения, логики там быть не должно. Или это не так?

не обязательно. иногда удобно логику засунуть в наследника \Exception
например, логирование ошибок.
или переопределить __construct для передачи в исключение нужных вам параметров.
+ иногда удобно переопределить магический метод __toString
в общем это решается в каждом отдельном случае индивидуально.
Категорично говорить "логики там быть не должно" нельзя.

Ясно, спасибо, стало гораздо понятней! Улыбка
_Dark_ Отправлено: 08 Февраля, 2013 - 15:29:24 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
Нашел отличные статьи на Хабре, в общем, кажется что-то понял с этими исключениями.
etoYA пишет:
Методов уйма

Как я понял, класс-наследник исключения пустым должен быть, он нужен только для определения типа исключения, логики там быть не должно. Или это не так?
_Dark_ Отправлено: 07 Февраля, 2013 - 20:06:53 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
DelphinPRO пишет:
ну вы можете еще сделать так

О, а это уже интересней, спасибо!

DelphinPRO пишет:
Я немного скомканно объясняю , лучше умную статью почитать, чтобы понять принцип работы исключений, способы их применения и полезность

Нет, нет, "умные" статьи как раз не очень объясняют суть, вот у меня сейчас после этого вашего сообщения с примером что-то прояснятся начало Улыбка
_Dark_ Отправлено: 07 Февраля, 2013 - 19:50:41 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
DelphinPRO пишет:
Фишка в том, что вы можете выкидывать свой тип исключений, унаследовав его от \Exception и переопределив необходимые методы. Таким образом, вся обработка ошибок (Подготовка сообщений, логирование, etc...) будет сосредоточена в одном месте, а не по всему коду.

Ну вот смотрите, у меня в index.php есть вызов

Уже оттуда пойдет большая часть работы системы именно насчет запроса, т.е. роутинг, обработка данных, отдача контента.
Например, где-то там, далеко, есть проверка
PHP:
скопировать код в буфер обмена
  1.         $file = JAME_USR . '/data-store/' . $guid . '/' . md5($key) . '.php';
  2.         if (!file_exists($file)) {
  3.             // TODO Error;
  4.         }

Значит ли это, что я могу в index.php сделать вот так:
PHP:
скопировать код в буфер обмена
  1. try {
  2.     \System\Controller::handleRequest();
  3. } catch (\Exception $e) {
  4.     // Произошла ошибка, здесь логирование, события и т.п.
  5. }

А вон там вот так:
PHP:
скопировать код в буфер обмена
  1.         $file = JAME_USR . '/data-store/' . $guid . '/' . md5($key) . '.php';
  2.         if (!file_exists($file)) {
  3.             throw new \Exception('Bla-bla-bla');
  4.         }

Просто не понимаю, ведь я могу в том месте просто вызвать свою ф-ию, например, вот так:
PHP:
скопировать код в буфер обмена
  1.         $file = JAME_USR . '/data-store/' . $guid . '/' . md5($key) . '.php';
  2.         if (!file_exists($file)) {
  3.             $this->registry->fatalError('bla-bla-bla');
  4.         }

(Добавление)
esterio пишет:
PHP:
скопировать код в буфер обмена
  1. public function start($guid, $module, $action, $params = array())
  2.     {
  3.         $appDir = $this->getAppDir($guid);
  4.  
  5.         $mainFile = "$appDir/main.php";
  6.         $moduleFile = "$appDir/modules/$module.php";
  7.  
  8.         if (!file_exists($mainFile) || !file_exists($moduleFile)) {
  9.             throw new Exception('Error')
  10.         }
  11.         }
  12.  
  13.         try {
  14.                 $registry->application->start($info['app'], $info['module'], $info['action'], $params);
  15.         }(Exception $e){
  16.                 // ...
  17.         }
  18.  

Ведь я могу просто вызвать там свою функцию в том месте, которая подготовит сообщение об ошибке, выведет его и exit();
Я прошу прощения, если я кажусь таким вот занудой, просто правда, пока не пойму саму суть будут всякие сомнения по этому поводу Закатив глазки
_Dark_ Отправлено: 07 Февраля, 2013 - 19:44:40 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
Вот фрагмент метода
PHP:
скопировать код в буфер обмена
  1.     /**
  2.      * Запускает приложение
  3.      *
  4.      * @param int       $guid    Глобальный идентификатор приложения
  5.      * @param string    $module Модуль приложения
  6.      * @param string    $action Действие модуля
  7.      * @param array     $params Массив параметров действия модуля
  8.      */
  9.     public function start($guid, $module, $action, $params = array())
  10.     {
  11.         $appDir = $this->getAppDir($guid);
  12.  
  13.         $mainFile = "$appDir/main.php";
  14.         $moduleFile = "$appDir/modules/$module.php";
  15.  
  16.         if (!file_exists($mainFile) || !file_exists($moduleFile)) {
  17.             // TODO: Error
  18.         }

Вызывается вот так:
PHP:
скопировать код в буфер обмена
  1. $registry->application->start($info['app'], $info['module'], $info['action'], $params);

Там где стоит TODO'шка нужно вывести ошибку, для этого исключения можно использовать, если да, то примерно как?
_Dark_ Отправлено: 07 Февраля, 2013 - 19:38:33 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
DeepVarvar пишет:
Это и есть тот самый лучший способ.

Хорошо, спасибо.

DeepVarvar пишет:
А вы попробуйте, вдруг поймете

Окружать весь потенциально опасный код блоком try/catch?
_Dark_ Отправлено: 07 Февраля, 2013 - 19:29:21 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
Я понимаю, что исключение выбрасывается по цепочке вверх, просто не понимаю саму их идею, конкретно зачем это надо и когда их использовать.
_Dark_ Отправлено: 07 Февраля, 2013 - 19:17:01 • Тема: Обработка ошибок MySQLi • Форум: Объектно-ориентированное программирование

Ответов: 20
Просмотров: 6614
Доброго всем дня.
Попытка получить помощь на StackOverflow провалилась, может звезды на небе не так расположились, но на вопрос так внятного ответа я так и не получил, хотя обычно все не так, поэтому решил задать вопрос здесь. Я вообще не активный пользователь, мне документации PHP более чем хватает, но вот такой случай, что нужна помощь сообщества.

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

Расширение MySQL устарело уже и морально, и вообще, как только можно, вначале я хотел работать с PDO, но пришел к выводу, что это лишнее и что объектно-ориентированного MySQLi мне более чем хватит.

В моей системе все системные ошибки отображаются в виде оформленной страницы, ошибки MySQLi не исключение, поэтому их нужно отлавливать.
В документации продемонстрирован вот такой способ делать это:
PHP:
скопировать код в буфер обмена
  1. if (!$mysqli->query("SET a=1")) {
  2.     exit('An error occurred: ' . $mysqli->error);
  3. }

(простой пример)

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

Само собой я могу наследовать класс mysqli и сделать что-то вроде
PHP:
скопировать код в буфер обмена
  1. class myMysqli {
  2.     public function __construct(/* ... */)
  3.     {
  4.         parent::__construct(/* ... */);
  5.     }
  6.  
  7.     public function query(/* .. */)
  8.     {
  9.         parent::query(/* ... */);
  10.  
  11.         if($this->errno !== 0)
  12.         {
  13.             // An error occurred
  14.         }
  15.     }
  16. }
  17. $mysqli = new myMysqli(/* ... */);
  18. $mysqli->query(/* ... */);


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

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

Как я понял, мне предлагали что-то вроде
PHP:
скопировать код в буфер обмена
  1. try {
  2.     $mysqli->query(/* ... */);
  3. } catch (Exception $e) {
  4.     // An error occurred
  5. }

но я не понимаю, чем это в принципе отличается от окружения блоком if/else.

В общем, сам вопрос: есть ли способ получше, чем переопределять большое количество методов или окружать каждый вызов блоком if/else (try/catch(?))
Возможно, проблема в самой концепции моей идеи, в таком случае я так же буду рад услышать более лучший способ работать с БД (?).

Спасибо.
_Dark_ Отправлено: 21 Октября, 2012 - 11:17:36 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
digi пишет:
_Dark_, http://ralphschindler.com/2012/10/10/di-dic-service-locator-redux

А за это спасибо!
_Dark_ Отправлено: 20 Октября, 2012 - 21:01:27 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
caballero пишет:
которая тоже кривовата судя по десятку синглетонов.

Синглтонов вообще нет.
Кода тоже нет.
Речь шла о правильном создании архитектуры:

_Dark_ пишет:
Первое что пришло в голову — использовать Singleton


Let it be.
_Dark_ Отправлено: 20 Октября, 2012 - 20:54:42 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
В общем, в целом ситуация понятна, обсуждение думаю можно закрыть.
Спасибо.
_Dark_ Отправлено: 20 Октября, 2012 - 20:49:22 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
caballero пишет:
и зачем поля класса?

Если методы будут вызываться последовательно, то в каждом методе будет получаться экземпляр класса, я думал, что правильнее вынести его в зону видимости всего класса, дабы не создавать лишних переменных и не получать лишний раз экземпляр.
(Добавление)
caballero пишет:
смысл понятен - говнокод который надо исправить.

В первом сообщении вообще нет кода, речь об архитектуре.

caballero пишет:
Посмотри любой фреймворк или какое либо другое грамотное решение.

Я придерживаюсь принципа "популярное не значит правильное". Но если на то и пошло, то я как раз таки и посмотрел IP.Board, где первый вариант и используется.

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

Закатив глазки
В целом — лучше.
_Dark_ Отправлено: 20 Октября, 2012 - 20:40:19 • Тема: Получение объекта в контексте другого класса • Форум: Объектно-ориентированное программирование

Ответов: 18
Просмотров: 4623
caballero пишет:
И зачем вообще некие поля класса если речь идет о синглетонах? на фига вообще на них ссылки?

PHP:
скопировать код в буфер обмена
  1. class Sure {
  2.         public function method1() {
  3.                 Database::instance() ->query(/* ... */);
  4.                 Database::instance() ->anotherMethod();
  5.                 Database::instance() ->thirdMethod();
  6.         }
  7.        
  8.         public function method2() {
  9.                 Database::instance() ->someAction();
  10.         }
  11. }
  12.  
  13. class Sure {
  14.         private $db;
  15.        
  16.         public function __construct() {
  17.                 $this->db = Database::instance();
  18.         }
  19.        
  20.         public function method1() {
  21.                 $this->db ->query(/* ... */);
  22.                 $this->db ->anotherMethod();
  23.                 $this->db ->thirdMethod();
  24.         }
  25.        
  26.         public function method2() {
  27.                 $this->db ->someAction();
  28.         }
  29. }


caballero пишет:
а что у тебя везде в каждом методе каждого класса будет обращение ко всем 10 синглетонам?

Не обязательно.

caballero пишет:
ты бы лучше вместо орфографии программирование учил

Извините, но я думал, что язык речи — фундаментальная необходимость в жизни. Видимо вы думаете не совсем так, ну да ладно.
(Добавление)
caballero пишет:
10 синглетонов говорит как минимум о проблемах с архитектурой.
_Dark_ пишет:
Есть ли у вас какие-нибудь варианты и предложения решения этой проблемы?


Вы либо уходите от темы намеренно, либо банально не понимаете ее смысла. Определитесь.

Страниц (16): В начало « ... 8 9 10 11 12 13 [14] 15 16 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB