php – 为getopt覆盖$argv

前端之家收集整理的这篇文章主要介绍了php – 为getopt覆盖$argv前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用example.PHP
  1. $args = __FILE__.' -vvv';
  2. $argv = explode(' ',$args);
  3. $argc = count($argv);
  4. $GLOBALS['argv'] = $_SERVER['argv'] = $argv;
  5. $GLOBALS['argc'] = $_SERVER['argc'] = $argc;
  6.  
  7. var_export(getopt('v'));

$example.PHP -v

> array(‘v’ => false);

最终getopt不会查找$GLOBALS来获取argv.那么有什么方法可以覆盖argv数组?

TL; DR

不,没有本地方法可以做到这一点.根据您的目标,可能有其他方法可以解决问题,但覆盖不是其中之一.

在超全局上运行

结构体

要知道为什么会这样,你应该知道,超级全局变量不仅仅是你所指的“变量”.这意味着,如果您使用$argv来取消引用参数列表,那么这并不意味着您将访问存储在“variable”$argv中的某些数据.相反,您将通过名为$argv的“link”访问数据容器.但是,有不同的方法来访问此数据 – 至少$_SERVER [‘argv’]或$GLOBALS数组.为了说明,我将使用代码

  1. var_dump($argv,$_SERVER['argv']);
  2. unset($argv);
  3. var_dump($argv,$_SERVER['argv']);

这将导致类似于:

  1. array(2) {
  2. [0]=>
  3. string(11) "example.PHP"
  4. [1]=>
  5. string(4) "-vvv"
  6. }//<--------------------- derived from $argv
  7. array(2) {
  8. [0]=>
  9. string(11) "example.PHP"
  10. [1]=>
  11. string(4) "-vvv"
  12. }//<--------------------- derived from $_SERVER['argv']
  13. NULL//<------------------ we've unset $argv,so unset a reference
  14. array(2) {
  15. [0]=>
  16. string(11) "example.PHP"
  17. [1]=>
  18. string(4) "-vvv"
  19. }//<--------------------- but data is still there and available via another reference

内部

如您所见,可以销毁引用,但实际数据将保持不变.它将存储在symbols table中.许多PHP函数正在访问此结构以检索数据,而getopt()也不例外.所以结论是 – 是的,你可以修改引用(甚至破坏它),但实际数据仍然是超级全局的.

getopt的()

现在,关于这个功能.看看它的implementation

  1. /* Get argv from the global symbol table. We calculate argc ourselves
  2. * in order to be on the safe side,even though it is also available
  3. * from the symbol table. */
  4. if (PG(http_globals)[TRACK_VARS_SERVER] &&
  5. (zend_hash_find(HASH_OF(PG(http_globals)[TRACK_VARS_SERVER]),"argv",sizeof("argv"),(void **) &args) != FAILURE ||
  6. zend_hash_find(&EG(symbol_table),(void **) &args) != FAILURE) && Z_TYPE_PP(args) == IS_ARRAY
  7. )
  8. {
  9. //...omitted
  10. }

它清楚地表明,它将尝试在symbol_table中搜索“argv”(如果你想 – 这里是链接到 – how它将完全完成).这意味着 – 它将访问实际数据,因此,从外部覆盖它将不起作用.

因此 – getopt()将处理在脚本启动时收集的数据,并且该数据将包含实际参数,无论您是否在脚本中覆盖它们.

猜你在找的PHP相关文章