Scribble at 2020-12-30 13:13:54 Last modified: 2020-12-31 09:22:53

添付画像

当サイトや PHILSCI.INFO で使っている自家製 CMS のデータ・ファイルは、テキスト・ファイルとして上記のようなフォーマットで保存してある。そして、記事を読み出すときに define() した値をテンプレートへ代入している。実は、後からこういう方式は使い勝手が多少よくないことに気づいたので、今後は改善したい(定数として扱ってしまっているため、複数の記事のデータを同時に読み出せない)。

なお、このように記事のデータとして読み込む文字列を define() で定数にしている理由は、このファイルへブラウザでアクセスできてしまったとしても、PHP としてパースされている限りは文字列がブラウザへレスポンスされないからだ。上記のファイルを PHP として実行している限り、ブラウザ上ではソースとしても見られないし、もちろんパソコンでリクエストとレスポンスをモニタリングできるソフトを使っていたとしてもビジターには分からない。ブラウザにレスポンスされるのは、あくまでも〈ウェブ・サーバ上で実行された PHP コードの結果〉だけだからだ。

一つのレスポンスで複数のファイルから同名で define() された定数を読み込むなら、最も簡単な方法は namespace を使うことだろう。しかし、define() という関数に名前空間を指定しなくてはならないため、これは現在のデータ・ファイルに追記することはできない。それに、たぶん読み込む順番が任意となるだろうから、個々のファイルに一意の名前空間を設定しなくてはならず、名前空間それ自体を衝突しないハッシュ値のようなもので定義しなくてはならなくなる。これは管理が逆に難しくなる。PHP の名前空間は case insensitive なので、桁数を多く取らないと衝突する危険があり、おおよそ 128 文字くらいを要する(PSR では 120 文字と「制限」しているので、128 文字でも可能だろう。そもそも PHP のサイトでは名前空間の許容サイズを全く説明していないのだが)。

もう一つの方法は runkit モジュールを読み込んで runkit_constant_remove() で削除してしまうことだが、ヘテムルのウェブ・サーバにこういう危険なモジュールが読み込まれているとは思えないし、(実装う、そして期待)すべきでもない。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook