property_exists | php

プロパティの存在判別が出来ないのかという話です。

http://www.php.net/manual/ja/function.property-exists.php

> isset() とは対照的に、 プロパティの値が NULL の場合でも property_exists() は TRUE を返します。

これだと思ったら

> property_exists() 関数は、マジックメソッド __get を使ってアクセスするプロパティを検出することはできません。

むー。

stdClassの場合。

$o = new stdClass();

var_dump($o->abc);  
// PHP Notice:  Undefined property: stdClass::$abc in test.php on line 5
// NULL
var_dump(isset($o->abc));
// bool(false)
var_dump(property_exists($o,'abc'));
// bool(false)

$o->abc=null;

var_dump($o->abc);
// NULL
var_dump(isset($o->abc));
// bool(false)
var_dump(property_exists($o,'abc'));
// bool(true)

__get __setを書くと・・・

class myClass{
  private $data = array();
  public function __set($key,$value){
    $this->data[$key]=$value;
  }
  public function __get($key){
    return $this->data[$key];
  }
}

$o = new myClass();

var_dump($o->abc);
// PHP Notice:  Undefined index: abc in test.php on line 9
// NULL
var_dump(isset($o->abc));
// bool(false)
var_dump(property_exists($o,'abc'));
// bool(false)

$o->abc=null;

var_dump($o->abc);
// NULL
var_dump(isset($o->abc));
// bool(false)
var_dump(property_exists($o,'abc'));
// bool(false)

こんな感じで最後もfalseに。

is_null( $o->abc );
// PHP Notice:  Undefined index: abc in test.php on line 9
// bool(true)

myClassでsetする前にgetするとnullなんだけどnoticeが出る。

マジックメソッドがオーバーロードされているとプロパティ存在判別が出来ない。
判別できない状態でアクセスする警告が出るなぁと思った話ですが
__get 内で issetとかしてエラーを返さないでくれれば良いだけか。

This entry was posted on 水曜日, 1月 25th, 2012 at 2:37 AM and is filed under php, zend. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Unityによるゲームを公開しております iOS/Android
https://itunes.apple.com/jp/app/lost-knight-3d-action/id900917032
https://play.google.com/store/apps/details?id=com.groundroad.runknight

各種開発支援・機能開発等小さいお仕事などもお請けしております。
unity開発支援, PHPシステム開発, javascript/html5 フロント開発, titanium mobileアプリ開発
お気軽にお問い合わせください
大崎・五反田近郊での対面でのお打ち合わせはいつでも可能です。