【问题标题】:Variable's variable in function? [duplicate]变量在函数中的变量? [复制]
【发布时间】:2013-01-30 07:33:27
【问题描述】:

我需要帮助:

$foo = array ('Projects', 'Clients');

我需要从预装的库中运行函数

$bar->getProjects()->data
$bar->getClients()->data 

等等。等等

但我在循环中有它。所以我想要类似的东西

foreach($foo as $value)
  $return_value = $bar->get  >>>>$value<<<<  ()->data

如何做到这一点?

【问题讨论】:

标签: php


【解决方案1】:

请看How to call PHP function from string stored in a Variable:

foreach ($foo as $value) {
  $method = 'get' . $value;
  $return_value = $bar->$method()->data
}

foreach ($foo as $value)
  $return_value = $bar->{'get' . $value}()->data;

【讨论】:

  • 伙计,这确实有效!简单而精彩
【解决方案2】:

我会使用反射,一个有据可查的、没有魔法的 API:

<?php

$foo = array ('Projects', 'Clients');
$bar = new MyAwesomeClass();

var_dump(invokeMultipleGetters($bar, $foo));


// could also make this a method on MyAwesomeClass...
function invokeMultipleGetters($object, $propertyNames)
{
    $results = array();
    $reflector = new ReflectionClass($object);

    foreach($propertyNames as $propertyName)
    {
        $method = $reflector->getMethod('get'.$propertyName);
        $result = $method->invoke($bar);
        array_push($results, $result)
    }

    return $results;
}

【讨论】:

  • IMO 这是最干净的解决方案。如果您还需要在其中开始传递参数,它还允许您获取有关该方法采用的参数的大量信息。
  • @ColinMorelli 最干净的解决方案是完全不依赖动态方法调用,而是使用接口。
  • @KingCrunch 当然——我相信你和我有更多的编程经验。但是您不能向刚接触编程的人教授诸如“构建接口”之类的编程概念,因为他们不太可能看到好处。考虑到这个问题的可能答案范围 - 这可能是更好的解决方案之一。
  • @KingCrunch:该问题不使用接口,而是使用看起来相当随机的部分方法名称数组。那里没有提到接口(或摘要),所以如果我的回答中有的话,那会很奇怪,甚至更啰嗦。只是在 OP 实际可以使用的干净和务实之间进行(恕我直言)最佳权衡。
  • @Kris 是的,我知道。我只评论了关于“最干净的解决方案”的 ColinMorellis 声明。
【解决方案3】:

有一个神奇的方法:__call

function __call($method, $params) {

     $var = substr($method, 3);

     if (strncasecmp($method, "get", 3)) {
         return $this->$var;
     }
     if (strncasecmp($method, "set", 3)) {
         $this->$var = $params[0];
     }
}

你也可以看看call_user_func

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2016-08-21
    • 2012-10-11
    • 2018-05-19
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2021-12-07
    • 2018-09-24
    相关资源
    最近更新 更多