参考文献:
http://php.net/manual/en/language.variables.variable.php
http://php.net/manual/en/language.variables.scope.php
为什么以下(示例)代码阻止:
function test($ip)
{
$handler = 'curl_' . str_replace('.', '_', $ip);
static $$handler = NULL;
}
test('1.1.1.1');
返回以下错误消息?
PHP Parse error: syntax error, unexpected '$', expecting :: (T_PAAMAYIM_NEKUDOTAYIM) in <file> on line <line>
如果可能,请尽量不建议使用curl库的更好方法(如curl_multi)。我有一个工作和表现很好的应用程序。说到libcurl,我有一个curl()函数,在某些时候会做这样的事情:
// we want the handler to survive multiple invocations of this function (this allows for HTTP Keep-Alive)
static $conn = NULL;
if (!isset($conn)) {
// the handler was not previously initialized; do it now before sending the first request
$conn = curl_init();
}
else {
// the handler was previously initialized; reset the connection properties before sending further requests
curl_reset($conn);
}
这很好用,但是,一些脚本可以使用不同的目标服务器调用curl()
(它们之间的交错请求)。在这种情况下,该函数会浪费时间关闭/打开新连接。
我希望我的curl()
函数为每个服务器使用一个唯一的处理程序(因此我上面的失败代码块)。我想使用变量生成一个唯一的处理程序名称(这不是问题 - 例如,curl_192_168_1_1)。然后,我想将变量变量设为静态,此时curl()
将在工作块中正常继续。
请注意,将语法更改为:
static ${$handler} = NULL;
没有任何区别。
感谢您的帮助!
答案 0 :(得分:2)
static
variables的文档页面中有一个注意,上面写着:
静态声明在编译时解析。
另一方面,variable variables表示此变量的名称存储在另一个变量中,并且在编译时可能不可用。
在您的示例中,您要声明为static
的变量的名称是使用$ip
函数参数的值在运行时计算的。
您尝试解决的问题有一个不同的解决方案。例如,您可以将打开的处理程序存储在静态数组中:
function test($ip)
{
static $handlers = array();
// Generate an ID that identifies the server
$id = 'curl_' . str_replace('.', '_', $ip);
// If no cUrl handler has been created for this server then ...
if (! array_key_exists($handler, $id)) {
// ... open a new handler
$curl = curl_open($ip);
// ... configure it...
curl_setopt_array($curl, array(/* ... */));
// ... and store it to be reused when needed
$handlers[$id] = $curl;
}
// Return the already open cUrl handler
return $handlers[$id];
}
更好的解决方案是将数据($handlers
)和代码(function test()
)封装到一个类中。