Home > 検索結果

検索結果

stdclass の検索結果: 2

PHP 定義されている情報(クラス、関数、変数等)を取得する関数まとめ

  • 2014-06-04 (水)
  • PHP
この記事の所要時間: 124

PHP には、定義されているクラスや関数、変数などの一覧を取得する関数があります。

php-logo

ここでは定義情報を取得できる関数群をまとめてみました。ここでは実行例として、Laravel アプリケーションのビューテンプレート(hoge.blade.php)で実行した内容を記載しています。

定義された情報を取得する関数群

get_defined_constants()

定義されている定数を連想配列として取得します。キーが定数名で、要素がその値となっています。

http://www.php.net/manual/ja/function.get-defined-constants.php

出力してみると、1771 個の定数がありました。内容を見ると、フレームワークやアプリケーションで定義されたものの他に、PHP本体や extension で多数の定数が定義されていることがわかります。

array (size=1771)
  'E_ERROR' => int 1
  'E_RECOVERABLE_ERROR' => int 4096
  'E_WARNING' => int 2
...

get_declared_classes()

定義されているのクラスの名前が配列として取得します。

http://www.php.net/manual/ja/function.get-declared-classes.php

304 個のクラスが定義されていました。

array (size=304)
  0 => string 'stdClass' (length=8)
  1 => string 'Exception' (length=9)
  2 => string 'ErrorException' (length=14)
  3 => string 'Closure' (length=7)
...

get_declared_interfaces()

定義されているインターフェイスを配列として取得します。

http://www.php.net/manual/ja/function.get-declared-interfaces.php

55 個のインターフェイスが定義されていました。

array (size=55)
  0 => string 'Traversable' (length=11)
  1 => string 'IteratorAggregate' (length=17)
  2 => string 'Iterator' (length=8)
  3 => string 'ArrayAccess' (length=11)
...

get_declared_traits()

定義されているトレイトを配列として取得します。

http://www.php.net/manual/ja/function.get-declared-traits.php

トレイトの定義が無かったので、サンプルとして Foo をトレイトとして定義しています。

array (size=1)
  0 => string 'Foo' (length=3)

get_defined_functions()

定義されている関数を連想配列として取得します。

http://www.php.net/manual/ja/function.get-defined-functions.php

連想配列には2つのキーがあり、internalには内部関数、userにはユーザ定義関数が配列として格納されています。

ここでは、1,686個(!)の内部関数と74個のユーザ定義関数がありました。

array (size=2)
  'internal' => 
    array (size=1686)
      0 => string 'zend_version' (length=12)
      1 => string 'func_num_args' (length=13)
      2 => string 'func_get_arg' (length=12)
      3 => string 'func_get_args' (length=13)
...
 'user' => 
    array (size=74)
      0 => string 'composerrequirea978da05ae47fd0758967870dd5a04f2' (length=47)
      1 => string 'composerautoloadincludefile' (length=29)
      2 => string 'crypt_random_string' (length=19)
      3 => string '_swiftmailer_init' (length=17)

get_defined_vars()

全ての定義済の変数を連想配列で取得します。

http://www.php.net/manual/ja/function.get-defined-vars.php

連想配列のキーに変数名、要素が変数値となっています。

array (size=6)
  '__path' => string '/share/app/config/../views/login.php' (length=36)
  '__data' => 
    array (size=4)
      '__env' => 
        object(IlluminateViewEnvironment)[208]
          protected 'engines' => 
            object(IlluminateViewEnginesEngineResolver)[202]
              ...
          protected 'finder' => 
            object(IlluminateViewFileViewFinder)[207]
              ...
...

get_included_files() / get_required_files()

include または require で読み込まれたファイル名を配列として取得します。

http://www.php.net/manual/ja/function.get-included-files.php

255 個のファイルが読み込まれていました。get_required_files()は、get_included_files()のエイリアスとなっているので、実行結果はどちらでも同じです。

array (size=225)
  0 => string '/share/public/index.php' (length=23)
  1 => string '/share/bootstrap/autoload.php' (length=29)
  2 => string '/share/vendor/autoload.php' (length=26)
  3 => string '/share/vendor/composer/autoload_real.php' (length=40)
...

get_loaded_extensions()

コンパイル/ロードされているモジュールを配列として取得します。

http://www.php.net/manual/ja/function.get-loaded-extensions.php

58 個のモジュールが有効になっていました。

array (size=58)
  0 => string 'Core' (length=4)
  1 => string 'date' (length=4)
  2 => string 'ereg' (length=4)
  3 => string 'libxml' (length=6)

なお、get_loaded_extensions()では、引数に真偽値を指定することができ、trueを渡すと、Zend 拡張モジュールのみを取得します。

