BLOGTIMES
2010/06/20

Pythonのif __name__ == '__main__':と同じ効果をphpで書く

  python  php  cli 
このエントリーをはてなブックマークに追加

Pythonのコード(特にライブラリ)を読んでいると下記のようなコードに遭遇することがよくあります。

if __name__ == '__main__': # test code

これは、そのスクリプト自身がエントリーポイントである場合にのみ実行され、ライブラリとして呼び出されるときには実行されないというイディオムで、コマンドラインからユーティリティのように使えるようになっていたり、テストが書いてあったりします。これと同じことがPHPでできないかということでいろいろ試行錯誤してみました。

最初は Pythonのように __FILE__ をうまく使ってできないかと思ったのですが、PHPにはエントリポイントが格納されている特殊変数がないので、この線は断念。結局、debug_backtrace()でコールスタック調べ、空だったらエントリポイントとみなすというのが一番簡単な実装方法のようでした。

aaa.php

<?php if(!debug_backtrace()){ echo "aaa!\n"; } include("bbb.php");

bbb.php

<?php if(!debug_backtrace()){ echo "bbb!\n"; }

上記のプログラムを実際に実行すると下記のようになります。

$ php aaa.php aaa! $ php bbb.php bbb!

後で気づいたことですが、Stack Overflowには「PHP equivalent of Python's __name__ == "__main__"?」というそのものずばりのスレッドがあって、結果的には同じ結論にたどりつきましたが、ちょっとした頭の体操としてはよかったので気にしないことにします。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3613
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン