トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PHP5、var_dump()のobjectのシャープ数値(#数値)って何?

[カテゴリ:言語]
[カテゴリ:PHP]
[カテゴリ:PHP5]

最初に

php-userに質問しようと思って下書きしてたら、
解決してしまった。
もったいない(?)ので貼っておく。

質問内容

一通り以下を読んだりしてみたのですが、わからなかったので
質問させてください。

PHP: var_dump - Manual:
http://jp2.php.net/manual/ja/function.var-dump.php

var_dump() でオブジェクトを表示したときに
表示される「#数値」はどのような意味があるのでしょうか?

バージョンは php5.2.2 です。
php4.4.7でもやってみたのですが、表示されませんでした。

↓サンプルスクリプト

------------------------------
<?php
error_reporting(0);

print "<pre>";
print phpversion() . "\n";

class sample {
  var $_name;
  function sample($name) {
    $this->_name = $name;
  }
}

$obj = new StdClass();

$val = array();
$val[] = $obj;
$val[] = &$obj;
$val[] = array(&$obj, new StdClass());
var_dump($val);

$val = array();
$val[] = new StdClass();
var_dump($val);

print "</pre>";
?>
------------------------------

↓実行結果

------------------------------
5.2.2
array(3) {
  [0]=>
  object(stdClass)#1 (0) {
  }
  [1]=>
  &object(stdClass)#1 (0) {
  }
  [2]=>
  array(2) {
    [0]=>
    &object(stdClass)#1 (0) {
    }
    [1]=>
    object(stdClass)#2 (0) {
    }
  }
}
array(1) {
  [0]=>
  object(stdClass)#2 (0) {
  }
}
------------------------------

よくよく調べるとわかった。

実体が同じオブジェクトは、「#数値」が
同じになるということですね。

# 実体が違うのに「#2」が重複してるように見えてるのは、
# 途中 $val = array(); してるから。

で、念のためphpソース覗いてみると、

php-5.2.4/ext/standard/var.c

------------------------------
PHPAPI void php_var_dump(zval **struc, int level TSRMLS_DC)
:
  php_printf("%sobject(%s)#%d (%d) {\n", COMMON, class_name,
    Z_OBJ_HANDLE_PP(struc), myht ? zend_hash_num_elements(myht) : 0);
------------------------------

というのを見つけました。
ということで「#数値」の正体はオブジェクトハンドルでした。

オブジェクトハンドルっていうのは、php5で追加になったもの。

実は、

php4とphp5でオブジェクトの扱いが・・・とか
確認してたところに沸いた疑問だったりする。
で、これがそのもともとのスクリプト

<?php
error_reporting(0);

print "<pre>";
print phpversion() . "\n";

$val = array();
$val[] = new sample("デフォルト1");
$val[] = $val[0];
$val[] = & $val[0];
var_dump($val);
$val[0]->_name = "上書き1";
var_dump($val);

$val = array();
$val[] = & new sample("デフォルト2");
$val[] = $val[0];
$val[] = & $val[0];
var_dump($val);
$val[0]->_name = "上書き2";
var_dump($val);

print "</pre>";

?>

最終更新時間:2007年09月20日 00時38分38秒