実行してみると、下記の 2 つだけでした。

array (size=2)
  0 => string 'Zend OPcache' (length=12)
  1 => string 'Xdebug' (length=6)

ini_get_all()

設定値を連想配列として取得します。

http://www.php.net/manual/ja/function.ini-get-all.php

下記エントリで実行結果を記載していますので、ご参考まで。

http://qiita.com/shin1x1/items/f469bfb73c396007f911

使いどころ

色々と使いどころはあるのですが、便利な使い方を一つ。

フレームワークのビューテンプレートで、定義(バインド)されている変数をリストアップします。CakePHPやLaravelなどのフレームワークでは、ビューテンプレートをビュークラスのメソッドで読み込んで実行するので、ビューテンプレート内はこのメソッドのコンテキストで実行されることになります。

get_defined_vars()を使うことで、実際にはどのような変数がビューテンプレートで定義されているかを確認できます。

下記が、Laravel ビューテンプレートでget_defined_vars()を実行した例です。このビューテンプレートでは 6 つの変数が定義されており、$__path$__data$__env$app$errors$loginUserとして利用できることが分かります。

このように、マニュアルなどのドキュメントを見ずとも、コードで利用できる変数を知ることができます。

<?php var_dump(array_keys(get_defined_vars())) ?>

array (size=6)
  0 => string '__path' (length=6)
  1 => string '__data' (length=6)
  2 => string '__env' (length=5)
  3 => string 'app' (length=3)
  4 => string 'errors' (length=6)
  5 => string 'loginUser' (length=9)

他には、クロージャ内でget_defined_vars()を実行して、スコープにある変数がどれかを確認したり、PHPの挙動を知るのにも使えます。

さいごに

こういった定義を確認する関数群は日々使うというわけではありません。ただ、知っておくと、アプリケーションのデバッグや、フレームワークの挙動を確認したりする際に役立ちます。

日々開発しているPHPコードの定義情報を見てみると、新たな発見があるかもしれませんよ。

このエントリで紹介した関数群を書いたコード Gist に置いてます。参考まで。

追記

このエントリでは、配列で取得する関数を取り上げましたが、コマンドラインでも取得できます。extension で定義されているクラスや設定を見るなら、コマンドの方が手軽ですね。

$ php -h
...
  --rf       Show information about function .
  --rc       Show information about class .
  --re       Show information about extension .
  --rz       Show information about Zend extension .
  --ri       Show configuration for extension .
  • コメント (Close): 0
  • トラックバック (Close): 0

PHP4なスクリプトをPHP5へ移行する際に発生する7つの問題

  • 2007-06-06 (水)
  • PHP
この記事の所要時間: 119

2007/11/13: 3.と4.が同じ内容となっていましたので、4.の内容を変更しました。

ここ最近PHP4.1.2で稼働していたシステムをPHP5.1.6へ移行しています。

移行の際に発生した問題とその対応をメモしておきます。

ちなみに全ての内容がPHP4->PHP5で必要なものではないです。PHP4も4.1/4.2/4.3/4.4の間でちょこちょこ変わっているので、一部の内容はPHP4間の移行でも修正が必要になります。またPHP4.4に適応しているスクリプトをPHP5へ移行するなら修正内容は少なくなります。

1.Notice: Only variable references should be returned by reference

「function &method()」と定義しているメソッドでスカラー値を返すと発生します。

<?php
class Hoge {
  function &method() {
    return false;
  }
}
Hoge::method();
&#91;/php&#93;
<p>「function method()」にするか、本当に参照を返す必要がある場合ならスカラー値を一旦変数に代入してからreturnします。</p>

<?php
class Hoge {
  // 参照を返さなくて良いなら
  function method() {
    return false;
  }

  // 参照を返す必要があるなら
  function &method() {
    $ret = false;
    return $ret;
  }
}
&#91;/php&#93;
<h3>2.get_class()がクラス名を小文字で返さない</h3>
<p>get_class()でクラス名を判定している時にはまります。PHP4ではクラス名が小文字(hoge)で返されるのに対してPHP5ではクラス名(Hoge)がそのまま返ります。</p>

<?php
class Hoge {}

$obj = new Hoge();
if (get_class($obj) == 'hoge') {
  // PHP4ならこちらを通る
} else {
  // PHP5ならこちらを通る
}

&#91;/php&#93;
<p>PHP5専用で良いなら比較するクラス名を実際のクラス名(Hoge)に変更します。PHP4との互換性が必要ならget_class()の返り値をstrtolower()で小文字にします。</p>

<?php
class Hoge {}

