Временная переменная - PullRequest
       5

Временная переменная

1 голос
/ 01 июля 2010

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

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

Ответы [ 7 ]

5 голосов
/ 01 июля 2010

добро пожаловать в использование возвратов и передачи параметров: НЕ ИСПОЛЬЗУЙТЕ 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);
5 голосов
/ 01 июля 2010

Вы можете определить $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 плохой практикой?

3 голосов
/ 01 июля 2010

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

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

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

ИЛИ

function doesathing()
{
global $output;

echo $output;
}
1 голос
/ 01 июля 2010

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

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

С

1 голос
/ 01 июля 2010

не помещать данные в переменную внутри функции, которая их получает.

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

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

$output = retrieve(...);
other();
still($output);
0 голосов
/ 01 июля 2010

Использовать сессию

Например:

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

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

$myresult = $_SESSION['mysqlResult'];
0 голосов
/ 01 июля 2010

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

global $output;

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

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

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