2010-11-11 2 views
2

У меня есть страница PHP, который имеет некоторые переменные относительно т.е. базы данных адреса сервера, имени пользователя и пароля и т.д.включая класса внутри другого класса в PHP

config.php будет включать в себя

<?php 
    $dbserver=""; 
    $username=""; 
    $password=""; 
    $database=""; 
?> 

У меня есть класс который содержит все функции, необходимые для моего веб-сайта. Как я могу импортировать переменные php-страницы в этот класс, который будет использоваться для подключения к базе данных?

мой класс

<?php 
    class a{ 
     include("config.php"); 
     function db_connect(){ 
     mysql_connect($dbserver,$username,$password); 
     } 
    } 
?> 

ответ

0

Я использовал конфигурацию базы данных в конструкторе класса. Я думаю, что это единственное решение, которое не включало третью страницу в сценарий.

2

обычно для этой цели существуют константы.

Но если вы хотите использовать переменные, все, что вам нужно сделать, это require_once (yourFile), а затем, когда вы хотите использовать эти переменные (глобальные) внутри метода класса, просто назовите их как global $myVar; (как будто вы заявляете об этом). Только нужно сделать это один раз для каждой глобальной переменной, которую вы хотите использовать в контексте.

Пример:

settings.php:

$conn = 'my connection'; 

MyClass.php:

class MyClass 
{ 
    function DoSomething() 
    { 
     require_once('settings.php'); 
     global $conn; 
     doSomethingWith($conn); 
    } 
} 
+0

Использование констант - путь. – Hammerite

+0

следует избегать ключевого слова 'global'. Это заставит 'MyClass' зависеть от глобальной области, что затрудняет работу вашего приложения и отменяет его. – Gordon

+0

спасибо за добрый ответ. Моя php-страница, например config.php, будет содержать мой класс класс а { функция db_connect() { mysql_connect ($ DbServer, $ имя пользователя, пароль $); } } Я думаю, что теперь я более ясен. Как использовать переменные, перечисленные в config.php, в моем классе a? – booota

2

Update

Для класса базы данных, которая требует опции конфигурации, простейший путь должен был бы использовать конфигурацию v (пример 1 моего первоначального ответа ниже).

Более сложным, хотя и более гибким подходом является Config-Class.

class Config 
{ 
    private $config = array(); 

    public function __construct(array $config) 
    { 
    $this->config = $config; 
    } 

    public function Register($key, $value) 
    { 
    $this->config[$key] = $value; 
    } 

    public function Get($key) 
    { 
    if (!isset($this->config[$key])) return null; 
    return $this->config[$key]; 
    } 
} 

Ваш класс DB будет выглядеть примерно так:

class Database 
{ 
    private $config = null; 

    public function __construct(Config $config) 
    { 
    $this->config = $config; 
    } 

    public function Connect() 
    { 
    do_connect_stuff($this->config->Get('host'), $this->config->Get('user'), .....); 
    } 
} 

config.php Файл

<?php 

$config = new Config(
    array(
    "host" => "localhost", 
    "user" => "user", 
    ... 
) 
); 

/* 
alternative: 
$config = new Config(); 
$config->Register('host', 'localhost'); 
$config->Register('user', 'user'); 
... 
*/ 
?> 

файл, который требует базы данных:

<?php 

$database = new Database($config); 
$database->Connect(); 

?> 

В стороне Подсказка: используйте PDO, это намного лучше, чем th e старые mysql_* функции.


Оригинал ответа

Правильный стиль должен был бы передать переменные в функции в качестве параметра или передать их при создании объекта. Вы также можете использовать методы Init для передачи параметров.

Примеры:
(Какой из следующего кода, который вы должны использовать, зависит от того, что у вас уже есть, и как ваш код разработан, то «чистый» способ был бы объект, для которого вы передаете переменные при вызове метода ProcessAction)

Предполагая, что в вашем скрипте есть переменная $action, которую вы получаете от $ _GET или каким-либо другим способом.

Использование объекта

class Controller 
{ 
    public function ProcessAction($action, $some_other_parameter, $and_yet_another_parameter) 
    { 
    [...] 
    } 
} 

Вы затем вызвать его с

$action = do_some_stuff_to_get_action(); 
$controller = new Controller(); 
$controller->ProcessAction($action, $other_parameter, $second_parameter); 

Использование статического класса

class Controller 
{ 
     public static function ProcessAction($action, $some_other_parameter, $and_yet_another_parameter) 
     { 
     [...] 
     } 
} 

Вызывается с:

$action = do_some_stuff_to_get_action(); 
Controller::ProcessAction($action, $other_parameter, $second_parameter); 

Передача параметров перед вызовом функции

Объект

class Controller 
{ 
    private $action = ""; 
    private $some_other_parameter = ""; 

    public function __construct($action, $some_other_parameter) 
    { 
    $this->action = $action; 
    $this->some_other_parameter = $some_other_parameter; 
    } 

    public function ProcessAction() 
    { 
    if ($this->action == 'do_stuff') 
    { 
     [...] 
    } 
    } 
} 

Вызывается с:

$action = do_some_stuff_to_get_action(); 
$controller = new Controller($action, $other_parameter); 
$controller->ProcessAction(); 

статические методы

class Controller 
{ 
     private static $action = ""; 
     private static $some_other_parameter = ""; 

     public static function Init($action, $some_other_parameter) 
     { 
     self::$action = $action; 
     self::$some_other_parameter = $some_other_parameter; 
     } 

     public static function ProcessAction() 
     { 
     if (self::$action == 'do_stuff') 
     { 
      [...] 
     } 
     } 
} 

Вызывается с:

$action = do_some_stuff_to_get_action(); 
Controller::Init($action, $other_parameter); 
Controller::ProcessAction(); 
+0

+1 для инъекции зависимости. Статический класс не является вариантом, хотя он эффективно создает ту же самую тесную связь, что и использование глобальных переменных. Попробуйте издеваться над этим статическим контроллером в некотором классе, который его использует. Это просто больно. – Gordon