PHP:如何动态添加到http_build_query?

时间:2010-04-09 11:04:25

标签: php http arrays

我基本上有一个抓取对象。我希望能够像

一样添加POST变量
$obj->addvar('Name', 'Value');

我现在拥有的是:

  function addvar($var, $val) {
    $postvars[] = Array($var=>$val); 
  }
  function initiate() {
    $this->q = $postvars;
  }
  if(!empty($this->post)) {
    $this->params = http_build_query($q);
  }

我没有测试过,因为它太不完整了,但我的addvar()函数会起作用吗?我如何在数组中附加一个键+值,以便http_build_query接受它?

IE(这就是我想要的):

$obj->addvar('username', 'abc');
$obj->addvar('password', 'foobar');
$obj->send(); //..

3 个答案:

答案 0 :(得分:2)

您的代码中有几个问题:

  • addvar方法中,您无法访问任何实例变量。您将alues分配给局部变量。
  • 您的initiate方法无法访问变量$postvar
  • if子句中,您正在访问本地变量$q,而不是实例变量$this->q
  • 您希望将数组数组传递给http_build_query,但必须是“普通”数组。

你混淆了很多!

一个更完整的课程示例会有所帮助,但我认为它看起来应该更像:

class QueryBuilder {
    private $params = array();

    public function addParameter($key, $value) {
        $this->params[$key] = $value;
    }

    public function send() {
        $query = http_build_query($this->params);
        // whatever else has to be done to send.
        // for the sake of this example, it just returns the query string:
        return $query;
    }
}

示例:

$obj = new QueryBuilder();
$obj->addParameter('username', 'abc');
$obj->addParameter('password', 'foobar');
echo $obj->send(); // echos 'username=abc&password=foobar'

通常,如果您已经拥有html_build_query构建的查询,则只需附加到该字符串:

$query = http_build_query(array('foo' => 'bar', 'faa' => 'baz'));
$query .= '&key=value';
echo $query; // echos 'foo=bar&faa=baz&key=value'

答案 1 :(得分:1)

你可以这样做:

$postvars[$var] = $val;

显然,您需要确保在所有值都在数组中后调用http_build_query()

同样$postvars看起来像一个局部变量,所以它只在该方法中可见(并且将在每次调用时重置)。让它成为班级成员可能会更好。

答案 2 :(得分:0)

你的addvars代码存在一些问题($ this-> params似乎在函数initiate()之外),但是否则它应该可以正常工作。

class test{
  var $postvars;
  function addvar($var, $val) {
    $this->postvars[] = Array($var=>$val); 
  }
  function initiate() {
    $this->q = $this->postvars;
    return http_build_query($this->q);
  }
}

    $obj = new test();
    $test->addvars('username', 'abc');

    $qry = $test->initiate();

这应该有效。虽然未经测试。