PHPの基本構文を紹介します。この記事では、PHP 7.0の文法を基準としています。
記述方法
必ず「<?php ?>」で囲みます。ただし、閉じの「?>」は省略可能なようです。ドキュメント内の任意の場所に埋め込み可能です。
変数宣言
特に、変数を宣言する必要はありません。ただし、変数はドル記号($)の後に変数名が続く形式で表する必要があります。また、変数名は大文字小文字が区別されます。変数宣言時に型の指定はできないようです。
関数
関数定義
関数定義は以下の通りです。(戻り型の指定はPHP7以降)
1 2 3 4 5 6 |
function 関数名(型 引数1, 型 引数2, ...) : 戻り型{ // 処理...; return; } |
※returnを省略した場合、NULLを返します。
※戻り値がない場合は、戻り型は省略します。(そもそも省略可能です。)
※デフォルト引数がサポートされています。
function foo($val = "hello") のように指定できます。
※引数の前の型名は省略可能です。
関数呼び出し
関数の呼び出し方法は以下の通りです。
1 2 3 |
関数名( 引数1, 引数2, ...); |
可変長引数
可変長引数はサポートされています。引数の最後に「…変数名」を追加します。
1 2 3 4 5 6 7 8 9 10 11 |
function sum(...$nums) { $sum = 0; foreach ($nums as $n) { $sum += $n; } return $sum; } echo sum(1, 2, 3, 4); |
可変長引数に配列の内容をばらして渡すことも可能です。その場合、配列の前に「…」トークンを追加して渡します。
1 2 3 4 |
$arr = [1, 2, 3, 4]; echo add(...$arr); |
無名関数
無名関数もサポートされています。無名関数は、変数に代入可能です。「function(引数リスト){}」の形式で定義できます。
1 2 3 4 5 6 |
$hello = function($name) { echo "Hello ". $name ."\r\n"; }; |
クラス
クラスの定義は以下の形式で行います。PHPでは、クラス内でメンバにアクセスするためには$thisキーワードが必須(のよう)です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class クラス名 { // メンバ変数の宣言 public $member = '???'; // ... // メソッドの定義 public function foo() { echo $this->member; // クラスのメンバにアクセスするためには、$thisが必須 } } |
メソッドのオーバーロード
サポートされていません。ただし、関数ではデフォルト引数が使えるため、活用すると便利かもしれません。
静的メンバ
静的メソッドの定義と呼び出し。
1 2 3 4 5 6 7 8 9 10 11 |
class MyClass { // staticキーワードを追加 public static function foo() { // ... } } // クラス名::メソッド名 で呼び出し MyClass ::foo(); |
静的メンバ変数の宣言と呼び出し。クラス内からそのクラスの静的メンバにアクセスするためには、「self::」で参照します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class MyClass { //静的メンバ変数の宣言 public static $static_member = 'foo'; public function foo() { // クラス内からの静的メンバへのアクセス return self::$static_member; } } //静的メンバ変数へのアクセス $v = MyClass::$static_member; |
オブジェクト生成(new)・メンバへのアクセス
「new」を使用します。引数付きのコンストラクタが定義されていれば、引数を渡すことができます。
1 2 3 |
$obj = new MyClass("Test"); |
メンバへのアクセス方法
1 2 3 4 5 6 7 8 9 |
$obj = new MyClass(); //メンバ変数 echo $obj->member; //メンバメソッドの呼び出し echo $obj->Hello(); |
オブジェクトのメンバにアクセスするためには、アロー演算子「->」を使用します。
アクセス修飾子
クラスメンバのアクセス権を設定できます。
public | どこからでもアクセス可能 |
protected | そのクラス自身とそのクラスを継承したクラスからのみアクセス可能 |
private | そのメンバーを定義したクラスからのみアクセス可能 |
※メンバ変数には、必ずアクセス修飾子をつける必要があります。
※メンバ関数では、アクセス修飾子をつけない場合、publicになります。
継承
extendsキーワードで、クラスを継承できます。同一の名前の関数を定義することで、親クラスのメンバ関数をオーバーライドできます。オーバーライドする前の親のメンバにアクセスするためには、「parent::」で参照します。
1 2 3 4 5 6 7 8 9 10 11 12 |
class ExtendClass extends ParentClass { // 親クラスのメソッドをオーバーライド function Hellow() { echo "Extending class\n"; // 親クラスのメンバにアクセスするには、parent:: を使う parent::Hellow(); } } |
※ 多重継承はできません。
コンストラクタ・デストラクタ
コンストラクタやデストラクタの定義が可能です。コンストラクタは「__construct」という名前の、デストラクタは「__destruct」という名前の関数を定義します。なお、クラスを継承した場合、親クラスのコントラクタやデストラクタは自動的には呼ばれません。呼び出したい場合は、「parent::__construct();」のように明示的に呼び出す必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
class MyClass { //コンストラクタ function __construct() { } //デストラクタ function __destruct() { } } |
デストラクタは、オブジェクトの全ての参照が切れた際に呼ばれるようです。
インタフェース定義
PHPはインタフェースの定義に対応しています。以下の形式で定義します。
1 2 3 4 5 6 7 8 |
interface インタフェース名 { public function foo1(); public function foo2(); // ... } |
インタフェースの実装には、「implements」を使用して、クラス定義時に指定します。インタフェースに定義された関数を実装する場合、特別なキーワードは必要ありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
interface iInterface { public function foo(); } // インターフェイスを実装 class MyClass implements iInterface { public function foo() { echo "Foo"; } } |
演算子
算術演算子
四則演算 | + – * / |
剰余 | % |
累乗 | ** |
代入演算子
代入 | = |
論理演算子
論理積 | && and |
論理和 | || or |
否定 | ! |
排他的論理和 | xor |
比較演算子
大小比較 | > < >= <= |
等しい(型変換後に比較) | == |
等しくない(型変換後に比較) | != <> |
等しい(型が等しく、値も等しい) | === |
等しくない(型もしくは値が等しくない) | !== |
3項演算子 | (条件) ? (true) : (false) |
型演算子
キャスト | (型名)変数 | 例) (int)f |
型を調べる | 変数 instanceof 型名 |
例) $a instanceof MyClass |
instanceof は、親クラスを継承したクラスのインスタンスであるかどうかを調べることも可能です。
ビット演算子
ビット積 | & |
ビット和 | | |
否定 | ^ |
排他的論理和 | ~ |
左シフト | << |
右シフト | >> |
文字列演算子
文字列結合 | . |
コメント
コメントは、以下の3種類の形式がサポートされています。
1 2 3 4 5 6 7 8 |
// 行末まで # 行末まで /* 閉じる まで */ |
配列
全てが連想配列(マップ)です。array()で生成できます。
数値添字配列を初期化する場合
1 2 3 4 |
//配列を初期化(添え字は0から始まります) $array = array("a", "b", "c", "d"); |
文字列をキーとした配列(マップ)を初期化する場合
1 2 3 4 5 6 |
$array = array( "a" => "あいうえお", "b" => "かきくけこ", ); |
値の取得・設定
値の取得や設定は [] を用います。数値添字配列の場合も、それ以外のオブジェクトをキーとしたマップの場合も同様です。
1 2 3 4 5 6 7 |
// $key に $value を格納 $arr[$key] = $value; // $v に $key の値を取得 $v = $arr[%key]; |
要素数の取得
count() もしくは sizeof() 関数を使用します。
1 2 3 4 |
count($array); sizeof($array); |
条件分岐構文
if文とswitch文がサポートされています。
if文
1 2 3 4 5 6 7 8 9 |
if (条件1) { // 条件1がtrueの時 } else if (条件2) { // 条件1がfalseで条件2がtrueの時 } else { // 条件1・条件2がfalseの時 } |
switch文
1 2 3 4 5 6 7 8 9 10 11 12 |
switch (比較対象) { case 条件1: //... break; case 条件2: //... break; default: //それ以外 //... } |
※PHPのswitch構文は、「==」演算子での比較を行います。
ループ構文
for文
1 2 3 4 5 |
for ($i = 1; $i <= count($array); $i++) { echo $array[$i]; } |
while文
1 2 3 4 5 6 |
while ($num < count($array) ){ echo $array($num); $num++; } |
foreach文(配列の列挙)
数値添字配列の場合
1 2 3 4 5 6 |
$array= array("あいうえお", "かきくけこ", "さしすせそ"); foreach($array as $value){ echo $value; } |
連想配列の場合
1 2 3 4 5 6 7 8 9 10 |
$array= array( "あ" => "あいうえお", "か" => "かきくけこ", "さ" => "さしすせそ"); foreach($array as $key => $value){ echo "array[" . $key . "] = " . $value; } |
break, continue
break、continueともにサポートされています。
演算子のオーバーロード
どうやら、対応しているらしいです。”__add” “__sub” “__mul” “__div”という名前のメンバを追加?ただし、公式ドキュメントを見つけられていません。
要調査
プロパティ(アクセッサ)
「__get()」「__set()」メソッドを定義すると、アクセッサに近い動作をさせることができます。これらのメソッドは、メンバに存在しない名前のメンバ変数や、外部からアクセスの禁止されているメンバ変数にアクセスしようとした際に呼び出されます。第一引数には、呼び出し時の名前が文字列で渡されます。そのため、例えば以下のような方法で、アクセッサのようなものを定義することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Test { /** データの場所 */ private $data = array(); public function __set($name, $value) { $this->data[$name] = $value; } public function __get($name) { if (array_key_exists($name, $this->data)) { return $this->data[$name]; } return null; } } |
演算子のオーバーロードを応用したような方法です。正直、あまり便利ではなさそうです。
インデクサ
対応していないようです。
Math関数
C言語で定義されているような関数がそのまま使用できます。詳細は、公式ドキュメントを参照してください。また、円周率等の定数も定義されています。定数についても、公式ドキュメントを参照してください。
管理者がよく使うもの
円周率 | M_PI |
三角関数 | sin cos tan atan2 |
端数の切り捨て | floor |
平方根 | sqrt |
最大値 最小値 | max min (配列を渡すことも可能) |
インクルード(他ソースファイルの読み込み)
基本的には、「require_once」を用います。一度だけ指定したファイルが読み込まれます。
1 2 3 |
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」キーワードによって宣言することもできます。
1 2 3 |
define(定数名の文字列, 定数の内容); |
例えば、以下のように使用します。
1 2 3 4 5 6 7 |
// 定数 MIN_VALUE を宣言 define('MIN_VALUE', '0.0'); //または const MIN_VALUE = 0.0; |
[bottomBannar]