PHP: определить константы вне класса или в конструкторе? - PullRequest
5 голосов
/ 11 ноября 2011

Я новичок в классах и оо.Я искал базовый класс MySQL для начала и нашел «Простой класс MySQL» Мэтью Сарагусы.

Это первые строки:

define('SIMPLE_DB_SERVER', 'mysqlserver.net');
define('SIMPLE_DB_NAME', 'mydbname');
define('SIMPLE_DB_USERNAME', 'myusername');
define('SIMPLE_DB_PASSWORD', 'mypassword');
class ASimpleMySQLDB {
    public function __construct($server, $database, $username, $password){

        $this->conn = mysql_connect($server, $username, $password);
        $this->db = mysql_select_db($database,$this->conn);
    }
[...]

Интересно, есть лиэто конкретная причина, по которой константы определяются вне класса, а не с использованием конструктора - пример:

public function __construct(){
    $this->conn = mysql_connect('localhost', 'username', 'password');
    $this->db = mysql_select_db('database',$this->conn);
}

Или:

public function __construct($which_db){
        if($which_db=='firstdb'){
            $server='localhost';
            $username='user1';
            $password='pass1';
            $database='db1';
        }elseif($which_db=='otherdb'){
            $server='localhost';
            $username='user2';
            $password='pass2';
            $database='db2';
        }

    $this->conn = mysql_connect($server, $username, $password);
    $this->db = mysql_select_db($database,$this->conn);

}

Или с помощью переключателя или чего-либо еще.

В чем разница между двумя методами?Что бы вы порекомендовали?Большое спасибо: -)

Ответы [ 5 ]

3 голосов
/ 11 ноября 2011
  1. Таким образом, другие файлы / классы могут получить доступ к определенному значению (GLOBAL)
  2. Легче редактировать, если вы собираетесь изменить свою базу данных в будущем

Лучшееспособ реализовать это - создать файл конфигурации со всеми этими определениями.т.е.

configuration.php

define('SIMPLE_DB_SERVER', 'mysqlserver.net');
define('SIMPLE_DB_NAME', 'mydbname');
define('SIMPLE_DB_USERNAME', 'myusername');
define('SIMPLE_DB_PASSWORD', 'mypassword');

и включите их в свой класс соединения MySQL connection.php

include "configuration.php";

class DBConnection 
{
    public function __construct(){
        $this->conn = mysql_connect(SIMPLE_DB_SERVER, SIMPLE_DB_USERNAME, SIMPLE_DB_PASSWORD);
        $this->db = mysql_select_db(SIMPLE_DB_NAME,$this->conn);
    }
}
3 голосов
/ 11 ноября 2011

Хотя в настоящее время большинство разработчиков OO PHP в значительной степени не одобряют это решение, многие библиотеки по-прежнему используют define() для установки констант конфигурации, которые должны быть изменены конечной стороной, реализующей библиотеку. Они обычно хранятся в файле конфигурации, который требуется / включен классом, которому нужна эта информация о конфигурации, или включается в резервное копирование стека, если это необходимо глобально (Wordpress приходит на ум).

PHP 5 включает константы класса для выполнения этой же функции, но только в области действия самого класса.

http://php.net/manual/en/language.oop5.constants.php

Этот подход является хорошим способом создания специфичных для класса неизменяемых значений, которые понадобятся вашей библиотеке. Поскольку одной из основных целей использования ООП в PHP является возможность многократного использования кода, это прекрасно подходит для выпуска конфигурации. В случае вашего класса базы данных у вас может быть const объявлений перед вашим методом construct, определяющим все учетные данные доступа, такие как db_host, db_user и db_pass. Обратите внимание, что эти константы должны быть доступны с помощью ClassName::ConstName так же, как статический метод.

Хотя ООП в PHP прошло долгий путь и теперь широко распространено, тонна более старых или более «заблокированных» фреймворков и библиотек по-прежнему использует соглашение определения, поэтому вы увидите, что оно очень часто используется даже в ОО-средах.

1 голос
/ 11 ноября 2011

Я не уверен в конкретном контексте этого конкретного класса соединения MySQL, но разница между определением информации о соединении как констант, а не свойств класса, является одной из областей видимости.

Константы доступны в любом месте кодовой базы после выполнения этой конкретной строки кода, поэтому вы можете получить к ним доступ вне класса ASimpleMySQLDB. С другой стороны, любые переменные, определенные в конструкторе, не будут работать вне класса.

Часто я обнаруживаю, что люди используют константы в начале своего кода для установки значений, которые конечному пользователю потребуется изменить (обычно только один раз) (WordPress использует это в своем файле wp-config.php http://codex.wordpress.org/Editing_wp-config.php). Таким образом, людям не нужно копаться в самом классе, чтобы найти, где установить значения соединения с БД. Я предполагаю, что этот фактор читабельности объясняет, почему именно этот автор решил использовать константы.

0 голосов
/ 11 ноября 2011

Это разделение наиболее вероятно, потому что класс ASimpleMySQLDb является оболочкой для базы данных.Это общий класс, поэтому для его конкретизации с помощью жесткого кодирования детали соединения в конструкторе сделают так, чтобы вы не могли использовать его повторно.Вы хотите сохранить эту гибкость даже в пределах одного приложения, поскольку у вас может быть несколько баз данных.

Лично я стремлюсь создать класс Application, который следует шаблону синглтона и объявляет детали подключения к моей базе данных как static переменных в этом классе.Это позволяет мне по-прежнему легко изменять информацию о подключении к моей базе данных или добавлять дополнительные базы данных по мере необходимости.

0 голосов
/ 11 ноября 2011

Константы определены и в одном месте. И в ваших примерах другим разработчикам придется искать, где находятся параметры базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...