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
Форумы портала PHP.SU :: Версия для печати :: Взаимодействие классов
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Взаимодействие классов

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

1. morfey - 13 Августа, 2014 - 11:56:41 - перейти к сообщению
Помогите понять.
Классы взаимно объявляются в конструкторе, что вызывает ошибку. Но допустим мне нужно и там и там использовать эти классы (я понимаю что можно просто передать в ф-ю еще один аргумент), как вобще это организовать.

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

Вот пример
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.  
2. alexiy - 13 Августа, 2014 - 12:15:24 - перейти к сообщению
morfey я бы методы логирования сделал бы статическими
3. esterio - 13 Августа, 2014 - 12:24:51 - перейти к сообщению
А что вы хотели.
Цитата:
new Users ->new Logs -> new Users ->new Logs -> new Users ->new Logs -> new Users ->new Logs ...

паттерн Registry наверно вам поможет.
4. DelphinPRO - 13 Августа, 2014 - 12:57:01 - перейти к сообщению
Во-первых, объект логирования можно передавать из вне
Во-вторых, логгеру абсолютно не нужно знать о других объектах системы. Его задача - записать данные в лог. Готовые данные, которые ему передадут.
В итоге, что-то такое:

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 мне кажется лучше.
5. morfey - 13 Августа, 2014 - 13:15:48 - перейти к сообщению
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.  
6. caballero - 13 Августа, 2014 - 13:15:54 - перейти к сообщению
к чему эти извращениия если можно взять тот же monolog
7. DelphinPRO - 13 Августа, 2014 - 13:43:45 - перейти к сообщению
morfey пишет:
На сколько правильно пользоваться оператором разрешения области видимости

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

И все же лучше уменьшать взаимосвязи между классами. Внедрение зависимости как раз решает эту задачу.
8. esterio - 13 Августа, 2014 - 13:57:30 - перейти к сообщению
morfey пишет:
echo 'action:' . $action . ' , user name: ' . Users::getName();

Здесь как раз еще раз проблема которую описал DelphinPRO - логер не должен знать о каком-то Users.
9. OrmaJever - 13 Августа, 2014 - 16:01:33 - перейти к сообщению
Я конечно извиняюсь, но чем этот код
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.     }

? Закатив глазки
10. Sail - 13 Августа, 2014 - 16:33:42 - перейти к сообщению
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.     }

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

 

Powered by ExBB FM 1.0 RC1