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

时间:2016-04-19 22:39:51

标签: php reference phpstorm xdebug

提前感谢您的帮助!我有一个情况,我正在尝试调试变量神秘地设置为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变量窗格中变量名称为蓝色时的含义是什么?
  4. 当我走进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之前和之后0。我在__set()__get()方法中设置断点,并在调用它们时检查它们(例如,在上面的行中,get在basic_functions_fetch_col_keyed($query, $test->id_key, $created_column)中调用)。但是,奇怪的是,当值设置为__set()时,0 MAGIC FUNCTION没有被调用。我迷路了!任何帮助都会非常感激!!

1 个答案:

答案 0 :(得分:0)

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

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

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

相关问题