Вызов конструкций языка PHP с использованием строки - PullRequest
2 голосов
/ 08 апреля 2011

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

PHP

<?php

function bufferContent($source, $type = 'include') {
  ob_start();
  $type($source);
  return ob_get_clean();
}

echo bufferContent('<html>test</html>', 'echo');

?>

Вывод

Fatal error: Call to undefined function echo() in #### on line 5

Почему это?Разве нельзя вызвать стандартную функцию PHP, такую ​​как echo () или include (), с помощью строковой переменной?

Редактировать: Слегка изменил вопрос, чтобы сделать его более подходящим для ответов.

Ответы [ 5 ]

6 голосов
/ 08 апреля 2011

echo не является функцией : это языковая конструкция - и, как таковая, ее нельзя назвать таким образом.

Для вас будет возможность определитьфункция, которая сама вызывает echo - и использует вашу функцию при вызове bufferContent:

function my_echo($str) {
    echo $str;
}
echo bufferContent('<html>test</html>', 'my_echo');


A ссылка, цитирующая справочную страницу echo:

Примечание: Поскольку это языковая конструкция, а не функция, ее нельзя вызывать с помощью переменных функций

2 голосов
/ 08 апреля 2011

Вы не можете вызвать echo, include, require_once, isset, empty из строковой переменной, потому что они не ведут себя как обычные функции. Вы можете использовать

include "file.php";

И

include("file.php");

Вы можете создать функцию-обертку и вызывать их, например:

function wrap_echo($str) { echo($str); };

и до

$f = "wrap_echo";
$f("sth");
1 голос
/ 29 октября 2012
function buffer_content($source, $type = 'echo') {
    if(!is_string($type)){
        trigger_error('$type must be a string.', E_USER_WARNING);
        return false;
    }
    if(is_object($source) and method_exists($source, '__toString')){
        $source = strval($source);
    }elseif(is_scalar($source)){
        $source = strval($source);
    }elseif(!is_string($source)){
        trigger_error('$source must be a string as non-scalars do not echo nicely.', E_USER_WARNING);
        return false;
    }
    ob_start();
    switch(strtolower($type)){
        case 'include': include $source; break;
        case 'include_once': include_once $source; break;
        case 'require': require $source; break;
        case 'require_once': require_once $source; break;
        case 'echo': echo $source; break;
        default: trigger_error("\$type '{$type}' is not supported.", E_USER_WARNING); break;
    }
    return ob_get_clean();
}

^ вам нужно немного импровизировать. Вот как вы делаете то, что вам нужно!Но есть лучшие и более эффективные / универсальные способы сделать это.

1 голос
/ 08 апреля 2011

За это ругают, но ленивый обходной путь в вашем случае будет:

eval(" $type(\$source); ");

Это работает с обычными функциями и языковыми конструкциями. Хотя вам действительно следует использовать переключатель для особых случаев и сохранить обычный вызов функции-переменной для всего остального.

0 голосов
/ 08 апреля 2011

Вы не можете вызвать echo как функцию, потому что это на самом деле не функция, а скорее языковая конструкция в PHP.

Чтобы эффективно вызвать echo, вы можете создать метод-обертку, такой как:

function call_echo($str){
  echo $str;
}

На тему вызова функций через строки я бы использовал call_user_func

mixed call_user_func ( callback $function [, mixed $parameter [, mixed $... ]] )

так что в вашем случае это будет

call_user_func($type, $source);

Я бы выбрал call_user_func над переменной функцией, потому что она более читабельна и менее запутана. Если бы я читал ваш код, я бы сразу увидел, что вы делаете, если бы вы позвонили call_user_func

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...