1

親愛なるコミュニティへのご挨拶、
各オブジェクトへの参照の静的配列を介して内部的にすべてのインスタンスを追跡するクラスを作成しようとしています。

# MyObject.php
class MyObject{
  public static $_register = array();
  public        $_id    = -1;
  public        $_value = '';

  function __construct( $value ){
    $this->_value = $value;
    $this->_id    = count( self::$_register );

    self::$_register[ $this->_id ] =& $this;  // I also tried '= &$this'
  }

  function foo(){                                  // outputs 'id : value'
    echo $this->_id.' : ' . $this->_value . '<br />';
  }
}

しかし$_register、メイン スクリプトを変更しようとすると、次のようになります。

#main.php
require_once( 'MyObject.php' );

$test = new MyObject( 'hihi' );
$test->foo();                                     // outputs '0 : hihi'

MyObject::$_register[0] = NULL;

$test->foo();                                     // still outputs '0 : hihi'

それでも「0 : hihi」が出力されます。Avar_dump( MyObject::$_register[0] )は NULL に設定されていることを示しましたが、参照する必要がある MyObject は依然として同じインスタンスを指しています。

PHP の参照を理解しようとしていますが、この動作は私にとって予想外でした。誰か説明してくれませんか。

アドバイスありがとう

PS: C++/Qt を少し試してみる前に、参照/ポインターの使用方法の違いにめまいがしました。

4

1 に答える 1

1

これは、unset を使用するとオブジェクトへの参照のみが破棄され、オブジェクト自体は破棄されないためです。これは奇妙に思えるかもしれませんが、参照の設定解除は、その参照が指しているエンティティではなく、参照の破棄として扱われます。

ただし、PHP では、参照はポインターではありません。大きな違いは PHPリファレンス チュートリアルに示されています。したがって、一般的なケースでは、エンティティへの参照を指定してエンティティの設定を解除することはできません。覚えておいてください: PHP 参照は、C ポインターとは何の関係もありません。

于 2014-02-11T16:23:58.597 に答える