PHPの落とし穴!?

今日は、WordPressのカスタマイズをしていて遭遇した不思議な現象についてお話しします。

分かってみれば簡単なのですが、切り分けに膨大な時間を費やしました。

少しでも、他の方がハマるのを避けられたらと思い、共有させていただきます。

function.php でカスタマイズ

サイトの作成やブログの作成などができるCMS(コンテンツ管理システム)の無料のソフトウェアとして、今やもっとも有名なのがWordPress(ワードプレス)でしょう。

無料でも一通りのことはできるのですが、自分の希望の動作に手っ取り早く近づけるためには、有料の「テーマ」を購入したりします。

また、標準のWordPressにはない機能(プログラム)が「プラグイン」という形で配布されており、それらを追加インストールする事によって、ウェブサイトに様々な機能を持たせる事ができます。

それでも、痒いところに手が届かなかったりします。

それを何とかするには、function.phpという、WordPressのテーマに必須のファイルの1つに、PHPというプログラミング言語の関数という形でコード(処理)を書いていくことになります。

ちなみに、私が現役のソフトウェア技術者だったときは、メインのプログラミング言語は「C言語」でした。
Webプログラミングではお馴染みのプログラミング言語である「Perl」や「PHP」は、趣味の世界での見様見真似の独学です。

カスタマイズしたいプラグインなどが少ない場合はいいのですが、カスタマイズしたいものが増えていくと、function.phpの中身がどんどん増えていきます。

事件は、そんな状況で起りました。

以前は正常に動作していた処理が動かなくなっていた!

ある日、以前は正常に動作していたカスタマイズの処理(仮に「処理A」とします)が動かなくなっていることに気づきました。

function.phpにあとから新たなカスタマイズの処理を追加した時に、何かミスったのだと思いました。

切り分け作業の開始です。

追加した関数を1つずつ消していっては、「処理A」の動作が復活しないか確認していきました。

その作業を繰り返していれば、原因が特定でき、解決するのは時間の問題と思えました。

しかし、世の中そんなに甘くはありません。😓

関数を大量に削除すると、確かに、「処理A」が動き出すのですが、そこから関数を1つずつ追加していくと、問題の関数が複数あるように思えました。

追加すると「処理A」が動作しなくなる関数が、1つではないのです。
しかも、それが、関数の組み合わせによって、動作したりしなかったりが変わるようなのです。

途方もない時間を費やしましたが、結局、問題のある関数は特定できませんでした。

原因は何と・・・!

発想を変え、PHPで陥りやすい罠を、ネットで検索しました。

そして、遂に原因が分かりました!

「function.php」の最後に、空行がある・・・

もう、思わず脱力しました、・・・そんなのが駄目だなんて知らないもん😅

PHPの開始タグと終了タグ

PHPの基本構文

PHPの開始タグである「<?php」と終了タグである「?>」で囲むことで、間の記述がPHPスクリプトですよと明示します。

PHPを動作させるために必要な記述です。

<?php

  //この部分がPHPスクリプトの処理だよ

?>

また、HTMLテンプレートなどに、PHPの構文を差し込んで使用する場合も、以下のように使用します。

<h2>見出し</h2>
 <p>テキスト…</p>
 <p><?php echo $variable_text; ?></p>

このようなケースがあるため、終了タグである「?>」は必要なのです。

PHPの終了タグ以降の改行タグで問題が起きる

今回の根本原因です。

重要

PHPの終了タグの直後の改行コードは1つだけ無視されるが、2つ以上記述されていると認識されてしまう。

以下のように1つのみの「許容される改行」でPHPファイルを記述できていれば問題はありません。

<?php
  // ほにゃらら
?>[許容される改行]
[EOF]

しかし、次のPHPファイルでは、PHPの終了タグ「?>」の後に改行コードが2つあります。
([EOF]はEnd Of Fileの略で、ファイル内での終了を示すコードです。)

<?php
  // includeファイル
  // ほにゃらら
?>[許容される改行]
[ここに無駄な改行]
[EOF]

無駄な改行コードが含まれるPHPファイルを使用すると、プログラムが誤作動する場合があります。

例えば「header()関数」を使用する場合、関数のコール前に改行コードが出力されているとエラーなります。

また、HTMLでは改行コードを半角スペースとして認識するので、出力された結果おかしな空白に悩まされる原因ともなります。

終了タグは省略できる

ということで、無駄な改行コードがないように注意しなければなりません。

しかし、人間のやることです。間違いは必ず起きます。

しかも、空行は目に見えないので、気づきずらいです。

ここで、衝撃の事実!

終了タグ「?>」は省略できる

そして、さらに衝撃の事実!

PHPのプログラマーの間では、以下が奨励されているそうです。

PHP コードのみからなるファイルでは、終了タグ 「?>」 は決して含めてはいけません。

これは必須なものではなく、 終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。

C言語の世界では考えらない常識です!

プログラミング言語が異なれば文化が異なる

人間の世界での言語は、少なからずその国(言語圏)の文化を反映しています。

これは、プログラミング言語も一緒です。

「C言語」では、変数の型などを厳密に定義します。

それに対して「Perl」は「省略の美学」が重んじられます。

C言語使いの私が、はじめて「Perl」に触れたときはその文化の違いに驚きました。

現在主流のプログラミング言語の多くが、C言語の影響を受けています。
しかし、文化は大きく異なります。

今回の事件も、C言語の常識がかえって問題の発見を遅らせたのかもしれません。

常識にとらわれない発想が大切ということを痛感した事件でありました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です