Здравствуйте, я попытался повторить вывод функции другой функцией, и я написал этот код:
$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.
Простой способ:
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_*
для объяснения их семантики.
Добавление: обратите внимание, что многие фреймворки уже используют внутреннюю буферизацию вывода. В документации указано, что буферы стекируются (т.е. Вы можете начать новую буферизацию поверх другой, выполняющей ее), но просто будьте осторожны, чтобы начать и закончить свои буферы должным образом, чтобы не испортить внутреннее состояние вашей инфраструктуры (и, в конечном счете, ваш выход), если вы используете один.
Вам нужно также эхо-выход $ 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>";
}
Вы неправильно обращаетесь к переменной. Поскольку это строка, вы должны просто добавить или объединить ее в выходной файл следующим образом:
class html{
public function($output){
//echoing some html styles and the template html code..
echo '<div id="body">'.$output."</div>";
}
}
Кроме того, в вашей первой функции вы просто выводите значение $ output вместо фактического сохранения переменной. Если вы хотите отображать все в порядке, вы должны либо сохранить данные в переменной, к которой вы можете получить доступ в другом месте (например, в операторе return), либо вывести исходный поток, а затем запустить функцию, а затем вывести оставшийся поток.
print
в качестве имени метода, который является зарезервированным ключевым словом, я исправил это.