У меня есть функция, которая извлекает некоторые данные из базы данных, форматирует ее как HTML, а затем сохраняет этот HTML в переменную $output
. Проблема в том, что $output
не может быть эхом на экране сейчас, только позже, после запуска других функций. Также эти данные должны быть получены на этом этапе, а не позднее.
Итак, как я могу назвать эту переменную $output
в другой функции, после того, как начат вывод на экран?
Вы можете определить $output
в главном скрипте и импортировать его в функцию:
function output() { global $output;
Это, вероятно, будет работать для вашей ситуации. Однако считается, что плохой практикой является использование глобального пространства переменных с такими вещами, и это справедливо. (Поверь мне, я делал это в течение многих лет . 🙂
Существуют и другие подходы, которые лучше подходят для долгосрочного качества кода и поддерживаемости.
Глобальный конфигурационный массив
Вы можете либо сохранить один глобальный массив для всех глобальных параметров. Сделайте это где-нибудь в своем главном скрипте:
$config = array(); $config["output"] = "<html>.......</htmL>"; $config["user_language"] = "en"; .....
вы импортируете массив конфигурации в функцию следующим образом:
function output() { global $config; echo $config["output"];
Образец реестра
если вы хотите сделать чтение, вы можете использовать что-то более продвинутое, как шаблон реестра. Показанный здесь фрагмент выглядит неплохим примером для реестра. У Zend Framework также есть класс для этого.
Но такие вещи, как реестр, действительно, действительно продвинуты и, вероятно, вам не нужны в этот момент. Я бы предложил использовать один центральный конфигурационный массив. Если возникнет необходимость в чем-то более сложном, конфигурационный массив легко найти и заменить.
Контекст: Являются ли глобальные переменные в PHP плохой практикой?
приветствуем использование возвратов и параметры передачи: НЕ ИСПОЛЬЗУЙТЕ global
, он разрушает инкапсуляцию, один из краеугольных камней объектно-ориентированного программирования, и может привести к невероятно тяжело поддерживать код.
<?php function doSomethingInDb(){ $value = db_result(); //something from the database, this is psuedo code return $value } function displaySomethingFromDb($input){ echo($input); //or some other way of displaying } //calulate results $output = doSomethinginDb(); //do other stuff... //output the result when you need it... displaySomethingFromDb($output);
Вы должны передать переменную через аргумент функции или определить ее как глобальную внутри функции.
$output = '<p>macilaci</p>'; function doesathing($output) { echo $output; }
ИЛИ
function doesathing() { global $output; echo $output; }
не помещайте данные в переменную внутри функции, которая ее извлекает.
function retrieve(...) { ... fetch from db return $rv; } function other() {...} function still($data) { ... echo $data; } $output = retrieve(...); other(); still($output);
Вместо того, чтобы просто помещать этот фрагмент в глобальную переменную, IMHO лучшим решением является использование системы шаблонов для создания элементов страницы.
NB Я не предлагаю, чтобы вы немедленно выбежали и начали загружать Smarty – хотя есть преимущества и недостатки для полного разделения логики и презентации, есть только преимущества в модульном подходе к вашему экрану.
C.
Поместите следующую строку в начале функции, которая определяет $output
:
global $output;
Поместите ту же строку в начале любой функции, которая будет ее использовать.
(Это не будет работать или будет мешать другим переменным, если в глобальной области уже есть переменная с именем $output
.)
Использовать сеанс
Например:
session_start(); $query = '...........'; $result = mysql_query($query); $_SESSION['mysqlResult'] = $result;
Теперь вы можете использовать его с любой страницы в любое время, просто называя это
$myresult = $_SESSION['mysqlResult'];