#php
#php
Вопрос:
Я программирую на php много-много лет и использовал буферизацию вывода в нескольких своих классах и методах класса. Недавно, во время написания шаблонного класса, мой разум начал блуждать. Мой разум пришел к следующему :
Это всего лишь пример.
class someClass {
protected $contents;
public function __construct() {
ob_start();
// execute some code here.
}
private function someMethod() {
// execute some code here.
$this->contents = ob_get_contents();
}
public function someOtherMethod() {
ob_end_clean();
echo $this->contents;
}
}
Рассмотрим приведенный выше пример кода.
Вопросы
- Можно ли использовать буферизацию вывода таким образом?
- Использование буферизации вывода предотвращает написание кода до отправки заголовков, но какие другие преимущества, если таковые имеются, это принесет?
- Если это возможно, практично ли это?
Комментарии:
1. Вы пробовали это? И почему, черт возьми, это не сработает?
2. Честно говоря, я не пробовал это. Я склонен легко отвлекаться, когда я кодирую в течение нескольких часов и пытаюсь оставаться сосредоточенным…. Я просто подумал, что задам свои вопросы здесь, чтобы продолжить выполнение моей текущей задачи. Кажется, что это сработало бы и логично, но это практично? Возможно, с тестированием этого придется подождать, пока я не закончу свой текущий проект.
3. Ну, это глупая причина задавать здесь вопрос. Пожалуйста, задавайте вопросы, только если вы не можете найти ответ самостоятельно.
4. это будет работать, ob_start () — это функция, и с функцией, вызываемой в методе, проблем с областью видимости нет. Он включит буферизацию вывода точно так же, как и в любом другом месте.
Ответ №1:
Отладка — это самое большое преимущество, особенно при ответе на запросы ajax (т. Е. должен возвращать действительный json даже при ошибках, когда у вас нет контроля над другой конечной точкой), поэтому вы кэшируете все, что помещено, и если происходит завершение работы (-via- register_shutdown_function() ), вы форматируете вывод как json — с соответствующей ошибкой и данными трассировки ect. это самое большое применение, которое у меня есть для этого. Однако у вас возникнут проблемы с вложенным ob_start. Даже тогда немного спорно, действительно ли это полезно или нет. Также может быть полезно выводить выходные данные в текстовые файлы для сообщения об ошибках, но это не связано с использованием его в методе и больше зависит от потребностей вашего проекта.
Я выполняю очень чувствительную работу, которая должна скрывать 99% ошибок при выводе и записывать их в текст, и просто показывать общие ошибки конечному пользователю;
это может избавить вас от некоторых головных болей
/**
* dump all levels of ob_start into message
* @return string
*/
public static function obGetCleanNested(){
$message = '';
for($i=0; $i < ob_get_level(); $i ){
$message .= ob_get_clean();
}
return $message;
}
Ответ №2:
class buffer {
public $output;
public function __construct($content) {
ob_start();
$this->output = $content;
}
public function endBuffer() {
$buffer = ob_get_clean();
$this->output = $buffer;
echo $this->output . "<br>";
}
public function showBufferStatus() {
if ($this->output == null) {
echo "nothing inside.";
} else {
echo $this->output;
}
}
}
$buffer = new buffer("Test"); // starts buffer
$buffer->showBufferStatus(); // checks content inside buffer
$buffer->endBuffer(); // ends it
echo "still there: ", $buffer->showBufferStatus(); // checks again
В принципе, с помощью функции ob_get_clean()
вы фактически экономите один ход в настоящее время, следовательно, нет дополнительного метода. Поскольку он выполняет оба ob_get_contents()
и ob_end_clean()
одновременно.
Ответ №3:
«Можно ли использовать буферизацию вывода таким образом?»
Да, это может
«Использование буферизации вывода предотвращает написание кода до отправки заголовков, но какие другие преимущества, если таковые имеются, это принесет?»
Вы можете просто выполнить любую операцию над выводом (сжать его / изменить некоторые части)
**»Если это возможно, практично ли это?»**
Это зависит от потребностей. Если код написан надлежащим образом, вероятно, вам не нужно использовать буферизацию вывода, на мой взгляд, в большинстве случаев. Однако иногда, особенно если вы хотите изменить свой вывод, очень удобно использовать буферизацию вывода
Ответ №4:
Можно ли использовать буферизацию вывода таким образом?
ДА.
Использование буферизации вывода предотвращает написание кода до отправки заголовков, но > какие, если таковые имеются, другие преимущества будут получены из этого?
Это практически единственное преимущество.
Если это возможно, практично ли это?
Это вопрос мнения. Мое мнение «нет», кто-то другой может сказать «да», и даже кто-то другой может сказать, что это не имеет никакого «практического» эффекта, поскольку php на самом деле не волнует, где, почему или сколько раз вы вызываете ob_start()
или ob_end_clean()
.
Комментарии:
1. Последняя часть вашего ответа неверна. PHP действительно заботится о том, сколько раз
ob_start
вызывается.2. ^ я исправляюсь.
Output buffers are stackable, that is, you may call ob_start() while another ob_start() is active. Just make sure that you call ob_end_flush() the appropriate number of times. If multiple output callback functions are active, output is being filtered sequentially through each of them in nesting order.
3. смотрите мой пост ob_get_level() здесь очень полезен, если вы просто не очистите () все
Ответ №5:
ответы:
- Конечно, вы можете использовать это таким образом. Почему это не сработало бы?!
- другие преимущества заключаются в том, что вы можете подавить определенный вывод, который вы вообще не хотите выводить. В вашем примере весь вывод, сгенерированный между
$this->contents = ob_get_contents();
insidesomeMethod()
иob_end_clean();
insidesomeOtherMethod()
, никогда не будет выведен. - это может быть практично, если вы намеренно не хотите выводить определенный код. И, конечно, как вы сказали, отложить вывод до отправки заголовков are. Но будьте осторожны с тем, сколько раз вы вызываете
ob_start()
, поскольку каждый раз это будет на один уровень глубже.
Комментарии:
1. Это ответило на ваш вопрос?