Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проверка возможности создания объекта класса

 PHP.SU

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


 Страниц (1): [1]   

> Без описания
vegarulez
Отправлено: 29 Марта, 2015 - 18:12:14
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Привет Всем программистам! Только начинаю общаться с ООП и возникают некоторые вопросы ответы на которые не всегда могу найти - требуется помощь зала, и присутствующих в нём гуру.
Вопрос состоит в следующем. Я создал класс. И хочу создать объект класса. Но в конструкторе класса я проверяю наличие трёх стринговых переменных - ключей, которые передаю в конструктор при создании объекта. Если хотя бы одной из переменных нет или она инвалидна - объект класса не создаётся. Создаётся throw exception который пишет в лог что произошла ошибка. И тут возникает самое главное затруднение, т.к. мой класс используется в стороннем коде программистом, то я для показа каких то ошибок использую метод класса get_info_my_error вызвав который программист увидит ошибку, сформированную в виде массива. Но я не могу показать ошибку, которую вызывает создание объекта без необходимых параметров - ведь объект класса не будет создан и соответственно я уже не смогу обратится к методу объекта чтобы показать ошибку. и нужно либо в блоке catch смотреть что выдается ошибка, соотвественно не в том формате что я обычно выдаю своим классом (не ввиде массива). Поэтому стоит вопрос - я сейчас пробую создать потомка класса в нём в блоке констракт создать объект с теми параметрами что переданы потомку и проверить если нормально создался объект потомка класса - то обращаться к методам класса через объект потомка - ведь он же является extends от родителя значит и все методы работают и сообщение об ошибке я смогу запрашивать у объекта потомка если объект класса в потомке в конструкторе не смогу создать. Как то так.... но я не знаю как это правильно реализовать - может вы подскажите - как это корректно сделать - или поделитесь ссылкой или поправите меня. Может это всё делается намного проще или по другому прошу подсказать. Заранее спасибо.
Привожу код класса и то как создаю объект и пытаюсь проверить при создании - но проверка не проходит ((


PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class my_parent_class extends my_class
  4. {
  5.  
  6.     public function __construct($host, $kkey, $skey)
  7. {
  8.     //parent::__construct($host, $kkey, $skey);
  9.     try
  10.     {
  11.         $cnt = new my_class($host,$kkey,$skey);
  12.     }
  13.     catch (ExpayException $e)
  14.     {
  15.         // handle exception
  16.     }
  17.         if ($cnt) {}
  18. }
  19.  
  20.  
  21. }
  22.  
  23.  
  24. /**
  25.  * Class my_class
  26.  */
  27. class my_class
  28. {
  29.  
  30.     /**
  31.      * @var string
  32.      */
  33.     static $host;
  34.     /**
  35.      * @var
  36.      */
  37.     static $kkey;
  38.     /**
  39.      * @var
  40.      */
  41.     static $skey;
  42.  
  43.     public function __construct($host, $kkey, $skey) {
  44.  
  45.             if ( (!empty($host)) && (!empty($kkey)) && (!empty($skey)) )
  46.             {
  47.                 switch($host)
  48.                 {
  49.                     case  'localhost' :
  50.                         self::$host = 'http..';
  51.                         break;
  52.                     case  'myhost' :
  53.                         self::$host ='http..';
  54.                         break;
  55.                     default:
  56.                         self::$host ='Error Host';
  57.                         throw new myException('Error: Error Host!',500);
  58.                         return null;
  59.  
  60.                 }
  61.  
  62.                 self::$kkey = $kkey;
  63.                 self::$skey = $skey;
  64.  
  65.             }
  66.             else
  67.             {
  68.                 throw new myException('Error: One of variables is empty!',401);
  69.             }
  70.  
  71.  
  72.     }
  73.  
  74.  
  75. //....
  76.  
  77. }
  78.  
  79.  
  80. echo 'Тест Class'.'</br>';
  81. // создаем объект класса
  82.     $host='localhost';
  83.     $kkey='d7asd876c67f2a53';
  84.     $skey='asdasdasdasdasd';//'';//
  85.  
  86.     try
  87.     {
  88.         $f = new my_parent_class($host,$kkey,$skey);
  89.  
  90.     }
  91.     catch (myException $e)
  92.     {
  93.         // handle exception
  94.         $err=$e->getMessage();
  95.         echo $err;
  96.     }
  97.    
  98. echo $f->name;
  99. $post_fields=$f->get_info_my_error();
  100. print_r($post_fields);
  101. var_dump($f->cnt);
  102.  
  103. // и вот тут не работает проверка на if объекта исходного класса - был ли он создан потомком или нет в констракте
  104. if ($f->cnt)
  105.         { }
  106. ?>
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Марта, 2015 - 18:21:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Что мешает:
PHP:
скопировать код в буфер обмена
  1. public function __construct($host, $kkey, $skey)
  2. {
  3.     try {
  4.         parent::__construct($host, $kkey, $skey);
  5.         // other children construction
  6.     } catch (ExpayException $e) {
  7.         // handle exception
  8.     }
  9.     if ($cnt) {
  10.     }
  11. }
 
 Top
Ts.Saltan
Отправлено: 29 Марта, 2015 - 18:21:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


Помог: 22 раз(а)





Идёт обращение к переменной cnt класса my_parent_class
А в самом классе такой переменной не числится.


PHP:
скопировать код в буфер обмена
  1. <?
  2. class my_parent_class extends my_class
  3. {
  4.     public $cnt;
  5.     public function __construct($host, $kkey, $skey)
  6. {
  7.     //parent::__construct($host, $kkey, $skey);
  8.     try
  9.     {
  10.         $this->cnt = new my_class($host,$kkey,$skey);
  11.     }
  12.     catch (ExpayException $e)
  13.     {
  14.         // handle exception
  15.     }
  16.         if ($this->cnt) {}
  17. }
  18.  
  19.  
  20. }
 
 Top
MiksIr
Отправлено: 29 Марта, 2015 - 18:25:11
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


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


-----
self-banned
 
 Top
vegarulez
Отправлено: 29 Марта, 2015 - 18:28:18
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




DeepVarvar пишет:
Что мешает:
PHP:
скопировать код в буфер обмена
  1. public function __construct($host, $kkey, $skey)
  2. {
  3.     try {
  4.         parent::__construct($host, $kkey, $skey);
  5.         // other children construction
  6.     } catch (ExpayException $e) {
  7.         // handle exception
  8.     }
  9.     if ($cnt) {
  10.     }
  11. }


Так при таком подходе и объект класса потомка не будет создан и я не смогу обратится через него чтобы показать get_info_my_error программисту использующему мой класс что ошибка такая-то в том формате в котором я ему выдаю все ошибки.
(Добавление)
MiksIr пишет:
Если вам передали фигню в класс - это ошибка программиста стадии разработки. Об этом ему нужно сообщить сразу не наварачивая каких-то get_info_my_error.
Просто бросайте исключение и все.
get_info_my_error - это к ошибкам времени исполнения, и то в некоторых случаях фатальные ошибки можно исключениями.


Ну так хочется же красиво ) через $obj->get_info_my_error() в рамках тех описанных в документахе ошибок - которые выдает класс, в формате массива, описать и эту ошибку вызова создания объекта класса.

(Отредактировано автором: 29 Марта, 2015 - 18:33:49)

 
 Top
MiksIr
Отправлено: 29 Марта, 2015 - 18:33:37
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


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


-----
self-banned
 
 Top
vegarulez
Отправлено: 29 Марта, 2015 - 18:43:39
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




MiksIr пишет:
В рамках документации точно также описываются все исключения, которые методы могут кидать.


Было бы можно - вопроса бы не было наверное. Дали документацию - сказали написать класс - он должен общаться с другим кодом - который пишут другие люди в стандартной модели взаимодействия уже описанной в документации, в которой и формат ошибок уже задан. Просто все ошибки по формату, а эта будет нет... как вы думаете это обрадует заказчика? - конечно нет.
(Добавление)
Ts.Saltan пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.         if ($this->cnt) {}
  4.  
  5.  


$this->cnt А слона то я и не приметил ) Спасибо - заработало.

Вопрос - правильно ли я вообще сделал данную реализацию для проверки возможности создания объекта??
 
 Top
MiksIr
Отправлено: 30 Марта, 2015 - 06:07:18
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Как хотите. Но делаете фигню. За которую ни один "другой" программист вам спасибо не скажет.

Может вы еще системные ошибки решите перехватывать через error_handler, что бы запихнуть их в ваш get_info_my_error? Ну типа, не указал в конструкторе обязательный параметр - ловим, и в массив ошибок, крута.

Вот ошибка использования класса, т.е. ошибка разработки - вполне уместный способ фаталить. И это красивое решение.

Но если охота говнокодить, то решение DeepVarvar должно быть рабочим.


-----
self-banned
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB