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]   

> Описание: Мой говнокод вызывает Segmentation fault ))
morfey
Отправлено: 13 Августа, 2014 - 11:56:41
Post Id


Новичок


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


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




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

Надеюсь я донес вопрос. Спасибо.

Вот пример
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class Users {
  5.  
  6.     function __construct() {
  7.         $this->logs = new Logs();
  8.     }
  9.  
  10.     function getName() {
  11.         $name = 'Alex';
  12.         return $name;
  13.     }
  14.  
  15.     function addCash($cash) {
  16.         $this->logs('Add cash:' . $cash);
  17.         // какой-то функционал
  18.     }
  19.  
  20. }
  21.  
  22. class Logs {
  23.  
  24.     function __construct() {
  25.         $this->users = new Users();
  26.     }
  27.  
  28.     function log($action) {
  29.         echo 'action:' . $action . ' , user name: ' . $this->users->getName();
  30.     }
  31.  
  32. }
  33.  
  34. $users = new Users();
  35. $users->addCash(17);
  36. ?>
  37.  
 
 Top
alexiy
Отправлено: 13 Августа, 2014 - 12:15:24
Post Id



Посетитель


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


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




morfey я бы методы логирования сделал бы статическими
 
 Top
esterio
Отправлено: 13 Августа, 2014 - 12:24:51
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




А что вы хотели.
Цитата:
new Users ->new Logs -> new Users ->new Logs -> new Users ->new Logs -> new Users ->new Logs ...

паттерн Registry наверно вам поможет.
 
 Top
DelphinPRO
Отправлено: 13 Августа, 2014 - 12:57:01
Post Id



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


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


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




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

PHP:
скопировать код в буфер обмена
  1. class Users {
  2.  
  3.     function __construct(Logs $logs) {
  4.         $this->logs = $logs;
  5.     }
  6.  
  7.     function getName() {
  8.         $name = 'Alex';
  9.         return $name;
  10.     }
  11.  
  12.     function addCash($cash) {
  13.         $this->logs->log('Add cash:' . $cash . ' , user name: ' . $this->getName());
  14.         // какой-то функционал
  15.     }
  16.  
  17. }
  18.  
  19. class Logs {
  20.  
  21.     function log($action) {
  22.         echo 'action:' . $action;
  23.     }
  24.  
  25. }
  26.  
  27. $users = new Users( new Logs() );
  28. $users->addCash(17);


Ну и помимо передачи объекта, конечно можно использовать статические методы в логгере, или паттерны синглтон или реестр. Однако DI мне кажется лучше.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
morfey
Отправлено: 13 Августа, 2014 - 13:15:48
Post Id


Новичок


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


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




DelphinPRO пишет:
Во-первых, объект логирования можно передавать из вне
Во-вторых, логгеру абсолютно не нужно знать о других объектах системы. Его задача - записать данные в лог. Готовые данные, которые ему передадут.


Ну это пример. Не обязательно там логгер будет.

На сколько правильно пользоваться оператором разрешения области видимости (:Улыбка ?

Тот же код, но объявляется в нужном месте, а не при объявлении родительского класса:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class Users {
  5.  
  6.     function __construct() {
  7.     }
  8.  
  9.     static function getName() {
  10.         $name = 'Alex';
  11.         return $name;
  12.     }
  13.  
  14.     function addCash($cash) {
  15.         Logs::log('Add cash:' . $cash);
  16.         // какой-то функционал
  17.     }
  18.  
  19. }
  20.  
  21. class Logs {
  22.  
  23.     function __construct() {
  24.     }
  25.  
  26.     static function log($action) {
  27.         echo 'action:' . $action . ' , user name: ' . Users::getName();
  28.     }
  29.  
  30. }
  31.  
  32. $users = new Users();
  33. echo $users->addCash(17);
  34. ?>
  35.  
 
 Top
caballero
Отправлено: 13 Августа, 2014 - 13:15:54
Post Id


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


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


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




к чему эти извращениия если можно взять тот же monolog


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DelphinPRO
Отправлено: 13 Августа, 2014 - 13:43:45
Post Id



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


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


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




morfey пишет:
На сколько правильно пользоваться оператором разрешения области видимости

В вашем случае это вызов статического метода Улыбка

И все же лучше уменьшать взаимосвязи между классами. Внедрение зависимости как раз решает эту задачу.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
esterio
Отправлено: 13 Августа, 2014 - 13:57:30
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




morfey пишет:
echo 'action:' . $action . ' , user name: ' . Users::getName();

Здесь как раз еще раз проблема которую описал DelphinPRO - логер не должен знать о каком-то Users.
 
 Top
OrmaJever Модератор
Отправлено: 13 Августа, 2014 - 16:01:33
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Я конечно извиняюсь, но чем этот код
DelphinPRO пишет:
PHP:
скопировать код в буфер обмена
  1. class Logs {
  2.  
  3.     function log($action) {
  4.         echo 'action:' . $action;
  5.     }
  6.  
  7. }

отличается от этого

PHP:
скопировать код в буфер обмена
  1.     function log($action) {
  2.         echo 'action:' . $action;
  3.     }

? Закатив глазки


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Sail
Отправлено: 13 Августа, 2014 - 16:33:42
Post Id



Участник


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


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




OrmaJever
тем же, чем этот:
PHP:
скопировать код в буфер обмена
  1. function addCash($cash) {
  2.         $this->logs->log('Add cash:' . $cash . ' , user name: ' . $this->getName());
  3.         // какой-то функционал
  4.     }

от этого:
PHP:
скопировать код в буфер обмена
  1. function addCash($cash) {
  2.         Logs::log('Add cash:' . $cash);
  3.         // какой-то функционал
  4.     }

Улыбка
(из примеров выше, конечно-же)

(Отредактировано автором: 13 Августа, 2014 - 16:36:06)

 
 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