为什么我不能定义一个"变量"在PHP中是静态的吗?

时间:2018-01-19 15:30:16

标签: php curl

参考文献:

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;

没有任何区别。

感谢您的帮助!

1 个答案:

答案 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())封装到一个类中。