【PHP】PHPファイルがwebサーバーに直に呼ばれた時と require_once などで PHP に呼ばれた時に挙動を変える方法

  • 2023年6月23日
  • PHP

 題の通りです。ルーティングをwebサーバーに完全に任せたような素のPHPファイルを直に呼び出す構成のwebサイトで役に立ちます。

 URLによるPHPファイルの呼び出し方は二種類に分けられます。一つがindex.phpなどのPHPファイルを呼んだ後にPHPの中でURLに応じた別ファイルを呼び出す方法、もう一つがURLでPHPファイルを直に呼び出す方法です。Laravel等のフレームワークがよくやっているのは前者です。後者の方はURLが.phpで終わっている様なサイトが大体それです。後者の方はよく .inc の拡張子を持つ include 用の関数をまとめたファイルと .php の様なブラウザ上の表示や処理を書いたファイルに分かれています。この記事で紹介する方法はそういった後者のコードを扱う時に少しやりやすくなる方法です。

 題の方法を実現するコード例は次です。

<?php

/**
 * 関数でラッピングした処理。外部でincludeされた後にこれを呼び出す。
 */
function my_str_repeat(string $string, int $times = 2): string
{
    return str_repeat($string, $times);
}

// PHPが直接実行した最初のファイルのグローバルなスコープで debug_backtrace を実行すると空配列を返してくれます。
// include等されたグローバルなスコープだとで debug_backtrace を実行するとinclude元を含む配列を返してくれます。
if(debug_backtrace() === []) {
    // 空配列であれば、スクリプトが直接実行された場合
    echo my_str_repeat('これは' . basename(__FILE__) . 'です。');
}

 debug_backtrace の結果を利用して、debug_backtrace が実行された場所が直接実行されたPHPファイルの中か外かを判定します。これによりwebサーバーに直に呼ばれた時と require_once などで PHP に呼ばれた時で挙動を変えられます。

PHP: debug_backtrace – Manual

 この機能の活用方法は Python のif __name__ == "__main__":の活用の仕方と同じです。例えばモジュールとスクリプトの両方として扱う、テスト機能を本体と同じファイルに組み込む、といった使い方です。わざわざ巨大なフレームワークなどを用いる程ではないけれども、テストや再利用などがしたい時はこういった書き方が役に立ちます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG