За последние 24 часа нас посетили 37303 программиста и 1721 робот. Сейчас ищут 588 программистов ...

ООП - первые шаги, помогите разобраться.

Тема в разделе "PHP для новичков", создана пользователем FishError, 6 апр 2010.

  1. FishError

    FishError Активный пользователь

    С нами с:
    16 фев 2008
    Сообщения:
    24
    Симпатии:
    0
    простите за такое название темы, просто не пришло в голову как назвать более информативно.

    делаю первые шаги в ООП, вроде все ясно, а оказывается ничего не понятно ;-)

    Например создаю пробный класс, для создания категории в меню:
    PHP:
    1.  
    2. <?php class Category {
    3.     private $title;
    4.     private $chpu;
    5.     private $db;
    6.  
    7.     public function __construct($catname, $chpu='') {
    8.         $this->db = new mysqli(dblocation, dbuser, dbpass, dbname);
    9.         $this->title=$catname;
    10.         $this->chpu=$chpu;
    11.     }
    12.     public function __destruct(){
    13.         $q="INSERT INTO ".dbpref."menu_groups SET mg_title='".$this->title."', mg_chpu='".$this->chpu."'";
    14.         if (! $this->db->query($q)){
    15.             $log->addError($this->db->error);
    16.         }
    17.     }
    18. }
    Он конечно совсем не то, что будет после, вопрос несколько в другом. $log - обьект класса Log:
    PHP:
    1. <?php
    2. class Log {
    3.     private $filename;
    4.     private $display;
    5.     private $tofile;
    6.     private $overwrite;
    7.     private $contents;
    8.     public function __construct($display=true, $save_to_file=true, $filename='error.log', $overwrite=true)
    9.     {
    10.         $this->display = (bool) $display;
    11.         $this->tofile =  (bool) $save_to_file;
    12.         $this->filename = ($this->tofile) ? $filename : '';
    13.         $this->overwrite = (bool) $overwrite;
    14.         if ($this->tofile) {
    15.             if (file_exists($this->filename)) {
    16.                 if (!$this->overwrite) {
    17.                     $this->contents=file_get_contents($this->filename);                    
    18.                 }
    19.                 else $this->contents='';
    20.             }
    21.         }
    22.        
    23.     }
    24.     public function addError($error) {
    25.         $this->contents.="\n".$error;
    26.         if ($this->display) {
    27.             echo $error;
    28.         }
    29.     }
    30.     public  function __destruct(){
    31.         if ($this->tofile) {
    32.             file_put_contents($this->filename, $this->contents);
    33.         }
    34.     }  
    35. }
    И конечно же при первой же ошибке вылазит сообщение:
    Fatal error: Call to a member function addError() on a non-object in ...\classes\cat.class.php on line 15
    То есть обьект класса Category не может обращаться к $log.
    Как в таком случае поступаем? подтолкните, может просто одно понятие, которое надо тут применить, остальное нагуглю.
    То же самое с коннектом - как бы использовать один общий $db для всех операций с базой?
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Где он?
     
  3. FishError

    FishError Активный пользователь

    С нами с:
    16 фев 2008
    Сообщения:
    24
    Симпатии:
    0
    PHP:
    1. require_once '../classes/log.class.php';
    2. $log= new Log();
    3. require_once '../classes/cat.class.php';
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    И где это в приведенном коде?

    Плюс запомните простую вещь про область видимости, переменные видны лишь там где они объявлены.
    В остальные места (в функции и методы) они должны передаваться.
     
  5. FishError

    FishError Активный пользователь

    С нами с:
    16 фев 2008
    Сообщения:
    24
    Симпатии:
    0
    я это понимаю.
    и раньше зачастую в функциях использовал global и вообще всячески безобразничал.
    А как же тогда мне поступить, чтоб это дело работало? неужели в каждый обьект придется передавать экземпляр $log ?
    Просто голова не соображает пока по ООПному :)
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Почему нет?

    Как вариант, можете сделать Registry чтобы объекты сами оттуда брали нужный им $log.
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    FishError
    смените аватару, разрешены только личные фото
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    PHP:
    1. <?php
    2. $log = new MyLog();
    3. $some = new MyClass();
    4. $some->setLog($log);
    5. // или так
    6. $some2 = new MyClassOther(array('log' => $log, 'text' => 'sometext'));
    7.  
     
  9. FishError

    FishError Активный пользователь

    С нами с:
    16 фев 2008
    Сообщения:
    24
    Симпатии:
    0
    Прошу прощения, уже.. :)

    Ясно, спасибо.
     
  10. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    или как-нибудь так
    PHP:
    1. <?php
    2. class Log {
    3.     public function __construct($message) {
    4.         file_put_contents('log.txt', $message);
    5.     }
    6. }
    7.  
    8. class MyClass {
    9.     public function A()
    10.     {
    11.         $this->db->query($sql) or new Log('my error');
    12.     }
    13. }
    14. ?>
     
  11. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а мне вот нравится Zend'овская реализация логирования, наверно буду прикручивать к своим велосипедным библиотекам
     
  12. FishError

    FishError Активный пользователь

    С нами с:
    16 фев 2008
    Сообщения:
    24
    Симпатии:
    0
    Ну я верю что велосипедом занимаюсь. Но так, для себя думаю полезно начать с такого.
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?php
    2. class sys
    3. {
    4.     private static $log;
    5.     public static function log()
    6.     {
    7.         return isset(self::$log) ? self::$log : self::$log = new log;
    8.     }
    9. }
    10. sys::log() -> addError(...
     
  14. FishError

    FishError Активный пользователь

    С нами с:
    16 фев 2008
    Сообщения:
    24
    Симпатии:
    0
    Как называется такой прием?
     
  15. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    FishError
    это называется синглтон
    кстати, почитай про него - очень помогает в понимании ооп
     
  16. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    А я пока вообще не увидел в логере объекта... Пользуюсь функциями. =))
     
  17. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Volt(220)
    человек изучает ооп, его желание заобъектировать всё и вся понятно))
     
  18. FishError

    FishError Активный пользователь

    С нами с:
    16 фев 2008
    Сообщения:
    24
    Симпатии:
    0
    :) не судите строго. Я понимаю что это должно быть чутье что и как следует обьектить и переобьечивать ;) И придет оно, надеюсь, с опытом.

    Просто понял что надо как-то подрасти чтоли.. Бо чуть только сделаю небольшой проектик, содержащий не пару десятков строк, то с разрастанием он становится все более неуправляемым.
     
  19. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    FishError
    Я лично ничего зазорного в этом не вижу. Всегда считал, что кодить нужно в свое удовольствие.
    Чтоб накодил, посмотрел, и подумал: даа... красиво получилось))
     
  20. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    использование классов не делает из процедурного стиля ОО
     
  21. al.k

    al.k Активный пользователь

    С нами с:
    4 мар 2010
    Сообщения:
    70
    Симпатии:
    0
    Адрес:
    UKR, Lugansk
    А что делает, допустим код который привел автор темы, ООП или нет?

    ...автору, не понял $chpu за что отвечает, наверное там нужен комент...