Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Значения переменных функции(метода) в классе


Автор: bobroff 20.3.2009, 22:53
Здравствуйте. Думаю вопрос простой, но самостоятельно ответ найти не удалось. 

К примеру есть класс:
class db {  

var $db_login="root"; 
var $db_password="root"; 
var $db_host="localhost"; 

var $db_connection; 

function db_connect($host,$login,$password) { 
$this->db_connection=mysql_connect($host,$login,$password); 
} 
}


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

Код, вида:
function db_connect($host=$this->db_host,$login=$this->db_login,$password=$this->db_password) { 
$this->db_connection=mysql_connect($host,$login,$password);

...в не работает.

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

Автор: enof 20.3.2009, 22:56
Код

function db_connect($host = "localhost", $login = "root", $password = "root")

Автор: bobroff 20.3.2009, 23:06
Это слишком просто. Вообще, эти переменные/константы будут определяться в другой подключаемой библиотеке.

Автор: enof 20.3.2009, 23:12
bobroff, 
как вариант объявлять функцию без параметров, в самой функции получать переданные параметры, если чего-то нехватает,
то global $var; и юзать.

У вас же класс, тогда без global.

Автор: bobroff 20.3.2009, 23:15
Вроде подсказали более простое решение:

PHP:
 <?php
 class a {
     const DEFAULT_HOST = 'localhost';
     // ...
     public function db_connect($host = self::DEFAULT_HOST, // ...) {

Буду пробовать.

Автор: enof 20.3.2009, 23:28
bobroff,   smile мой первый пост прочитайте.

Автор: IZ@TOP 21.3.2009, 00:48
Самый простой вариант, ИМХО

Код

function __construct(...)
{
    $this->host = (isset($GLOBALS['db']['host']) ? $GLOBALS['db']['host'] : $this->default_host;
    // ... и все в таком духе
    $this->connect = mysql_connect(....); // тут соединение
}


Если есть желание, пишите конфиги с возможностью перезаписи значений дефолтными в случае их отсутствия.

Автор: bobroff 21.3.2009, 12:29
В итоге пока получилось следующее:
config.php:
Код

<?
// Параметры работы с базой данных;
define ("DB_HOST","localhost",true); // Сервер базы данных;
define ("DB_DATABASE","emeal",true); // База данных;
define ("DB_LOGIN","root",true); // Логин (имя пользователя) к базе данных;
define ("DB_PASSWORD","root",true); // Пароль к базе данных;
?>


db.module:
Код

<?php

require_once ("lib/config.php");
 
class db { 

private $default_host;
private $default_database;
private $default_login;
private $default_password;

private $db_connect;

public function __construct($host=DB_HOST,$database=DB_DATABASE,$login=DB_LOGIN,$password=DB_PASSWORD) {
    $this->default_host = $host;
    $this->default_database = $database;
    $this->default_login = $login;
    $this->default_password = $password;
}

public function db_connect() {
    $this->db_connect = mysql_connect($this->default_host,$this->default_login,$this->default_password) or die("Не возможно установить соединение с сервером базы данных: ".mysql_error());
    mysql_select_db($this->default_database, $this->db_connect) or die("Не возможно подключиться к базе данных: ".mysql_error());
}

}
?>


В целом работает, параметры по умолчанию устанавливает. Но опять же небольшой вопрос. 
Когда создаешь новый объект из этого класса:
Код

$newconnect = new db();
$newconnect->db_connect();

Все ок.

Код

$newconnect = new db("server");
$newconnect->db_connect();

Тоже все ок: выдвет ошибку подключения, т.к. "server" не существует.

А когда хочу, например, выбрать другую базу, пропуская указание сервера (т.е. скрипт должен подставить сервер по-умолчанию):
Код

$newconnect = new db(,"base");
$newconnect->db_connect();

Выдает ошибку: "Parse error: syntax error, unexpected ',', expecting ')' in..."
В чем тут ошибка? Почему нельзя пропустить параметр?

Когда пишешь вот так:
Код

$newconnect = new db("","base");
$newconnect->db_connect();

Все ок.

Автор: IZ@TOP 21.3.2009, 12:45
Цитата(bobroff @  21.3.2009,  13:29 Найти цитируемый пост)
А когда хочу, например, выбрать другую базу, пропуская указание сервера (т.е. скрипт должен подставить сервер по-умолчанию):

http://forum.vingrad.ru/index.php?showtopic=252128&view=findpost&p=1818424 этот пост тебе поможет

Цитата(bobroff @  21.3.2009,  13:29 Найти цитируемый пост)
Выдает ошибку: "Parse error: syntax error, unexpected ',', expecting ')' in..."
В чем тут ошибка? Почему нельзя пропустить параметр?

Передавай null в качестве значения. Но, на твоем месте, я бы вынес в конфиг эти параметры и считывал оттуда.
Код

$config['database'] = 'mydatabase';

// ...

class db {

    // ...

     /**
      * Параметр для соединения с базой данных по умолчанию
      */
     protected $database = 'test';

    // ...

    public function __construct()
    {
          $this->database = isset($GLOBALS['config']['database']) ? $GLOBALS['config']['database'] : $this->database;
          // ...
          $this->connection = mysql_connect(...);
    }
    
    // ...
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)