2010-04-09 55 views
1

我基本上有一个刮对象。我希望能够POST变量添加到它像PHP:如何动态添加到http_build_query?

$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(); //.. 

回答

2

你在你的代码的几个问题:

  • 在你addvar方法,你不访问任何实例变量。你正将这些线索分配给一个局部变量。
  • 您的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' 
+0

+1,比我的回答更好的阐述。 – pinaki 2010-04-09 11:32:50

+0

为我节省了很多,我在PHP上并没有那么糟糕,但是课程从来没有用过它们。但现在在这种情况下看起来很棒,我把事情弄混了。它工作得非常好,谢谢。 – 2010-04-09 11:34:05

+0

@ oni-kun:如果你是OOP的新手,请阅读下面的介绍:http://php.net/manual/en/language.oop5.php它会给你一些见解;) – 2010-04-09 11:37:11

1

你可以这样做:

$postvars[$var] = $val; 

显然,你需要确保你打电话http_build_query()后所有值都在数组中。

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

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(); 

这应该有效。但未经测试。