繁体   English   中英

PHP:变量值神秘地设置为0

[英]PHP: variable value mysteriously set to 0

在此先感谢您的帮助! 我正在尝试调试将变量神秘地设置为0的情况。

我从xdebug(使用PHPStorm)知道,它发生在以下特定行:

// breakpoint here: $id_key is 'my_entity_id_key'
$e_entity_ids = my_module_fetch_col_keyed($query, $id_key, $created_column);
// breakpoint here: $id_key is 0

这很奇怪,因为$id_key不是引用,函数也不将引用作为参数。 同样,在将值更改为0$id_key在调试器的变量窗格中为蓝色。

我尝试制作变量的副本,并使用它传递给函数:

$id_key2 = $id_key;
$e_entity_ids = my_module_fetch_col_keyed($query, $id_key2, $created_column);
// breakpoint here: $id_key is 0, and so is $id_key2

我很好奇:

  1. $id_key的值如何神秘地变为0?
  2. 如何创建$id_key的副本,以便在将副本传递给my_module_fetch_col_keyed()时不更改它?
  3. 当PHPStorm的变量窗格中的变量名称为蓝色时,这是什么意思?

当我进入my_module_fetch_col_keyed() ,在一行之后,$ column神秘地为0 ,如下所示:

function my_module_fetch_col_keyed($query, $column, $key_column = NULL) {
  try {
    $result = $query->execute();
  }
  catch (Exception $e) {
    return FALSE;
  }

  if (!isset($key_column)) {
    try {
      // breakpoint here: $column is 'my_entity_id_key'
      $column_results = $result->fetchCol($column);
      // breakpoint here: $column is mysteriously 0
    }
    catch (Exception $e) {
      return FALSE;
    }
    return $column_results;
  }

  try {
    $assoc = $result->fetchAllAssoc($key_column);
  }
  catch (Exception $e) {
    return FALSE;
  }

  $keyed = array();
  foreach ($assoc as $key => $result) {
    $keyed[$key] = $result->{$column};
  }

  return $keyed;
}

$result->fetchCol()函数只是一个调用PDOStatement::fetchAll()函数:

class DatabaseStatementBase extends PDOStatement implements DatabaseStatementInterface {

  [...]

  public function fetchCol($index = 0) {
    return $this->fetchAll(PDO::FETCH_COLUMN, $index);
  }

  // function fetchAll() is not overridden from parent PDOStatement

  [...]

}


编辑 :我试图把$id_key作为对象属性,并使用魔术__set()方法获取回溯并找出何时确切更改了变量:

 class Test { private $id_key; protected $values = array(); public function __set($key, $value) { if ($key == 'id_key') { $b = debug_backtrace(); "Hello World!"; } if (method_exists(get_parent_class($this), '__set')) { return parent::__set($key, $value); } return $this->values[$key] = $value; } public function __get($key) { return isset($this->values[$key]) ? $this->values[$key] : 1; } } 

然后像这样更新我的代码:

 $e_entity_ids = basic_functions_fetch_col_keyed($query, $test->id_key, $created_column); 

一切保持原样,并且$test->id_key my_entity_id_key之前为my_entity_id_key之后为0 我在__set()__get()方法中设置了断点,并检查了它们的值(例如,在上一行中,在basic_functions_fetch_col_keyed($query, $test->id_key, $created_column)调用了basic_functions_fetch_col_keyed($query, $test->id_key, $created_column) )。 但是,奇怪的是,当该值设置为0时,没有__set()魔术函数。 我很迷路! 任何帮助将不胜感激!

我确实确定id_key是通过引用传递的。

这些PDO库中的一些库是用C编写的。在内部,变量很可能在那里被破坏了。

在TBF中,您正在传递一个字符串作为需要数字值的参数,因此,从您使用的函数的角度来看,新值与旧值相同(大多数文本字符串不包含数字= 0)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM