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




記述方法

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

変数宣言

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

関数

関数定義

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

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

関数呼び出し

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

可変長引数

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

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

無名関数

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

クラス

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

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

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

静的メンバ

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

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

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

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

メンバへのアクセス方法

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

アクセス修飾子

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

public どこからでもアクセス可能
protected そのクラス自身とそのクラスを継承したクラスからのみアクセス可能
private そのメンバーを定義したクラスからのみアクセス可能

※メンバ変数には、必ずアクセス修飾子をつける必要があります。
※メンバ関数では、アクセス修飾子をつけない場合、publicになります。

継承

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

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

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

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

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

インタフェース定義

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

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

演算子

算術演算子

四則演算 + – * /
剰余 %
累乗 **

代入演算子

代入 =

論理演算子

論理積 &&  and
論理和 ||  or
否定 !
排他的論理和 xor

比較演算子

大小比較 >  <  >=  <=
等しい(型変換後に比較) ==
等しくない(型変換後に比較) !=  <>
等しい(型が等しく、値も等しい) ===
等しくない(型もしくは値が等しくない) !==
3項演算子 (条件) ? (true) : (false)

型演算子

キャスト (型名)変数 例) (int)f
型を調べる 変数 instanceof 型名
例) $a instanceof MyClass

 

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

ビット演算子

ビット積 &
ビット和 |
否定 ^
排他的論理和 ~
左シフト <<
右シフト >>

文字列演算子

文字列結合 .

 

コメント

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

配列

全てが連想配列(マップ)です。array()で生成できます。

数値添字配列を初期化する場合

文字列をキーとした配列(マップ)を初期化する場合

値の取得・設定

値の取得や設定は [] を用います。数値添字配列の場合も、それ以外のオブジェクトをキーとしたマップの場合も同様です。

要素数の取得

count() もしくは sizeof() 関数を使用します。

条件分岐構文

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

if文

switch文

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

ループ構文

for文

while文

foreach文(配列の列挙)

数値添字配列の場合

連想配列の場合

break, continue

break、continueともにサポートされています。

演算子のオーバーロード

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

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

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

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

インデクサ

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

Math関数

C言語で定義されているような関数がそのまま使用できます。詳細は、公式ドキュメントを参照してください。また、円周率等の定数も定義されています。定数についても、公式ドキュメントを参照してください。

管理者がよく使うもの

円周率 M_PI
三角関数 sin cos tan atan2
端数の切り捨て floor
平方根 sqrt
最大値 最小値 max min (配列を渡すことも可能)

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

基本的には、「require_once」を用います。一度だけ指定したファイルが読み込まれます。

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

エントリポイント(main関数)

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

文字列リテラル

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

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

 

定数

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

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