За последние 24 часа нас посетили 18833 программиста и 1728 роботов. Сейчас ищут 1142 программиста ...

Значения переменных функции(метода) в классе по умолчанию?

Тема в разделе "PHP для новичков", создана пользователем bobroff, 20 мар 2009.

  1. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Здравствуйте. Думаю вопрос простой, но самостоятельно ответ найти не удалось.

    К примеру есть класс:
    Код (Text):
    1. class db {  
    2.  
    3. var $db_login="root";
    4. var $db_password="root";
    5. var $db_host="localhost";
    6.  
    7. var $db_connection;
    8.  
    9. function db_connect($host,$login,$password) {
    10. $this->db_connection=mysql_connect($host,$login,$password);
    11. }
    12. }

    Как сделать следующее: при вызове метода db_connect, если не переданы параметры $host, $login, $password, то устанавливаются параметры по умолчанию: $db_login, $db_password, $db_host.

    Код, вида:
    Код (Text):
    1. function db_connect($host=$this->db_host,$login=$this->db_login,$password=$this->db_password) {
    2. $this->db_connection=mysql_connect($host,$login,$password);
    ...в не работает.

    Самому, как новичку, приходит в голову только проверка каждого параметра через isset(). Но, мне кажется, должно быть более простое решение. Подскажите.[/code]
     
  2. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Так что или проверки вставить, а-ля isset
    или так:
    PHP:
    1.  
    2. <?php
    3.     class  a{
    4.  
    5.         private  $name='Медвед';
    6.         private  $surname='Преведович';
    7.  
    8.         public  function  test($name = 'Медвед', $surname = 'Преведович'){
    9.             echo  'Значение $name: '.$name.'<br />';
    10.             echo  'Значение $surname: '.$surname.'<br />';
    11.         }
    12.     }
    13.    
    14.     $testClass  =  new  a();
    15.     $testClass->test('Акринель', 'Данонович');
    16.     $testClass->test();
    17. ?>     
    18.  
     
  3. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. class a {
    3.     const DEFAULT_HOST = 'localhost';
    4.     // ...
    5.     public function db_connect($host = self::DEFAULT_HOST, // ...) {
     
  4. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Sergey89, действительно я сурово стормозил. bobroff, извиняюсь за некорректный ответ.
     
  5. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Огромное спасибо. Буду пробовать.
     
  6. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Если можно разъясните, пожалуйста, почему данная конструкция не работает через $this?
     
  7. Alost

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

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Тоесть через $this? Пример кода.
     
  8. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Код (Text):
    1. <?php
    2.  class a {
    3.      const DEFAULT_HOST = 'localhost';
    4.      // ...
    5.      public function db_connect($host = $this->DEFAULT_HOST, // ...)
    Работать не будет, но не понимаю почему. В чем отличие self и $this. Читал мануал, так и не понял.
     
  9. mantell

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

    С нами с:
    7 окт 2008
    Сообщения:
    125
    Симпатии:
    1
    $this->DEFAULT_HOST - обращение к свойству, self::DEFAULT_HOST - к константе
     
  10. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    self указывает не на объект, а на класс. Можно было записать как a::DEFAULT_HOST
     
  11. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    То mantell, Sergey89:
    Понял. Спасибо.

    В итоге пока получилось следующее:
    config.php:
    Код (Text):
    1.  
    2. <?
    3. // Параметры работы с базой данных;
    4. define ("DB_HOST","localhost",true); // Сервер базы данных;
    5. define ("DB_DATABASE","emeal",true); // База данных;
    6. define ("DB_LOGIN","root",true); // Логин (имя пользователя) к базе данных;
    7. define ("DB_PASSWORD","root",true); // Пароль к базе данных;
    8. ?>
    db.module:
    Код (Text):
    1.  
    2. <?php
    3.  
    4. require_once ("lib/config.php");
    5.  
    6. class db {
    7.  
    8. private $default_host;
    9. private $default_database;
    10. private $default_login;
    11. private $default_password;
    12.  
    13. private $db_connect;
    14.  
    15. public function __construct($host=DB_HOST,$database=DB_DATABASE,$login=DB_LOGIN,$password=DB_PASSWORD) {
    16.     $this->default_host = $host;
    17.     $this->default_database = $database;
    18.     $this->default_login = $login;
    19.     $this->default_password = $password;
    20. }
    21.  
    22. public function db_connect() {
    23.     $this->db_connect = mysql_connect($this->default_host,$this->default_login,$this->default_password) or die("Не возможно установить соединение с сервером базы данных: ".mysql_error());
    24.     mysql_select_db($this->default_database, $this->db_connect) or die("Не возможно подключиться к базе данных: ".mysql_error());
    25. }
    26.  
    27. }
    28. ?>
    В целом работает, параметры по умолчанию устанавливает. Но опять же небольшой вопрос.
    Когда создаешь новый объект из этого класса:
    Код (Text):
    1.  
    2. $newconnect = new db();
    3. $newconnect->db_connect();
    Все ок.

    Код (Text):
    1.  
    2. $newconnect = new db("server");
    3. $newconnect->db_connect();
    Тоже все ок: выдвет ошибку подключения, т.к. "server" не существует.

    А когда хочу, например, выбрать другую базу, пропуская указание сервера (т.е. скрипт должен подставить сервер по-умолчанию):
    Код (Text):
    1.  
    2. $newconnect = new db(,"base");
    3. $newconnect->db_connect();
    Выдает ошибку: "Parse error: syntax error, unexpected ',', expecting ')' in..."
    В чем тут ошибка? Почему нельзя пропустить параметр?[/code]

    Когда пишешь вот так:
    Код (Text):
    1.  
    2. $newconnect = new db("","base");
    3. $newconnect->db_connect();
    Все ок.
     
  12. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    так делать нельзя. опускать можно только параметры с конца.
     
  13. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    А какие есть варианты? Передавать параметры в массиве?
     
  14. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  15. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1. <?
    2. class db {
    3.     var $db_login="root";
    4.     var $db_password="root";
    5.     var $db_host="localhost";
    6.  
    7.     var $db_connection;
    8.  
    9.     function db_connect($host = null,$login = null,$password = null) {
    10.         if (is_null($host)) $host = $this->db_host;
    11.         if (is_null($login)) $login = $this->db_login;
    12.         if (is_null($password)) $password = $this->db_password;
    13.  
    14.         $this->db_connection=mysql_connect($host,$login,$password);
    15.     }
    16. }
    17.  
    18. $newconnect = new db("server");
    19. $newconnect->db_connect();
    20.  
    21.  
    22. $newconnect = new db(null,"base");
    23. $newconnect->db_connect();
     
  16. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Да, как вариант, спасибо.