php сообщает между функцией и строкой - PullRequest
0 голосов
/ 06 июня 2018

это способ создания массива, в котором хранятся как строки, так и функции, генерирующие строки?

<?php

function foo()
{
    return "calling foo()";
}


function bar()
{
    return "callin bar()";
}


$data = array();
$data[] = "foo";
$data[] = "bar";

foreach ($data as $element) {
    if (is_callable($element)) echo $element()."\n";
    else echo $element."\n";
}

выведет:

calling foo()
calling bar()

есть ли способ реализовать массивтак что я получаю вывод:

calling foo()
bar

что-то вроде

$data[] = &foo;
$data[] = "bar";

foreach ($data as $element) {
    if (is_callable($element) && !is_string($element)) return $element();
    else return $element;
}

1 Ответ

0 голосов
/ 06 июня 2018

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

$data["foo"] = "foo";
$data[] = "bar";

foreach ($data as $key => $element) {
    if (is_callable($element) && is_string($key)) {
        echo $element()."\n";
    } else {
        echo $element."\n";
    }
}

Другая возможность (их много):

$data[]['fnc'] = "foo";
$data[]['str'] = "bar";

foreach ($data as $element) {
    if (isset($element['fnc']) && is_callable($element['fnc'])) {
        $element = $element['fnc'];
        echo $element()."\n";
    } else {
        echo $element['str']."\n";
    }
}

Если вы храните кодВы могли бы оценить:

$data[] = "echo foo();";
$data[] = "echo 'bar';";

foreach ($data as $element) {
    eval($element);
}
...