Я настроил все так, чтобы мой код считывал текст каждой страницы и автоматически генерировал из нее оглавление и список сносок. Я помещаю текст сноски в текст страницы в том месте, к которому он относится. Когда код читает файл страницы, он создает оглавление из заголовков и помещает его в начало страницы. Он также удаляет текст сносок и помещает их в список, который он помещает в конце страницы. Он также управляет нумерацией сносок и размещением связанных с ними подстрочных номеров сносок для них.
Чтобы сделать это, вместо echo () содержимого страницы, я собираю содержимое в переменную, $PageText
, Затем у меня есть функции, которые читают эту переменную, удаляют текст сноски, компилируют оглавление и список сносок и вставляют их в $PageText
, После, я echo($PageText);
,
Кажется, что я делаю здесь самодельную форму буферизации, и что я могу сделать то же самое с помощью чего-то вроде
ob_start();
echo(<page contents>);
$PageText = ob_get_contents();
make_ToC($PageText);
make_footnotes($PageText);
ob_end_flush();
Будет ли это более эффективно, чем использование моей собственной переменной буфера? Или есть какая-то другая причина, по которой лучше использовать встроенную систему буферизации?
Причина, по которой я предпочитаю использовать свой собственный буфер, заключается в том, что у меня есть полный контроль над ним. Я действительно не знаю, что PHP может решить сделать с контентом между временем, когда я его выполняю (), и временем, когда я его очищаю.
Подобный вопрос был задан пять лет назад, Буферизация вывода и сохранение содержимого в переменную в PHP. Интересно, что ответы, похоже, говорят о том, что я мог бы лучше контролировать содержимое, используя систему «ob_», тогда как я чувствую, что у меня есть больший контроль, используя мою собственную переменную. Есть что-то, чего я не понимаю в этом?
Буферизация вывода — это метод, позволяющий перевести уже сгенерированный вывод в режим ожидания, и имеет несколько применений:
var_dump()
)По моему опыту, функции, которые печатают в stdout, обычно раздражают, особенно. если единственной видимой причиной для этого не является необходимость echo
потому что они мешают дизайну вашего приложения. Вы не всегда хотите отправлять их выходные данные как есть, и вы не всегда хотите печатать выходные данные в точном месте потока ответов, где происходит вызов функции.
То, что вы описываете, — это стандартная обработка текста, которую вы можете ожидать в любой программе. Хотя вы, конечно, можете эмулировать его с помощью буферизации вывода, и насколько это возможно, я думаю, что это похоже на хак. В вашем случае вы даже не делаете линейный вывод. Нет очевидного преимущества печати на стандартный вывод сразу, учитывая, что вам все еще нужно манипулировать выводом, потому что он еще не готов.
Других решений пока нет …