$obj = new Hoge();
// クラス名を変える
if (get_class($obj) == 'Hoge') {
}

// 小文字にする
if (strtolower(get_class($obj)) == 'hoge') {
}
&#91;/php&#93;
<h3>3.Notice:  Trying to get property of non-object</h3>
<p>PHP4では値がnullな変数のインスタンス変数もnullでした。($obj = nullなら$obj->idもnull)この仕様の是非はともかく、まあこういう仕様でした。PHP5では改善?され、nullな変数のインスタンス変数を参照しようとするとNoticeが発生するようになっています。</p>

<?php
$obj = null;
if (is_null($obj->id)) {
  echo "foo\n";
}

// PHP4.1.2
// foo

// PHP5.1.6
// PHP Notice:  Trying to get property of non-object in /home/shin/tmp/getter.php on line 3
// foo

$obj->idをempty()で判定するか、$objがnullか否かを判定します。

<?php
$obj = null;
if (empty($obj->id)) {
  echo "foo\n";
}

if (!is_null($obj) && is_null($obj->id)) {
  echo "foo\n";
}

4.PHP Fatal error: Cannot redeclare

PHP4.1.2では同じ名前のメソッドが複数存在してもエラーにはなりませんでした。(単に後で定義したメソッドが呼ばれる)PHP5ではFatalエラーが発生します。

<?php
class Hoge {
  function a() {
    echo "foo\n";
  }

  function a() {
    echo "bar\n";
  }
}

$obj = new Hoge();
$obj->a();

// PHP4.1.2
// bar

// PHP5.1.6
// PHP Fatal error:  Cannot redeclare Hoge::a() in /home/shin/tmp/same_method.php on line 7
?>

5.short_open_tagがoff

ソースに含まれるphp.ini-recommendでは[short_open_tag=off]になっています。もし必要な場合はOnにしておきます。

6.Fatal error: Cannot redeclare method()

PHP4.1.2ではクラス内に同名のメソッドがあっても動作していました(後で定義した方が有効)。PHP5.1.6ではFatal errorが発生するようになっています。(確かPHP4.3.0あたりからこうなってたと思います。)

<?php
class Hoge {
  function method() {
    echo "method1\n";
  }
  function method() {
    echo "method2\n";
  }
}

Hoge::method();
&#91;/php&#93;
<p>先に定義されているメソッドはどこからも呼ばれていないはずなので削除するか、もし必要ならば別のメソッド名にします。</p>
<h3>7.array_push()では参照を格納する</h3>
<p>PHP5のオブジェクトは参照渡しが基本となっているので、array_push()でもオブジェクトの参照が連想配列に格納されます。ですのでループ内等で連続でarray_push()する際は注意する必要があります。</p>
<p>下の例ではPHP4.1.2ではidが異なるオブジェクトが格納されていますが、PHP5.1.6ではどちらも同じidになっているのが分かります。</p>

<?php
$array = array();
$a = new stdClass;
for ($i = 1; $i <= 2; $i++) {
  $a->id = $i;
  array_push($array, $a);
}

var_dump($array);

// PHP4.1.2
// array(2) {
//   [0]=>
//   object(stdClass)(1) {
//     ["id"]=>
//     int(1)
//   }
//   [1]=>
//   object(stdClass)(1) {
//     ["id"]=>
//     int(2)
//   }
// }

// PHP5.1.6
// array(2) {
//   [0]=>
//   object(stdClass)#1 (1) {
//     ["id"]=>
//     int(2)
//   }
//   [1]=>
//   object(stdClass)#1 (1) {
//     ["id"]=>
//     int(2)
//   }
// }

PHP5ではオブジェクトを毎回newするか__cloneする必要があります。

<?php
// new
$array = array();
for ($i = 1; $i <= 2; $i++) {
  $a = new stdClass;
  $a->id = $i;
  array_push($array, $a);
}
var_dump($array);

// clone
$array = array();
$a = new stdClass;
for ($i = 1; $i <= 2; $i++) {
  $b = clone $a;
  $b->id = $i;
  array_push($array, $b);
}
var_dump($array);

意外と動きます

バージョン間の互換性が悪いと言われるPHPですが、PHP4.1.2からPHP5.1.6というロングジャンプ;-)でも、意外と動作しました。

専用サーバなどでよく採用されているCentOS(RHEL互換)の最新版(CentOS5)ではPHP5.1.6が採用されました。これにより今後はPHP5への移行が進むのではと期待しています。PHP4なシステムをメンテナンスされている方、一度PHP5環境を試してみてはいかがでしょうか。

ref: PHP: 下位互換性のない変更点 – Manual

Home > 検索結果

検索
フィード
メタ情報

Return to page top