Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 覆盖getopt的$argv_Php - Fatal编程技术网

Php 覆盖getopt的$argv

Php 覆盖getopt的$argv,php,Php,example.php: $args = __FILE__.' -vvv'; $argv = explode(' ', $args); $argc = count($argv); $GLOBALS['argv'] = $_SERVER['argv'] = $argv; $GLOBALS['argc'] = $_SERVER['argc'] = $argc; var_export(getopt('v')); $example.php-v >数组('v'=>false) 最终,getopt不会查

example.php:

$args = __FILE__.' -vvv';
$argv = explode(' ', $args);
$argc = count($argv);
$GLOBALS['argv'] = $_SERVER['argv'] = $argv;
$GLOBALS['argc'] = $_SERVER['argc'] = $argc;

var_export(getopt('v'));
$example.php-v

>数组('v'=>false)

最终,
getopt
不会查找
$GLOBALS
来获取
argv
。因此,有没有任何方法可以覆盖
argv
array?

TL;博士 不,没有本地的方法可以做到这一点。根据您的目标,可能还有其他解决问题的方法,但压倒一切不是其中之一


在超全局上操作 结构

要了解为什么会这样,您应该知道,超全局变量不仅仅是您所指的“变量”。这意味着,如果您使用
$argv
取消引用参数列表,并不意味着您将访问存储在“变量”中的一些数据。相反,您将通过名为
$argv
的“链接”访问数据容器。但是,访问此数据有不同的方法-
$\u服务器['argv']
$GLOBALS
阵列。为了举例说明,我将使用以下代码:

var_dump($argv, $_SERVER['argv']);
unset($argv);
var_dump($argv, $_SERVER['argv']);
这将导致如下结果:

array(2) {
  [0]=>
  string(11) "example.php"
  [1]=>
  string(4) "-vvv"
}//<--------------------- derived from $argv
array(2) {
  [0]=>
  string(11) "example.php"
  [1]=>
  string(4) "-vvv"
}//<--------------------- derived from $_SERVER['argv']
NULL//<------------------ we've unset $argv, so unset a reference
array(2) {
  [0]=>
  string(11) "example.php"
  [1]=>
  string(4) "-vvv"
}//<--------------------- but data is still there and available via another reference
内部

如您所见,可以销毁引用,但实际数据将保持不变。这将被存储在。许多PHP函数正在访问此结构以检索数据,这也不例外。因此,结论是-是的,您可以修改引用(甚至销毁它),但实际数据仍然是超全局的


getopt()
现在,关于这个函数。只需看看它的:

很明显,它将尝试在
symbol\u表
中搜索
“argv”
(如果您愿意-这里有一个链接-它将完全完成)。这意味着-它将访问实际数据,因此,在外部覆盖它将没有效果


因此-
getopt()
将处理在脚本启动时收集的数据,这些数据将包含实际参数,无论您是否在脚本中重写它们。

我认为不可能更改
getopt()
正在使用的参数。
/* Get argv from the global symbol table. We calculate argc ourselves
 * in order to be on the safe side, even though it is also available
 * from the symbol table. */
if (PG(http_globals)[TRACK_VARS_SERVER] &&
    (zend_hash_find(HASH_OF(PG(http_globals)[TRACK_VARS_SERVER]), "argv", sizeof("argv"), (void **) &args) != FAILURE ||
    zend_hash_find(&EG(symbol_table), "argv", sizeof("argv"), (void **) &args) != FAILURE) && Z_TYPE_PP(args) == IS_ARRAY
) 
{
    //...omitted
}