За последние 24 часа нас посетили 195667 программистов и 1989 роботов. Сейчас ищут 2052 программиста ...

Вопрос по ООП

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

  1. bxN5

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

    С нами с:
    15 янв 2009
    Сообщения:
    51
    Симпатии:
    0
    Вот начал разбираться в ООП, решил первым написать класс для работы с бд
    PHP:
    1. public function __construct($connect=true) {
    2.     include ("configs\conf.php"); // тут масив $config с параметрами подключения
    3.    
    4.     $hostname=$config['host'];
    5.     $dbuser=$config['db_user'];
    6.     $dbpassword=$config['db_password'];
    7.     $selectdb=$config['db_select'];
    на данном этапе все корректно дальше метод соединения с базой
    public function Open() {
    и вот тут проблема для использования функции внутри метода
    Код (Text):
    1. $this->mysql_link = @mysql_connect ($hostname, $dbuser, $dbpassword);
    $hostname, $dbuser, $dbpassword нужно получить с конструктора, как это сделать? погуглил пробовал что-то вроде $hostname=$this->hostname; но это не правильно
    подскажите)
     
  2. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    в конструкторе тоже сделайте $this->hostname=$config['host']; и в mysql_connect ($this->hostname,
    и @ не ставьте
     
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Сделай отдельный класс конфигурации БД
    PHP:
    1. <?php
    2. class dbCfg
    3. {
    4.      static $HOST = 'localhost';
    5.      static $USER = 'root';
    6. ...
    7. }
     
  4. bxN5

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

    С нами с:
    15 янв 2009
    Сообщения:
    51
    Симпатии:
    0
    а смысл?
     
  5. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. mysql_connect(dbCfg::$HOST, dbCfg::$USER, $dbCfg::$PWD);
     
  6. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    [vs]
    Может тогда лучше отдельный файл настроек, в котором объявляются константы?

    PHP:
    1. mysql_connect(MYHOST, MYUSER, MYPWD);
     
  7. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    ИМХО создавать класс в РНР по аналогии структуры в С++ — бессмысленно.
    Даже контейнер создавать бессмысленно.
    А конфиги из конструктора получить очень и очень просто:

    PHP:
    1. <?php
    2.  
    3. class Database
    4. {
    5.     // Контейнер с данными
    6.     protected $__containter = array();
    7.    
    8.    
    9.     /**
    10.      * Получаем и сохраняем конфиги
    11.      */
    12.     public function __construct($dbhost, $dbusr, $dbpass, $dbname) {
    13.         if(func_num_args() == 4) {
    14.             $this->__containter = func_get_args();
    15.         } else echo "Invalid arguments have been passed";
    16.     }
    17.    
    18.     /**
    19.      * Подключаемся к БД
    20.      * Конфиги у нас получены из конструктора
    21.      */
    22.     public function Connect() {
    23.         // Для теста мы только вернем
    24.         return $this->__containter;
    25.         // А так тут было бы mysql_connect( .. )
    26.     }
    27. };
    28.  
    29.  
    30. $db = new Database("localhost", "root", "password", "test");
    31.  
    32.  
    33. echo '<pre> ' . print_r($db->Connect(), true);
    34.  
    35. ?>
     
  8. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Нет конечно.
    Во первых нужно делегировать выборку конфигурационных данных или сохранять их классу моделей а не вставлять в вызове, как в Вашем случае.
    И сразу заметно, что для изменения параметров соединения, я даже не представляю, придётся лазить по всем скриптам и искать контроллер который инициировал вызов $db = new Database("localhost", "root", "password", "test"); - децентрализация конфигурационных данных - это не есть гут! В Вашем случае сильно повышается "связность" - это ещё один большо минус!
    Самый верный вариант это с отдельным файлом.
     
  9. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    bxN5
    Почитайте или посмотрите паттерн Singlton он хорошо скрывает параметры и автоматизирует кстати вызов connect
     
  10. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Это не мой случай, а случай автора.
     
  11. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    для
    самое оно))
     
  12. Animi

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

    С нами с:
    2 мар 2010
    Сообщения:
    4
    Симпатии:
    0
    1) Не дублируйте переменные. После include весь массив в вашем распоряжении.
    2) Для хранения настроек в свое время были придуманы ini-файлы. В пхп есть удобные функции для работы с ними.
    Либо xml.
    3) Создайте переменные класса и в конструкторе записывайте в них настройки.
    Например:
    PHP:
    1. private $_hostname;
    Теперь из любой функции эта переменная доступна так:
    PHP:
    1.  $hostname=$this->_hostname;
    Удачных познаний.
     
  13. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Animi
    По-моему подключить php файл вида:
    PHP:
    1. <?php
    2. $host="myhost";
    3. $user="myuser";
    4. ...
    5.  
    или такого:
    PHP:
    1. <?php
    2. define("HOST","myhost");
    3. ...
    4.  
    удобнее чем дергать ini файл.
    И редактировать легче.

    Ну и не забываем про проблемы прямого вызова ini файлов.
     
  14. Animi

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

    С нами с:
    2 мар 2010
    Сообщения:
    4
    Симпатии:
    0
    Чем удобнее?

    Для новичка да и для более опытного программиста есть несколько возможных проблем:
    1) В конфигурационном-php файле имена переменных могут совпадать с теми, что уже были использованы в функции. Тогда жди проблем и без дебаггера может быть туго.
    2) include, include_once, require, require_once. Стоит хорошо разобраться с этими функциями, если конфигурационный файл будет использоваться не раз.

    Чем легче редактировать php файл, нежели ini?

    Расскажите о проблемах подробнее, пожалуйста.
     
  15. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)include используется чаще, чем parse_ini_file, потому более знакома.
    2)У ini файлов свой синтаксис, который придется учить.
    3)Не все редакторы хорошо подсветят ini файл.

    Префиксы и пространства имен должны помочь.

    С этими конструкциями по-любому стоит хорошо разобраться.

    Если в адресной строке набрать имя файла, то php просто выполниться, а ini файл отобразится(или его предложат скачать).
    Да, можно этого избежать, но это дополнительные телодвижения, которые могут понизить удобство использования.