2010-07-01 2 views
1

У меня есть функция, которая извлекает некоторые данные из базы данных, форматирует ее как HTML и затем сохраняет этот HTML в переменную, $output. Проблема в том, что $output не может быть эхом на экране сейчас, только позже, после запуска других функций. Также эти данные должны быть получены на этом этапе, а не позднее.Временная переменная

Так как я могу назвать эту переменную $output в другой функции, после того, как начат вывод на экран?

ответ

5

Вы можете определить $output в основном сценарии, и импортировать его в функцию:

function output() 
{ 
    global $output; 

Это вероятно, будет работать для вашей ситуации. Однако считается, что плохой практикой является использование глобального пространства переменных с такими вещами, и это справедливо. (Поверьте мне, я сделал это для лет. :)

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

Глобальный массив конфигурации

Вы можете либо сохранить один глобальный массив для всех глобальных настроек. Сделайте это где-то в главном скрипте:

$config = array(); 
$config["output"] = "<html>.......</htmL>"; 
$config["user_language"] = "en"; 
..... 

импортировать массив конфигурации в функцию следующим образом:

function output() 
{ global $config; 
    echo $config["output"]; 

шаблон реестра

, если вы хотите сделать некоторое чтение, вы может использовать что-то более продвинутое, как шаблон реестра. Показанный сниппета here выглядит неплохим примером для реестра. Zend Framework также имеет класс для этого.

Но такие вещи, как реестр, действительно, действительно продвинуты и, вероятно, вам не нужны в данный момент. Я бы предложил использовать один центральный конфигурационный массив. Если возникнет необходимость в чем-то более сложном, конфигурационный массив легко найти и заменить.

Контекст: Are global variables in PHP considered bad practice?

+0

Все, что должен сделать OP, это вернуть '$ output'. Тогда он может делать все, что захочет. Даже несмотря на то, что все предупреждения о том, что глобальное плохо, решение выше все еще предлагает использовать глобальное ключевое слово для решения проблемы. Использование шаблона реестра несколько лучше, но в основном он мало чем отличается от использования ключевого слова global. Это всего лишь меньше мусора в глобальном масштабе из-за ограничения данных в реестре – Gordon

+0

@ Gordon да, но вопрос OP звучит так, как операция базы данных должна иметь место перед любым выходом - возможно, сделать переадресацию в случае ошибки. В этом случае ему понадобится место для хранения результата где-то. –

+0

Не понимаю почему. Содержимое сохраняется в переменной. Если он вернет его из функции, он может назначить ее переменной в глобальной области действия и может делать с ней все, что захочет: обходить, изменять или выводить. И он может делать все, что он чувствует, прежде чем это делать. – Gordon

0

Поместите следующую строку в начале функции, которая определяет $output:

global $output; 

Поместите ту же линию в начале какой-либо функции, которые используют их.

(Это не будет работать, или будет мешать другим переменным, если уже есть переменная с именем $output в глобальном масштабе.)

+6

Не говоря уже о том, что глобальные переменные обычно являются плохими идеями в любом случае. –

+3

Преподавание кого-либо для использования глобальных переменных (кроме SUPERGLOBALS) в php должно считаться преступлением. –

+1

-1. пациент: «Доктор, у меня нога зудит». доктор: «Вот твой дробовик». –

3

Вы должны передать переменную с помощью аргумента функции, или определить его как глобальный внутри функции.

$output = '<p>macilaci</p>'; 

function doesathing($output) 
{ 
echo $output; 
} 

ИЛИ

function doesathing() 
{ 
global $output; 

echo $output; 
} 
0

Использование Session

Например:

session_start(); 
$query = '...........'; 
$result = mysql_query($query); 
$_SESSION['mysqlResult'] = $result; 

Теперь вы можете использовать его с любой страницы в любое время, просто позвонив как этот

$myresult = $_SESSION['mysqlResult']; 
+0

это лучше, чем использование глобальных? – Alex

+1

A * сессия *? Чтобы хранить данные, необходимые в одном запросе? Это так же плохо, как использование глобальных переменных. –

5

Добро пожаловать к использованию возвратов, а также передачи параметров: НЕ ИСПОЛЬЗОВАТЬ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); 
1

не поместить данные в переменную внутри функции, которая извлекает его.

function retrieve(...) 
{ 
    ... fetch from db 
    return $rv; 
} 

function other() {...} 
function still($data) 
{ 
    ... 
    echo $data; 
} 

$output = retrieve(...); 
other(); 
still($output); 
1

Вместо того, чтобы просто положить этот фрагмент в глобальную переменную, ИМХО лучшее решение использовать шаблонную систему для построения элементов страницы.

NB Я не предлагаю вам сразу же сбежать и начать загрузку Smarty - хотя есть преимущества и недостатки, чтобы полностью разделить логику и презентацию, есть только преимущества в модульном подходе к вашему экрану.

C.

Смежные вопросы