Как мне «повторить» результат функции в другую функцию? - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть эта функция:

function MakeInput($id, $class) {
    $value = substr($id, 2);
    global $$value;
    echo '<input type="text" id="'.$id.'" name="'.$id.'" class="'.$class.'" value="'.htmlentities($$value,ENT_COMPAT,'UTF-8').'" />';
}

, которые не возвращают, но отражают результаты.

Я хотел бы использовать это как есть в другой функции:

function ItkMakeMo($NomDebVar) {
$Output = '
    <tr>    
        <td>Test</td>
    </tr>
    <tr>
        <td>'.MakeInput($NomDebVar.'moshj','IntInput').'</td>
    </tr>
';
echo $Output;

}

Так что это решение не работает, PHP отправляет вывод MakeInput до "echo $ Output"

Ответы [ 8 ]

5 голосов
/ 10 ноября 2010

Вы должны return значение:

function MakeInput($id, $class) {
    $value = substr($id, 2);
    global $$value;
    return '<input type="text" id="'.$id.'" name="'.$id.'" class="'.$class.'" value="'.htmlentities($$value,ENT_COMPAT,'UTF-8').'" />';
}

И позже echo it.

1 голос
/ 10 ноября 2010

Если по какой-либо причине вы не можете изменить MakeInput() или потребуется больше усилий, чем стоит изменить, то вы можете отобразить вывод непосредственно из ItkMakeMo():

function ItkMakeMo($NomDebVar) {
echo '
    <tr>    
        <td>Test</td>
    </tr>
    <tr>
        <td>';

MakeInput($NomDebVar.'moshj','IntInput');

echo '</td>
    </tr>
';
}

Тогда вывод MakeInput() будет в правильном месте.

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

1 голос
/ 10 ноября 2010

В вашем конкретном случае я бы сразу попытался отобразить вывод, не сохраняя его сначала в переменной.

function ItkMakeMo($NomDebVar) {
echo '
    <tr>    
        <td>Test</td>
    </tr>
    <tr>
        <td>';
MakeInput($NomDebVar.'moshj','IntInput').'</td>
echo '    </tr>
';
}

Но, как утверждают другие, определенно было бы лучше изменить функцию, чтобы она возвращала значение, а не отражала его. Не только в этом случае, но и как общая лучшая практика. Попробуйте, только если вы не можете изменить MakeInput самостоятельно по какой-то причине.

1 голос
/ 10 ноября 2010

Попытайтесь вернуть строку в функцию MakeInput вместо ее отображения,

function MakeInput($id, $class) {
    $value = substr($id, 2);
    global $$value;
    return '<input type="text" id="'.$id.'" name="'.$id.'" class="'.$class.'" value="'.htmlentities($$value,ENT_COMPAT,'UTF-8').'" />';
}
1 голос
/ 10 ноября 2010

В отличие от использования echo в вашей функции, используйте return:

function MakeInput($id, $class) {
    $value = substr($id, 2);
    global $$value;
    return '<input type="text" id="'.$id.'" name="'.$id.'" class="'.$class.'" value="'.htmlentities($$value,ENT_COMPAT,'UTF-8').'" />';
}
0 голосов
/ 10 ноября 2010

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

function ItkMakeMo($NomDebVar) {
    ob_start();
    MakeInput($NomDebVar.'moshj','IntInput');
    $input = ob_get_clean();
    $Output = '
        <tr>    
            <td>Test</td>
        </tr>
        <tr>
            <td>'.$input.'</td>
        </tr>
    ';
    echo $Output;
}

Если вам не нужна переменная $ output, но вам нужен MakeInput, я бы следовал совету Роба. С учетом сказанного, следуйте тому, что написали все остальные, потому что это просто уродливый способ обойти плохое программирование.

0 голосов
/ 10 ноября 2010

В первой функции смените эхо с возвратом:

function MakeInput($id, $class) {
    $value = substr($id, 2);
    global $$value;
    return '<input type="text" id="'.$id.'" name="'.$id.'" class="'.$class.'" value="'.htmlentities($$value,ENT_COMPAT,'UTF-8').'" />';
}
0 голосов
/ 10 ноября 2010
function MakeInput($id, $class) {
    $value = substr($id, 2);
    global $$value;
    return '<input type="text" id="'.$id.'" name="'.$id.'" class="'.$class.'" value="'.htmlentities($$value,ENT_COMPAT,'UTF-8').'" />';
}
...