WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

PHPの字句構造

      2015/05/17

プログラミングPHP 第3版再読のメモ。
「第2章 PHP言語の基本」の字句構造のところ。

そもそも「字句構造」とは

プログラム言語の最も下位レベル(基本)の文法規則であり、変数に使用できる文字や大文字小文字の解釈、文の書式などのこと。

字句はソースコードに出現する文字列の中で意味を持つ最小単位で、トークンとも呼ばれる。

PHPでパーサエラーが発生した時に、例えば”Parse error: unexpected T_SR, expecting ‘,’ or ‘;’ in script.php on line 10.”のように出力されるがこの”T_SR”がトークンを表している。どんなトークンがあるかやより詳しい情報は下記を参照。

PHP: パーサトークンの一覧 – Manual

大文字と小文字の区別

各トークンの書式などあまりにも基本的な事は省いて、各トークンでの大文字小文字の区別に注視した。
表にすれば一目瞭然。

トークン 大文字小文字の区別
変数 する
クラス しない
関数 しない
組み込みのキーワード(echoやstatic) しない

割と有名な、変数名は大文字小文字区別するのに関数やクラス名では区別しないなどの仕様もこの章で解説されていた。

具体的にコードで見てみると下記のようになる。

// 変数は大文字小文字が区別される
$Hoge = "foo";
$hoge = "bar";

echo $Hoge;  // => "foo"
echo $hoge;  // => "bar"

// 組み込みのキーワードは大文字小文字が区別されない
echo "hoge";  // => "hoge"
Echo "hoge";  // => "hoge"

// ユーザ定義の関数でも大文字小文字は区別されない
function greet() {
    echo "Hello!";
}
greet();  // => "Hello!"
Greet();  // => "Hello!"

// ユーザ定義のクラスでも同様に大文字小文字は区別されない
class Human { }
$human = new Human;  // => <Human #0000000023fcf0fb000000006a8f6bf2> {}
$human = new human;  // => <Human #0000000023fcf0f7000000006a8f6bf2> {}

// 組み込みクラスでも大文字小文字は区別されない
new DateTime('now')
/* => <DateTime #000000000ab1f4e8000000010b44a7e6> {
       date: "2015-05-16 14:53:05.000000",
       timezone_type: 3,
       timezone: "Asia/Tokyo"
   }
*/

new DATETIME('now')
/* => <DateTime #000000000ab1f4e9000000010b44a7e6> {
       date: "2015-05-16 14:53:14.000000",
       timezone_type: 3,
       timezone: "Asia/Tokyo"
   }
*/

コメント

所定の書式でコード内にコメントを埋め込められる。
コメントの書式は下表の通り。

種別 コメントトークンの書式 有効範囲 主な用途
シェル式 # <comment> トークンから行末まで 単行での注釈
目立つのでコードブロックを区切るときに使われることも
C++式 // <comment> トークンから行末まで シェル風と同様だが、コーディング規約でこちらをC++式を使ってコメントするように指定されていることが多い(気がする)
C風 /* <comment> */ /* から */まで。
複数行をまたぐことも可能。php終了タグもまたげる。
長いのコメントや、複数行をまたぐコメント
ある程度のボリュームのコードをまとめて無効化したいとき

具体的にコードで見てみると下記のようになる。

<?php
$hoge = "bar";  #  シェル風のコメント 
$hoge = "bar";  // C++風のコメント


#$hoge = "bar";  # 行頭から用いることでコード自体を無効化も可能

$hoge = "bar";  /* C風。 */

/* コードブロックの無効化にも使える。
if (true) {
    echo "hoge";
}
 */

/* PHP終了タグをまたいでコメント可能
echo "hage";
?>
 */

コメントを行う際の注意事項

注意事項は下記。

  • 自分しか読まないコードでもコメントを入れる。自分が書いたコードでも数カ月後読むと他人が書いたコードと錯覚するほど忘れているため。
  • コードよりもコメントが目立つほどコメントを入れるのはよくない。

キーワード(予約語)

PHP言語自体の機能を実現するために予約されている単語を予約語またはキーワードという。
例えばclassやifなど。

ユーザ定義のクラスや変数の命名時に、キーワードと同一語を使用することはできない。
基本的にテキストエディタなどがPHPの構文に対応していればハイライトしてくれるため、命名時の衝突は避けられることが多い。

予約語の一覧は下記を参照。

PHP: 予約語の一覧 – Manual

セミコロンの省略

おまけ。
PHPでは命令文の区切り分としてセミコロンが必要。

ただし、条件分岐やループなど、複数のコードをまとめたブロックを表現する{}の中では}の後ではセミコロンを省略することができる。

<?php
if (true) {
    echo "hoge";  // 閉じ括弧直前の命令文ではセミコロンが"必要"
}  // ここに;を"省略可能"

PHPの終了タグの直前の命令文でもセミコロンを省略可能。

<php
echo "hoge"  // ここでは;を"省略可能"
?>

ブロックの}後はセミコロン付けないのが一般的。
PHPの終了タグでは省略可能な場合でもセミコロンを付けるのが一般的(もっと言えばPHPの終了タグは省略可能なときは省略するのが一般的)。

知ってて当たり前なことが多かったですが以上です。

参考資料

 - PHP , , , ,