HOME>WEBプログラム覚書>[PHP] is_a() と Zend_Loader_Autoloader::autoload()

[PHP] is_a() と Zend_Loader_Autoloader::autoload()

Zend_Loader_Autoloader::autoload()を利用していて、is_a()の第1引数がパスっぽいものだとWarningが発生する。

PHP

  1. <?php
  2. $obj = new stdClass();
  3. $str = '文字列';
  4. $path = '/path/to/file/';
  5.  
  6. var_dump(is_a($obj, 'stdClass'));    // true
  7. var_dump(is_a($str, 'stdClass'));    // false
  8. var_dump(is_a($path, 'stdClass'));   // false だけど Warning: include_once(/path/to/file/.php) がでる。
  9.  
  10. var_dump($obj instanceof stdClass);  // true
  11. var_dump($str instanceof stdClass);  // false
  12. var_dump($path instanceof stdClass); // false
  13. ?>

キャストするのもいいけど、is_a()はバージョンによってE_STRICTで引っかかったり挙動が変わったりといろいろあるみたいなので、PHP 5.1.0より上であればinstanceofを利用した方がよさそう。

注意すべき落とし穴があります。PHP 5.1.0 より前のバージョンでは、 instanceof は、クラス名が存在しない場合に __autoload() をコールしていました。 さらに、クラスが読み込めなかった場合に致命的なエラーが発生していました。 この問題の回避策としては、動的なクラス参照を使用するか、 クラス名を含む文字列変数を使用します。
instanceof 演算子は PHP 5 から使用可能になりました。 それ以前には is_a() が使用されていましたが、 現在は is_a() は推奨されておらず、 instanceof の使用が推奨されています。 PHP 5.3.0 以降、is_a() は非推奨ではなくなったことに注意しましょう。

PHP: 型演算子 - Manual

大きな修正点として、is_a関数の挙動が挙げられています。autoload機能を使ってクラスをロードしている場合への対応と思われますが、PHP5.3.7以降挙動が変更されていたのですが、PHP5.3.9RC1ではデフォルトの挙動を元に戻したようです。

2011-11-04 - Do You PHP はてな

投稿日 2012年1月 7日 21:52
カテゴリ PHP
タグ Zend Framework | エラーコード | 関数
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1250

コメント

コメントする
Name
Email Address
URL