代码之家  ›  专栏  ›  技术社区  ›  Samuel

php区分函数和字符串

  •  0
  • Samuel  · 技术社区  · 7 年前

    它们是不是一种创建数组的方法,既存储字符串又存储生成字符串的函数?

    <?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 回复  |  直到 7 年前
        1
  •  1
  •   AbraCadaver    7 年前

    我不知道你为什么会需要这个,但问题是,你做的方式,他们总是字符串,如果他们是可调用的,没有办法区分。既然数组是按创建顺序排列的,那么使用键或类似的方法如何:

    $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);
    }
    
    推荐文章