2015-12-23 6 views
-2

Hy communityphp буферизация с ob_start: синхронная альтернатива

У меня проблемы с php и не найдено. В настоящее время я разрабатываю плагин wordpress, и то, что я хотел бы сделать, это манипулировать некоторым контентом. Использование php-буферизации (ob_start), который отлично работает, но дает мне новые проблемы. Я делаю следующее (минимализированное).

Давайте предположим, что моя страница содержит следующий текст:

Hy there, my name is A B, I am living in C with my dog D 

Что код PHP делает: заменить набор строк с выходом подфункции. Конечно, это всего лишь минимальный пример.

<?php 
// ----------------------------------------- 
// The Function loading some content from a php file 
function my_function() { 
    ob_start(); 
    require_once("some_file.php"); 
    $content = ob_get_contents(); 
    ob_end_clean(); 
    return($content); // Returns new content 
} 
// ----------------------------------------- 

// Content of the web page 
$content = "Hy there, my name is A B, I am living in C with my dog D"; 

// Strings to replace (by the content returned by "my_function") 
$matches = array("A","B","C","D"); 

// Looping over the different matches 
foreach ($matches as $match) { 

    // Calling my_function in buffer mode 
    $content = str_replace($match,call_user_func("my_function"),$content); 


} ?> 

Хорошо, что происходит, так это то, что буферизация выполняется в соответствии с определением async. Как только первый вызов my_function будет завершен, весь буфер будет очищен, а «A» не будет заменен на то, что «A» должно быть заменено, но также содержит части того, что «B» должно быть заменено на :). Если есть только одна вещь для замены, это отлично работает (только с одним процессом ob_start).

Есть ли другой способ поймать вывод вызова или потребовать вызова или запустить ob_* синхронным способом? Может быть, был бы лучший способ, которого я не нашел. Было бы здорово получить подсказку :).

Заранее благодарен! Может быть, я полностью ошибаюсь, но вот как все учится :).

Счастливой Пасхи, Рето

ответ

2

Поскольку вы используете require_once. Но для файла require_once был включен ОДИН! Вы можете использовать требование или включить для нескольких включений. Но это плохо. Плохая архитектура.

+0

Ну, это я думал - плохая архитектура. Но спасибо за ответ! Дала мне мотивировку, чтобы снова проверить, почему я делаю то, что делаю, и узнал, что Wordpress предлагает * shortcode API * ... мою ошибку, извините и веселого Рождества! –

+0

BTW: идея, которую я пробовал, более или менее точно соответствует тому, что делает API-интерфейс Wordpress shortcode. Однако, когда такой короткий код зарегистрирован, проблема, с которой я столкнулась с моим ручным решением, больше не встречается, что хорошо :). –