вызов функции для работы с переменными

0

Здравствуйте, я попытался повторить вывод функции другой функцией, и я написал этот код:

$users = new user();
class user{
  public function userlist(){
    //Here is my sql action and then it send the result as output
    echo $output;
  }
}

Теперь у меня есть класс, который содержит шаблон сайта, этот файл проходит через все страницы.

$html = new html();
class html{
  public function output($output){
    //echoing some html styles and the template html code..
    echo '<div id="body">';
    $output;
    echo "</div>";
  }
}

Теперь $output должен быть на html-странице внутри <div id="body">, проблема в том, что $output HTML эхом передается перед div и не находится внутри div.

Теги:

3 ответа

1
Лучший ответ

Простой способ:

class user{
  public function userlist(){
    //Here is my sql action and then it send the result as output
    return $output;
  }
}

class html{
  public function output($output){
    //echoing some html styles and the template html code..
    echo '<div id="body">';
    echo $output;
    echo "</div>";
  }
}

class controller {
  function handler(){
    $users = new user();
    $html = new html();
    $html->output($users->userlist());
  }
}

Теперь, не изменяя класс user, вы можете использовать буферизацию вывода для временного хранения вывода объекта $users, а затем выводить его в более удобное время:

class user{
  public function userlist(){
    //Here is my sql action and then it send the result as output
    echo $output;
  }
}

class controller {
  function handler(){
    $users = new user();
    $html = new html();
    ob_start();
    $users->userlist();
    $output = ob_get_contents();
    ob_end_clean();
    $html->output($output);
  }
}

Я не думаю, что вы можете получить ожидаемый результат, не изменяя метод html::output.

См. Документацию по ob_* для объяснения их семантики.

Добавление: обратите внимание, что многие фреймворки уже используют внутреннюю буферизацию вывода. В документации указано, что буферы стекируются (т.е. Вы можете начать новую буферизацию поверх другой, выполняющей ее), но просто будьте осторожны, чтобы начать и закончить свои буферы должным образом, чтобы не испортить внутреннее состояние вашей инфраструктуры (и, в конечном счете, ваш выход), если вы используете один.

  • 0
    это не помогло. Все равно спасибо.
  • 0
    Предыдущая версия этого ответа использовала print в качестве имени метода, который является зарезервированным ключевым словом, я исправил это.
0

Вам нужно также эхо-выход $ output

public function($output){
 //echoing some html styles and the template html code..
  echo '<div id="body">';
  echo $output;
  echo "</div>";
}

или использовать только один вкладыш

public function($output){
  //echoing some html styles and the template html code..
  echo '<div id="body">'. $output . "</div>";
}
0

Вы неправильно обращаетесь к переменной. Поскольку это строка, вы должны просто добавить или объединить ее в выходной файл следующим образом:

class html{
public function($output){
    //echoing some html styles and the template html code..
    echo '<div id="body">'.$output."</div>";
    }
}

Кроме того, в вашей первой функции вы просто выводите значение $ output вместо фактического сохранения переменной. Если вы хотите отображать все в порядке, вы должны либо сохранить данные в переменной, к которой вы можете получить доступ в другом месте (например, в операторе return), либо вывести исходный поток, а затем запустить функцию, а затем вывести оставшийся поток.

  • 0
    спасибо, но обычный текст или html проходит хорошо, но когда мы выполняем функцию while, которая включает соединение mysql и выводит список имен, она отправляет $ output перед div, а не внутри него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню