Я запутался в том, как обращаться с логикой повторного использования объекта базы данных и переменных или констант конфигурации, которые являются глобальными для приложения.
То, что я делал до сих пор, я создал config.php
файл в каталоге Config
и объявил все элементы config
, например, мой типичный файл config.php будет выглядеть так:
#Start Session
session_start();
#Start Output Buffering
ob_start();
#Set Default TimeZone
date_default_timezone_set('Asia/Kolkata');
#Define Time Constant
define('DATE', date("d-F-Y/H:ia"));
#Define Paths
define('CLASSES',$_SERVER['DOCUMENT_ROOT'].'/resources/library/classes/');
define('MODELS',$_SERVER['DOCUMENT_ROOT'].'/resources/library/models/');
define('LOGS',$_SERVER['DOCUMENT_ROOT'].'/resources/logs/');
#Define Connection Constant
define('HOST','localhost');
define('USERNAME','username');
define('PASSWORD','password');
define('DATABASE','dbname');
try
{
#Connection String.
$dbh = new PDO('mysql:host='.HOST.';dbname='.DATABASE,USERNAME,PASSWORD);
#Set Error Mode to ERRMODE_EXCEPTION.
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
#Print Errors.
echo $e->getMessage();
#Log Errors into a file
file_put_contents(LOGS.'Connection-log.txt', DATE.PHP_EOL.$e->getMessage().PHP_EOL.PHP_EOL, FILE_APPEND);
}
#Autoload Classes.
function __autoload($class) {
require_once CLASSES.'class.'.strtolower($class).'.php';
}
и в файле index.php я бы включил этот файл один раз и повторно использовал бы его в каждом объекте.
Мой index.php обычно состоит из таких контроллеров.
if(isset($_GET['users'])) {
require_once(MODELS.'users/users.php');
} else if(isset($_GET['categories'])) {
require_once(MODELS.'categories/categories.php');
} else if(isset($_GET['search'])) {
require_once(MODELS.'search/search.php');
}
и в Моделях я бы создавал экземпляр объекта, который мне нужен, и использовал бы его, например, в users/users.php
Я бы создавал его так, как это
$user = new User($dbh);
все работает нормально, но проблема в том, что для каждого класса я должен передать объект дескриптора базы данных через конструктор и повторно использовать его в классе, что для меня несколько уродливо. и этот подход создает проблему для меня, если я хочу использовать класс, который содержит статические методы и свойства, которые содержат параметры приложения, которые должны быть получены из базы данных. мое требование таково, что
Я хочу создать статический метод с использованием одноэлементного шаблона, который будет содержать объект базы данных, который должен использоваться в приложении, без необходимости передавать объект $dbh
каждый раз через конструктор для каждого класса. и я очень смущен тем, как я должен иметь дело с этим.
спасибо