chelovekmuravei
@chelovekmuravei
\(-_-)/ раз два три четыре

Вызвать функцию класса и других функций(область видмости)?

Есть класс для работы database
class Database_Connect{
    private $db;
    function __construct($db_mysql, $db_user, $db_pass){
        $this->db = new PDO($db_mysql, $db_user, $db_pass);
        $this->db -> exec("SET NAMES UTF8");
    }
    function Database($request, $array){
        $a = $this->db->prepare("$request");
        if($array !== false){
            $a->execute($array);
        }
        else{
            $a->execute();
        }
        return $a;
    }
}

$database = new Database_Connect('mysql:host=localhost;dbname=x','x','x');
Выводим имена (для проверки)

$request = "SELECT `name` FROM `test` LIMIT 50";
$array = false;

$a = $database->Database($request, $array);

foreach ($a as $row)
{
	echo $row['name'] . "<br/>";
}
Все работает, но если мне нужно использовать базу в различных функциях, область видимости $database теряется, создавать новый объект каждый раз?

Добавлено
---- 1 ----
можно использовать $GLOBALS["database"], но это не совсем то, так как думаю есть более правильные варианты
---- 2 ----
Оператор разрешения области видимости (::)
-скоро выложу пример, работает

<?php

class Database_Connect{
	private static $db;
	function __construct($db_mysql, $db_user, $db_pass){
		self::$db = new PDO($db_mysql, $db_user, $db_pass);
		self::$db -> exec("SET NAMES UTF8");
	}
	function Database($request, $array){
		$a = self::$db->prepare($request);
		if($array !== false){
            $a->execute($array);
        }
        else{
            $a->execute();
        }
        return $a;
	}
}
$db_mysql = 'mysql:host=localhost;dbname=x';
$db_user = 'x';
$db_pass = 'x';
$start_Database_Connect = new Database_Connect($db_mysql, $db_user, $db_pass);

$request = "SELECT `room` FROM `test` LIMIT 50";
$array = false;
$a = Database_Connect::Database($request, $array);

foreach ($a as $row)
{
	echo $row['room']."<br/>";
}

function Infunction(){
	$request = "SELECT `name` FROM `test` LIMIT 50";
	$array = false;
	$a = Database_Connect::Database($request, $array);
	
	foreach ($a as $row)
	{
		echo $row['name']."<br/>";
	}
}
Infunction();
?>

Описание: создаем объект класса, передаем данные для подключения к базе, срабатывает конструктор, PDO и кодировка, $db static и обращаемся к ней через self:: и сам вызов функции Database_Connect::Database($request, $array); из любого места в коде
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 2
@MadridianFox
Web-программист, многостаночник
Лучший вариант - иметь одну точку входа, в которой создаётся подключение, и передавать это подключение вглубь только через конструкторы классов и аргументы методов.

Более реалистичный вариант - выделение какого-нибудь service locator'а, который тоже лучше передавать руками, но часто его делают доступным глобально через static или singleton (который сам строится на static).

Ваше решение в корне не верно. Класс, всё содержимое которого статическое это уже не класс, а набор функций.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
27 апр. 2024, в 13:49
300000 руб./за проект
27 апр. 2024, в 13:30
30000 руб./за проект
27 апр. 2024, в 13:22
600 руб./за проект