PHPの基本構文

PHP の基本構文を紹介します。この記事では、PHP 7.0 の文法を基準としています。


記述方法

必ず「<?php ?>」で囲みます。ただし、閉じの「?>」は省略可能なようです。ドキュメント内の任意の場所に埋め込み可能です。

エントリポイント

エントリポイントの指定は必要ありません。上から順に実行されていきます。

インクルード(他ソースファイルの読み込み)

require_once を用いるのが良いようです。一度だけ指定したファイルが読み込まれます。

相対参照をする場合、参照した先のファイルの先のファイルの位置がずれることがあります。そのため、以下のように、__DIR__ マクロを使って相対参照をするほうが安全なようです。なお、__DIR__ は最後が / で終わらないため注意が必要です。

ちなみに、PHP には「include」「require」「include_once」「require_once」の 4 つの関数があります。include は、読み込みに失敗してもそのまま実行を続けますが、require は、失敗すると処理を停止します。_once がついたものは、一度だけファイルを読み込み、ついていないものは複数回読み込みます。

変数宣言

特に、変数を宣言する必要はありません。ただし、変数はドル記号($)の後に変数名が続く形式で表する必要があります。また、変数名は大文字小文字が区別されます。変数宣言時に型の指定はできないようです。

関数

関数定義

関数定義は以下の通りです。(戻り型の指定は PHP7 以降)

  • return を省略した場合、NULL を返します。
  • 戻り値がない場合は、戻り型は省略します。(そもそも省略可能です。)
  • デフォルト引数がサポートされています。
    function foo($val = "hello")
    のように指定できます。
  • 引数の前の型名は省略可能です。

関数呼び出し

関数の呼び出し方法は以下の通りです。

可変長引数

可変長引数はサポートされています。引数の最後に「…変数名」を追加します。

可変長引数に配列の内容をばらして渡すことも可能です。その場合、配列の前に「…」トークンを追加して渡します。

無名関数

無名関数もサポートされています。無名関数は、変数に代入可能です。「function( 引数リスト )」の形式で定義できます。

クラス

クラスの定義は以下の形式で行います。PHP では、クラス内でメンバにアクセスするためには $this キーワードが必須(のよう)です。

メソッドのオーバーロード

サポートされていません。ただし、関数ではデフォルト引数が使えるため、活用すると便利かもしれません。

静的メンバ

静的メソッドの定義と呼び出し。

静的メンバ変数の宣言と呼び出し。クラス内からそのクラスの静的メンバにアクセスするためには、「self::」で参照します。

オブジェクト生成(new)・メンバへのアクセス

「new」を使用します。引数付きのコンストラクタが定義されていれば、引数を渡すことができます。

メンバへのアクセス方法

オブジェクトのメンバにアクセスするためには、アロー演算子「->」を使用します。

アクセス修飾子

クラスメンバのアクセス権を設定できます。

表1: アクセス修飾子
public どこからでもアクセス可能
protected そのクラス自身とそのクラスを継承したクラスからのみアクセス可能
private ~ そのメンバーを定義したクラスからのみアクセス可能
  • メンバ変数には、必ずアクセス修飾子をつける必要があります。
  • メンバ関数では、アクセス修飾子をつけない場合、public になります。

継承

extends キーワードで、クラスを継承できます。同一の名前の関数を定義することで、親クラスのメンバ関数をオーバーライドできます。オーバーライドする前の親のメンバにアクセスするためには、「parent::」で参照します。

※ 多重継承はできません。

コンストラクタ・デストラクタ

コンストラクタやデストラクタの定義が可能です。コンストラクタは「__construct」という名前の、デストラクタは「__destruct」という名前の関数を定義します。なお、クラスを継承した場合、親クラスのコントラクタやデストラクタは自動的には呼ばれません。呼び出したい場合は、「parent::__construct();」のように明示的に呼び出す必要があります。

デストラクタは、オブジェクトの全ての参照が切れた際に呼ばれるようです。

インタフェース定義

PHP はインタフェースの定義に対応しています。以下の形式で定義します。

インタフェースの実装には、「implements」を使用して、クラス定義時に指定します。インタフェースに定義された関数を実装する場合、特別なキーワードは必要ありません。

演算子

表2: 算術演算子
四則演算 + – * /
剰余 %
累乗 **
表3: 代入演算子
代入=
表4: 論理演算子
論理積 && and
論理和 | or
否定 !
排他的論理和 xor
表5: 比較演算子
大小比較 > < >= <=
等しい(型変換後に比較) ==
等しくない(型変換後に比較) != <>
等しい(型が等しく、値も等しい) ===
等しくない(型もしくは値が等しくない) !==
3項演算子 ( 条件 ) ? (true) : (false)
表6: 型演算子
キャスト( 型名 ) 変数例 ) (int)f
型を調べる変数 instanceof 型名例 ) $a instanceof MyClass

instanceof は、親クラスを継承したクラスのインスタンスであるかどうかを調べることも可能です。

表7: ビット演算子
ビット積&
ビット和|
否定^
排他的論理和~
左シフト <<
右シフト >>
表8: 文字列演算子
文字列結合.

コメント

コメントは、以下の 3 種類の形式がサポートされています。

条件分岐構文

if 文と switch 文がサポートされています。

if 文

switch 文

  • PHP の switch 構文は、「==」演算子での比較を行います。

ループ構文

for 文

while 文

foreach 文(配列の列挙)

数値添字配列の場合
連想配列の場合

break, continue

breakcontinue ともにサポートされています。

演算子のオーバーロード

どうやら、対応しているらしいです。”__add ” “ __sub ” “ __mul ” “ __div ”という名前のメンバを追加?ただし、公式ドキュメントを見つけられていません。要調査

プロパティ(アクセッサ)

__get() __set() メソッドを定義すると、アクセッサに近い動作をさせることができます。これらのメソッドは、メンバに存在しない名前のメンバ変数や、外部からアクセスの禁止されているメンバ変数にアクセスしようとした際に呼び出されます。第一引数には、呼び出し時の名前が文字列で渡されます。そのため、例えば以下のような方法で、アクセッサのようなものを定義することができます。

演算子のオーバーロードを応用したような方法です。正直、あまり便利ではなさそうです。

インデクサ

対応していないようです。

文字列リテラル

PHP には、複数の文字列リテラルがあり、微妙に違いがあります。

表9: 文字リテラル
シングルクォート ‘文字列’ 文字列がそのまま利用されます。ただし、エスケープシーケンスは利用できます。
ダブルクォート “文字列” 文字列中の変数が展開された状態で利用されます。
ヒアドキュメント
<<< ID
文字列
ID
文字列中の変数が展開された状態で利用されます。改行なども利用できます。(ID は適当なラベルです)
NowDoc
<<<‘ID
文字列
ID
ラベルをシングルクォートで囲みます。文字列がそのまま利用されます。エスケープシーケンスも展開されません。(ID は適当なラベルです)

定数

定数の宣言には、define を使います。定数は、スクリプト中に値が変更されることはありません。また、変数ではないため、先頭に $ もいりません。define 以外にも、「const」キーワードによって宣言することもできます。

例えば、以下のように使用します。