За последние 24 часа нас посетили 19102 программиста и 1637 роботов. Сейчас ищут 863 программиста ...

Область видимости между классами.

Тема в разделе "PHP для новичков", создана пользователем Looser, 25 фев 2008.

  1. Looser

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

    С нами с:
    25 фев 2008
    Сообщения:
    2
    Симпатии:
    0
    Я понимаю, что вопрос детский, но тем не менее актуален =)

    есть класс db, есть класс main.
    В индекс.php так:

    Код (Text):
    1.  
    2. include('main.php');
    3. include('db.php');
    4.  
    5. $db=new db;
    6. $page = new main($_REQUEST['type'], $_REQUEST['method'], $_REQUEST['id']);
    7. echo $page->print_page;
    Так вот вопрос, почему оно ругается в конструкторе класса main вот здесь:

    Код (Text):
    1. if(!$db->db_con) $this->error_mes('Error connecting db<br>');
    Причем к базе он норм коннектится, и вне этого класса вполне видит $db->db_con.
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Потому, что в методах класса, как и в функциях, нужно писать global $db; чтобы получить доступ к глобальной переменной из локальной области видимости.
     
  3. Looser

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

    С нами с:
    25 фев 2008
    Сообщения:
    2
    Симпатии:
    0
    оО. Мда, действительно =)
    Спасибо ))
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    уж если юзаешь ООП, то нужно писать

    $db = MyDBClass::GetInstance();

    где MyDBClass наследует от патерна синглетон.
    Тогда гарантировано

    - получишь единственный экземпляр класса
    - не будешь мусорить в глобале
    - появится хоть какая-нить ООП модель
    - вызов можно производжить в ЛЮБОМ месте кода

    и т.д.
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    так же при работе с ООП и классами надо использовать __autoload();
    - сокращает код.
    - не надо думать что где включать
    - включение идет из нужных тебе директориев
     
  6. Anonymous

    Anonymous Guest

    Босс! У меня не пашет это дело с автолоадом!
    Покажи реализацию, о мудрый???
    Эта сволочь возвращает инстанс класса TSingleton, а не унаследованового... :( нет, я конечно придумал костыли - но это костыли?
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    покажи?

    покажи?
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    autoload.php

    PHP:
    1.  
    2. <?php
    3.  
    4. /**
    5. * Автозагрузчик классов
    6. *
    7. * Используется для автоматической загрузки классов в код
    8. *
    9. * @package      Indigo
    10. * @subpackage   Core
    11. *
    12. * @author     Andrey Lugovoy <root@440hz.ru>
    13. * @version    $Id: autoload.php  $
    14. *
    15. * @access public
    16. *
    17. */
    18.  
    19. /**
    20. * получаем список директориев для сканирования
    21. */
    22. function autoloadscandirs($dir,&$dirs) {
    23.  
    24.     if (is_dir($dir)) {
    25.         $dirs[] = $dir;
    26.         if ($dh = opendir($dir)) {
    27.             while (($file = readdir($dh)) !== false) {
    28.                 if($file[0] == '.') continue;
    29.                 $filename = $dir.$file;
    30.                 if(is_dir($filename)) autoloadscandirs($filename.'/',$dirs);
    31.             }
    32.             closedir($dh);
    33.         }
    34.     }
    35.  
    36.  
    37.  
    38.  
    39. }
    40.  
    41. /**
    42. * получаем список файлов для сканирования
    43. */
    44. function autoloadscanfiles($dir,&$dirs) {
    45.  
    46.     if (is_dir($dir)) {
    47.         if ($dh = opendir($dir)) {
    48.             while (($file = readdir($dh)) !== false) {
    49.                 if($file[0] == '.') continue;
    50.                 $filename = $dir.$file;
    51.                 if(is_dir($filename)) autoloadscanfiles($filename.'/',$dirs);
    52.                 if(is_file($filename))     
    53.                     $dirs[] = $file;
    54.  
    55.             }
    56.             closedir($dh);
    57.         }
    58.     }
    59.  
    60.  
    61.  
    62.  
    63. }
    64.  
    65. /**
    66. *
    67. * Автозагрузчик
    68. *
    69. * @param $name string
    70. * @return bool
    71. * @access public
    72. */
    73. function __autoload($name) {
    74.  
    75.     static $dirs = false;
    76.  
    77.     if(!$dirs) autoloadscandirs(INDIGO_CLASS_ROOT.'/',$dirs);
    78.  
    79.     // получмили имя класса
    80.     $name = strtolower(basename($name)).'.php';
    81.  
    82.     foreach($dirs AS $dir) {
    83.         $filename = $dir.$name;
    84.         if(file_exists($filename)) {
    85.             require_once($filename);
    86.             return true;
    87.         }
    88.     }
    89.  
    90.     die("не могу загрузить класс [$name]");
    91.  
    92.     return false;
    93.  
    94. }
    95.  
    96. ?>
    97.  
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    синглетон

    PHP:
    1.  
    2. <?php
    3.  
    4. /**
    5. *
    6. * Паттерн для работы только с одним экземпляром класса
    7. *
    8. * @package      Indigo
    9. * @subpackage   Patterns
    10. *
    11. */
    12.  
    13. class IndigoSingleton extends IndigoAtom {
    14.  
    15.     // хранилище экземпляров классов
    16.     private static $instance = array();
    17.    
    18.    // что б не могли клонировать
    19.     private function __clone() {
    20.         return false;
    21.     }
    22.    
    23.     // синглетоним...
    24.     public static function GetInstance($class=__CLASS__) {
    25.  
    26.         if (!isset(self::$instance[$class]))
    27.             self::$instance[$class] = new $class;
    28.        
    29.         return self::$instance[$class];
    30.    
    31.    }
    32.  
    33. }
    34.  
    35. ?>
    36.  
    сессия

    PHP:
    1.  
    2. <?php
    3.  
    4. /**
    5. *
    6. * @package      Indigo
    7. * @subpackage   Core
    8. *
    9. */
    10.  
    11. class IndigoSession extends IndigoSingleton {
    12.  
    13. /////
    14.  
    15.     public static function GetInstance() {
    16.  
    17.         return parent::GetInstance(__CLASS__);
    18.  
    19.     }
    20.  
    21. /////
    22.  
    23. }
    24.  
    25. ?>
    26.  
    АТОМ

    PHP:
    1.  
    2. <?php
    3.  
    4. /**
    5. *
    6. * @package      Indigo
    7. * @subpackage   Patterns
    8. *
    9. * @author Andrey Lugovoy
    10. * @version 1.0
    11. * @copyright CopyRight (c) 2007 Fabrika-koda.ru
    12. */
    13.  
    14. /**
    15. *
    16. * Базовый класс.
    17. *
    18. * От класса наследуют все потомки системы
    19. *
    20. * @access       public
    21. *
    22. */
    23. class IndigoAtom {
    24.  
    25.     /**
    26.     * Конструктор
    27.     *
    28.     * @return bool
    29.     */
    30.     public function __construct() {
    31.         return true;
    32.     }
    33.  
    34.     /**
    35.     * Деструктор
    36.     *
    37.     * @return bool
    38.     */
    39.     public function __destruct() {
    40.         return true;
    41.     }
    42.  
    43.     /**
    44.     * Преоразование к строке
    45.     *
    46.     * используется для получения мени класса в операциях и выражениях
    47.     * <br><b>Пример использования</b><br><code>
    48.     *  $classname = $this;  
    49.     *  $this->Notify($name,$this);</code>
    50.     *
    51.     * @return bool
    52.     */
    53.     protected function __toString() {
    54.  
    55.         return strtolower(get_class($this));
    56.  
    57.     }
    58.  
    59.     public function Dump() {
    60.  
    61.         print('<hr><pre>');
    62.  
    63.         ob_start();
    64.        
    65.         print('CLASS: '.$this.'<hr>');
    66.         var_dump($this);
    67.  
    68.         var_dump($_REQUEST);
    69.        
    70.         $buf = ob_get_contents();
    71.         ob_end_clean();
    72.  
    73.         print(htmlentities($buf));
    74.  
    75.         print('</pre><hr>');
    76.     }
    77.  
    78.     /**
    79.     * @param $error string error
    80.     */
    81.     protected function Error($error = 'ошибка') {
    82.  
    83.  
    84.         print(get_class($this).': ');
    85.         print($error);
    86.  
    87.         exit();
    88.  
    89.     }
    90.  
    91. }
    92.  
    93. ?>
    94.  
     
  10. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Только подумать, что все это было написано вместо global $db; и include 'db.php';... :lol:
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    когда в проекте будет больше 1 и проект будет вестись как положено такого там не будат по определению.
    а на своих маленьких страничках каждый волен делать как считает нужным.
    только почему-то проблемы, кторые возникают, решают не сами, а спрашивают у тех, кто пишет немноо по другому.

    если еще навесить CSV и трекеры и удалнную разработку, то вообще...

    и во-вторых такой подход увеличивает скорость разработки в разы.
    вот надо тебе еще подключить какую либу и что? в каждый скрипт дописывать очередной инклуд? а если инклудов 30? а если из них нужно только 5?

    поверь на слово. так веселее.
    =)

    p.s. кто так писал и делал - скажут.
     
  12. Anonymous

    Anonymous Guest

    а кто не писал и не делал - не поймут... *ушел искать ошибку*
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну все когда-то бывает в первый раз
     
  14. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. $db = Locator::instance()->getDb();
    Где-то ранее
    PHP:
    1. Locator::instance()->setDb(new Database());
    PHP:
    1. <?php
    2. class Locator {
    3.     private $registry;
    4.  
    5.     private static $instance;
    6.  
    7.     private function __construct() {
    8.         $this->registry = new Registry();
    9.     }
    10.  
    11.     public static function instance() {
    12.         if (!self::$instance) {
    13.             self::$instance = new self();
    14.         }
    15.        
    16.         return self::$instance;
    17.     }
    18.  
    19.     public function __call($name, $args) {
    20.         if (preg_match('/^set([a-z]+)$/i', $name, $m) && isset($args[0])) {
    21.             $this->registry->set($m[1], $args[0]);
    22.         } else
    23.         if (preg_match('/^get([a-z]+)$/i', $name, $m)) {
    24.             if ($this->registry->has($m[1])) {
    25.                 return $this->registry->get($m[1]);
    26.             } else {
    27.                 throw new Exception("Object '{$m[1]}' is not set in locator.");
    28.             }
    29.         }
    30.     }
    31. }
     
  15. Anonymous

    Anonymous Guest

    хехе. Блин.
    вот оно... __CLASS__ надо определять с наружи метода. Как всегда, когда поймешь, все так банально и очевидно...
     
  16. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Интересно, вот это зачем? И ещё вопрос - зачем синглетон наследует атом, а все остальные наследуют синглетон? Почему бы синглетон в атоме не сделать и все остальные потомки наследовали бы атом?
     
  17. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Например, чтобы быстро вывести имя класса для объекта.
    Потому что не все классы наследуют синглетон, но могут наследовать атом. Это нечно похожее на множественное наследование. Незачем нагружать класс лишним функционалом.
     
  18. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Зачем? Там же ничего нет.
    Какой?
     
  19. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Там есть метод для дампа объекта =) Можно и другие функции на него повесить.
    Базовый объект. Зачем в не синглетоне метод getInstance() синглетона? Он там явно лишний.
     
  20. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Ну так же можно другие функции и на атом с методом синглетон повесить.
    А, что мешает? Почему лишний.

    Ладно, всё понятно, это субъективное решение.