[PHP]最低限覚えておきたい必須関数一覧

PHP には最初から豊富な関数が用意されていて、特別な記述をしなくてもすぐにそれらを利用できるという特徴があります。
そこで、サイトやアプリケーションを制作する上で、頻繁に使われる関数をリストにし、簡単な説明をつけてみました。
厳選したもののかなりの数がある上、GD関係の関数やPDO、DOMDocument などのクラスメソッドは省略しているのでこれだけあっても本当はまだまだ足りないくらいです。


◆文字列・数値

printf(), sprintf()
文字列をフォーマットに当てはめて出力する。
printf() は出力を行い、sprintf() は結果を文字列として返す。

preg_match(), preg_match_all()
正規表現による一致・検索。preg_match_all() はパターンにマッチしたすべての値を変数に格納する。

preg_replace()
正規表現による置換。パターンにマッチした文字列を指定した文字列に置換する。

preg_quote()
正規表現構文の特殊文字の前にバックスラッシュをつけてエスケープする。

str_replace(), strtr()
文字列の置換。strtr() は複数の文字列のペアを渡して同時に置換できる。

substr(), mb_substr()
文字列の何文字目から何文字取り出すかを指定して文字列の一部分を返す。

strtolower(), strtoupper()
strtolower() はすべてのアルファベットを小文字に変換し、
strtoupper() はすべてのアルファベットを大文字に変換する。

strlen(), mb_strlen()
strlen() は文字列のバイト数を返す。
mb_strlen はマルチバイト文字の文字数を返す。

strpos(), mb_strpos()
文字列の中から指定された文字列が何文字目に存在するかを返す。
大文字小文字を区別しない場合、stripos()、mb_stripos() が用意されている。

mb_convert_encoding()
文字列を指定された文字コードに変換して返す。

mb_convert_kana()
ひらがな・カタカナ、全角・半角を相互に変換する。

trim(), ltrim(), rtrim()
文字列の前後からスペースやタブなどの空白文字や指定された文字を取り除く。
trim() は前後から取り除き、ltrim() は左から、rtrim() は右からのみ取り除く。

mt_rand()
指定された範囲でランダムな数値を返す。
rand() より精度が高い。

is_string()
与えられた値が文字列であるかを返す。

is_int()
与えられた値が整数型であるかを返す。

is_float()
与えられた値が float型(少数) であるかを返す。
is_double() も存在するが内容は is_float() の別名。

is_numeric()
与えられた値が数字として扱えるかを返す。文字列でも良い。

round(), floor(), ceil()
round() は小数部分を四捨五入して返す。
floor() は小数点以下切り捨て、ceil() は小数点以下切り上げで丸める。
桁数を指定することで小数点以下何桁から丸めるかを変更できる。


◆配列

array_slice()
配列の何番目からいくつ取り出すかを指定して取得する。

array_merge(), array_merge_recursive()
配列同士を結合する。array_merge_recursive() は再帰的に結合するため多次元配列でも使える。

in_array()
配列の中に指定された値が含まれているかを返す。

shuffle()
配列をランダムにシャッフルする。

sort(), rsort()
配列を昇順、降順でソート(並び替え)する。キーは新しく割り振られるため、もともとのキーは削除される。

asort(), arsort()
連想配列を昇順、降順でソート(並び替え)する。もともとのキーは保持される。

ksort(), krsort()
配列のキーをもとに昇順、降順でソートする。

usort(), uasort(), uksort()
ユーザーが定義した関数に基づいて配列をソートする。

array_multisort()
複数の配列を他の配列の値をもとにソートする。

array_unique()
配列から重複した値を削除して返す。

array_reverse()
配列の要素を逆順にして返す。

array_shift(), array_pop()
array_shift() は配列の先頭から要素を取り出し、
array_pop() は配列の末尾から要素を取り出す。
元の配列は取り出された分短くなる。

array_walk(), array_walk_recursive()
ユーザー定義関数を配列中のすべての値に適用する。
arra_walk_recursive() は多次元配列に対して再帰的に処理する。

array_search()
配列の中から指定された値を持つ要素を検索し、見つかった場合そのキーを返す。

implode(), explode()
implode() は指定された区切り文字をもとに配列を文字列として結合し、
explode() は指定された区切り文字を元に文字列を配列に変換する。

range()
指定された範囲の整数・文字を持つ配列を作成する。

reset(), end()
reset() は配列のポインタを先頭の要素のセットし、その値を返す。
reset() は配列のポインタを最後の要素のセットし、その値を返す。
実際には配列の最初や最後の要素を取得する目的で使うことが多い。

next(), prev()
next() は配列のポインタを進め、その値を返す。
prev() は配列のポインタを戻し、その値を返す。

current()
現在の配列のポインタが指す値を返す。

extract()
連想配列のキー部分を変数名とする変数を作る。

list()
配列を引数として与えられた複数の変数に分けて代入する。

is_array()
渡された値が配列であるかを返す。


◆ファイル操作

file_get_contents()
ファイルの内容をすべて取得する。また、URLを指定してウェブサイトのソースを取得することもできる。

file_put_contents()
文字列をファイルとして保存する。モードを指定することで追記したり排他ロックが利用できる。

basename()
ファイルやディレクトリのパスから最後にある名前の部分を返す。

dirname()
ファイルパスからディレクトリパスを取り出して返す。
dirname(__FILE__) とすることで実行中のPHPファイルのあるディレクトリを得ることもできる。
これは「__DIR__」と同義。

realpath()
パスの「/./」や「/../」「/」などの参照を全て解決して正規化した絶対パスを返す。

file_exists()
指定されたファイルパスにファイルが存在するかを調べて返す。

fopen()
ファイルやURLをオープンしてストリームに結びつける。

flock()
fopen() によってオープンされたファイルのロック・開放を行う。

fgets()
ファイルポインタから一行取得する。

fgetcsv()
ファイルポインタから一行取得し、指定された文字をもとに区切られた配列を返す。

fwrite()
fopen() によってオープンされたファイルストリームに書き込む。

fclose()
fopen() によってオープンされたファイルポインタをクローズする。

rewind()
ファイルポインタの位置を先頭に戻す。

ftruncate()
fopen() によってオープンされたファイルの内容を指定した長さに丸める。
サイズに 0 を指定することでファイルを空にできる。

feof()
ファイルポインタが終端に達しているかを調べて返す。

is_uploaded_file()
ファイルが HTTP POST によりアップロードされたファイルであるかを調べて返す。
不正操作を防ぐために用いられる。

move_uploaded_file()
ファイルが HTTP POST によりアップロードされたファイルである場合、指定されたファイル名に移動する。

mkdir()
ディレクトリを作る。パーミッションを設定したり入れ子構造のディレクトリを作ることもできる。

unlink()
ファイルを削除する。

rmdir()
ディレクトリを削除する。

rename()
ファイル名を変える。ファイルを移動する。

copy()
ファイルをコピーする。

is_file()
指定されたパスがファイルを指しているかを調べて返す。

is_dir()
指定されたパスがディレクトリを指しているかを調べて返す。

chmod()
ファイルのパーミッションを変更する。

chown()
ファイルのオーナーを変更する。


◆ネットワーク

htmlspecialchars()
HTMLの特殊文字として扱われる文字をHTMLエンティティに変換する。(エスケープ)
「<」などは「&lt;」に変換され、HTMLタグとして扱われることを防げるほか、不正なスクリプトタグを仕込まれて実行されるリスクを回避できる。
大抵は「ENT_QUOTES」フラグを用いてシングルクォートも変換対象にする。

header()
生の HTTP ヘッダーを出力する。
「HTTP/1.0 404 Not Found」などのステータスコードを出力したり、「Content-Type: image/jpeg」などのファイルヘッダーを出力することができる。
「Location: http://www.example.com」とすることで指定された URL にリダイレクトする際にも用いられる。

nl2br()
文字列の改行箇所を「<br>」などの改行タグに変換する。

strip_tags()
文字列から HTML タグを取り除く。許可するタグを指定することもできる。

http_build_query()
連想配列からURLエンコードされたクエリ文字列を生成する。
つまり配列を GET パラメータとして使える「foo=123&bar=hello」のような文字列に変換できる。

rawurlencode(), rawurldecode()
rawurlencode() は非アルファベット文字をパーセント記号と16進数を用いて URL として利用できる文字列に変換する。
rawurldecode() によって元の文字列を復元できる。

filter_input()
GET、POST などのパラメータをフィルタリングしたうえで受け取る。
$_GET、$_POST を直接操作するかわりにこの関数を通す。

filter_var()
指定したフィルターでデータをフィルタリングする。
データがメールアドレスとして正しい書式であるかを調べたり、特殊文字を取り除いたりするなど、様々なフィルタが利用できる。

session_start()
セッションを開始する。セッションIDを渡すことで現在のセッションを復帰することもできる。

session_regenerate_id()
セッションの情報を位置したままセッションIDを新しく生成した値に置き換える。
セッションハイジャック攻撃を防ぐ手段として用いられる。

session_destroy()
セッション情報を全て破棄する。再開するには再度 session_start() する必要がある。

setcookie()
クッキーに値を保存する。有効期限を設定することもできる。

hash()
選択したアルゴリズムに基づいてハッシュ値を生成する。

md5()
MD5 アルゴリズムを用いてハッシュ値を生成する。

password_hash()
選択したアルゴリズムを用いてパスワード用のハッシュ値を生成する。
これによって作成されたパスワードは password_verify() によってマッチしたかを検証できる。

password_verify()
password_hash() によって作られたパスワードと生のパスワード文字列がマッチするかを検証する。

base64_encode(), base64_decode()
文字列を MIME base64 方式でエンコード、デコードする。

json_encode(), json_decode()
連想配列を JSON 形式にして返したり、JSON 形式の文字列を連想配列に変換する。
json_decode() を行う際第二引数に true を指定すると stdClass Object のかわりに連想配列に変換される。

mb_send_mail()
mb_language() により設定された言語に基づいてエンコード変換を行ってメールを送信する。


◆その他

print_r()
変数の内容をわかりやすく表示する。
文字列に限らず連想配列も表示できるほか、第二引数に true を指定することで結果を文字列として返すこともできる。

var_dump()
変数の内容を詳細にダンプする。
含まれるオブジェクトの型、内容を細かく知ることができる。
print_r() よりも詳細な内容を知りたい時に使う。

count()
配列やオブジェクトの要素数を数えて返す。

isset()
変数が宣言されているか、配列にキーが存在するかを返す。
内容が NULL であっても TRUE を返す。配列にキーが存在するかを調べる関数として array_key_exists() があるが、そちらは ["key" => NULL] の場合 FALSE を返す。

empty()
変数の内容が空であるかを返す。空文字、「0」、空配列、NULL、FALSE などがからであると判断される。

unset()
指定した変数を破棄する。連想配列から一部のキーを取り除く際にも使える。

time(), microtime()
現在のUNIXタイムスタンプを得る。
1970年1月1日 00:00:00 GMT からの通算秒。
マイクロ秒まで知りたい場合は microtime() を使う。

mktime()
時、分、秒、月、日、年 を指定することでその日時のUNIXタイムスタンプを得る。

date()
UNIXタイムスタンプを日時を表す文字列としてフォーマットして出力する。
日時の取り扱いに関しては date() よりも DateTime クラスを利用するケースが増えている。

define()
定数を定義する。定数は書き換えられることのない変数のような値で、関数内などあらゆるスコープで利用できる。
大文字のアルファベットで名前をつける習慣がある。


どの関数も一度は使うものばかりですので、名前が思い出せない時のための覚書として役立ててもらえればと思います。

[JS, jQuery]ページ内に他のページをiframeのように埋め込む

一昔前まではサイトそのものをフレーム構造にしたり iframe を使って新着情報などを埋め込むサイトを良く見かけましたが、HTML5 と Ajax が定着してからはあまり見なくなりました。frameset や frame タグ自体廃止され、唯一残った iframe も iPhone や android の登場により使いにくいものとなってしまったことが理由の一つかと思います。
今回は jQuery の load() を使って他のページを GET, POST の二つの方式を用いて読み込むサンプルを作ってみようと思います。


GET

GET

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Ajax Load</title>
		<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
		<script>
		function loadPage(page){
			$("#content-frame").load("pages.php?page=" + page);
		}
		</script>
	</head>
	<body>
		<ul>
			<li><a href="javascript:loadPage(0);">Page 1</a></li>
			<li><a href="javascript:loadPage(1);">Page 2</a></li>
			<li><a href="javascript:loadPage(2);">Page 3</a></li>
		</ul>
		<div id="content-frame" style="width: 300px;height:200px;overflow:scroll;border:1px solid #DDD;">
			Sample
		</div>
	</body>
</html>

pages.php

<?php
$content1 = <<<EOD
<h1>Hello, World!</h1>
<p>page 1</p>
EOD;

$content2 = <<<EOD
<h1>Foo Bar</h1>
<p>page 2</p>
EOD;

$content3 = <<<EOD
<h1>Lorem Ipsum</h1>
<p>page 3</p>

<p>
Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
EOD;

$pages = array($content1, $content2, $content3);

$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
$page = ($page !== false) ? (int)$page : 0;

if(isset($pages[$page])){
	echo $pages[$page];
} else {
	echo 'Not Found.';
}

GET パラメータ「page」を pages.php を渡し、そのページ番号に応じて HTML を返すという単純なものです。
$("#表示先ID").load(読み込むページのURL); という形で指定します。 iframe と違い要素内に直接読み込まれるので <html> や<body> などのタグは使いません。
また、CSS などは読み込み元のページのスタイルが適用されます。


POST

POST

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Ajax Load</title>
		<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
		<script>
		function submitMessage(page){
			var params = {message: $('#message').val()};
			$("#content-frame").load("hello.php", params);
		}
		</script>
	</head>
	<body>
		<p>
			<input id="message" type="text">
			<input type="button" onclick="submitMessage()" value="Submit">
		</p>

		<div id="content-frame" style="width: 300px;height:200px;overflow:scroll;border:1px solid #DDD;">
			Sample
		</div>
	</body>
</html>

hello.php

<?php
$message = (string)filter_input(INPUT_POST, 'message');
echo '<p>Hello, ' . htmlspecialchars($message, ENT_QUOTES, 'UTF-8') . '!</p>';

load() の第二引数にオブジェクトを指定した場合 POST メソッドが使用されます。
サンプルではテキストボックスの文字列を post.php に送信し、post.php は送られてきた文字に「Hello, 」をつけて返します。

POST の際にCSRF(クロスサイトリクエストフォージェリ)対策としてトークンを送信する必要がある場合、ajaxSetup() を使って拡張ヘッダに埋め込んでしまうのが良いと思います。

<meta name="csrf-token" content="<?php echo $token;?>">

<script>
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
</script>

送信されたヘッダのトークンは PHP では $_SERVER["HTTP_X_CSRF_TOKEN"]; として受け取ることができます。

また、より複雑な通信を行う必要がある場合は load() の代わりに ajax() を使うことになります。
以下は同じ動作を ajax() を使う形に変更したものです。

function submitMessage(page){
    var params = {message: $('#message').val()};
    $("#content-frame").load('hello.php', params);

    $.ajax({
        url: "hello.php",
        data: params,
        type: "POST",
        success: function(html) { $("#content-frame").html(html); }
    });
}

[PHP]PHP7.0での変更点とアップグレード時の対応

PHP 5.x 系列のメジャーアップデートとなる PHP 7.0 では、処理速度の大きな向上と言語仕様の変更が行われています。新機能と非推奨になった機能のうち、大きな影響を与える変更点についてまとめてみました。


POSIX 正規表現関数の廃止
5.3 の時点で非推奨となっていましたが、POSIX互換の正規表現に関する関数が取り除かれています。
影響を受けるのは以下の関数です。

ereg(), eregi(), ereg_replace(), eregi_replace, split(), spliti(), sql_regcase()

ereg に関連する殆どの関数が取り除かれました。今後は preg_match や preg_replace などの PCRE 系関数 を使うことになります。


ext/mysql 拡張の廃止
5.5 で非推奨になった mysql_ 系の関数が取り除かれました。代替となる PDO や mysqli が用意された現在でも古い参考書に惑わされて使用する人が多かったので良い変更だと思います。数が多すぎるので廃止となった関数は列挙しませんが「mysql_」で始まっている関数は今後使用できなくなります。前述の PDO や mysqli 系を使って下さい。


可変変数の新しい記述方法
多次元配列を可変変数として用いる際、${$var['foo']['bar']} のように { } を使って書いていましたが、PHP 7 では ($$var)['foo']['bar'] という書き方ができるようになります。
クラスメソッドやプロパティでは次のようにします。

// PHP 5.x;
$var->{$prop['key']};
$var->{$prop['key']}();

// PHP 7;
($var->$prop)['key'];
($var->$prop)['key']();

「::」のネスト
クラス定数や static メソッドに関する「::」がネストできるようになります。

$var::$class::$constant

関数が返す値に直接アクセスする
関数が返した callable(コールバック) や、callable を持つ変数から直接コールできます。

foo()();
$foo()();
$foo()['bar']();

無名クラスのサポート
「class」を用いてその場限りの無名クラス(Anonymous Class)を作ることができます。

$object = new class("Hello"){
    public $var;

    public function __construct($arg){
        $this->var = $arg;
    }
};

use のグループ化
use を用いる際にネームスペースをグループ化して複数のクラスを一括指定できるようになりました。

// 5.x
use Vendor\ComponentA\ClassA;
use Vendor\ComponentA\ClassB;
use Vendor\ComponentA\ClassC as Foo;

use Vendor\ComponentB\ClassD;
use Vendor\ComponentC\ClassE;

// 7.0
use Vendor\ComponentA\{ClassA, ClassB, ClassC as Foo};

use Vendor\{ComponentB\ClassD, ComponentC\ClassE}

Null 合体演算子(??)の追加
null となる可能性のある値を取得する際、今までは二項演算子で対処していました。

$foo = isset($bar) ? $bar : $baz;

PHP 7 では新しい演算子「??」を使って同じことを簡単にかけるようになりました。(文字化けしているのではありません)

$foo = $bar ?? $baz;

「??」は複数使うこともできます。$a が null なら $b の値を、$b も null なら $c の値が格納されます。

$var = $a ?? $b ?? $c;

宇宙船演算子(<=>)の追加
宇宙船演算子(Spaceship-Operator)と呼ばれることの多い「<=>」比較演算子が追加されました。
2つの値が同じなら 0 を、左の値が小さければ -1、大きければ +1 を返します。


配列を用いた定数
define() による定数の宣言で配列を指定できるようになりました。


preg_replace_callback_array() 関数の追加
preg_replace_callback_array() に正規表現のパターンと置換処理を配列の形で与えるとそれぞれの処理を同時に行うことができるようになります。


dirname() 関数の強化
パス文字列からディレクトリ名を返す dirname() に第2引数が指定できるようになり、何番目のディレクトリ名を取得するかを指定できるようになりました。

$path = '/dir1/dir2/dir3/example.txt';
dirname($path, 2); // 「/dir1/dir2」

password_hash() の salt オプション廃止
password_hash() のには手動でソルトを設定するためのオプションがありましたが廃止になりました。
使用箇所では E_DEPRECATED が発生します。


assert() の言語構造化
デバッグに用いてきた assert() が関数から言語構造となったことで、式を直接指定できるようになり、運用環境下でのでオーバーヘッドがなくなりました。


try〜catchで扱えるエラー種類の拡大
5.x では不可能だった PHP の通常エラーが「\Error」としてキャッチできるようになりました。
その他にも「\ParseError」や「\TypeError」などのエラーも扱えます。


Unicode拡張領域への対応
Unicode文字関する多くの機能を持つ IntlChar が導入され、絵文字などの名称を割り出したり、英数字かどうか判定したりするための機能が追加されました。


タイプヒンティングの強化
変数が配列かコールバックなのかを明示する機能は PHP 5.x にもありましたが、さらに使用できるタイプヒントの数が増え、以下の型も指定できるようになりました。

・bool
・float
・int
・string

関数で function(int $foo) とした時、「"100"」などの文字列を与えると int型の「100」に変換されます。
declare() 関数で「strict_types=1」 とすることで自動変換を無効化し、適切な型の値が与えられなかった場合「\TypeError」を発生させることもできます。

返り値にもタイプヒンティングが利用でき、次のように指定します。

function example(string $str): int
{
    //
}

ここで紹介したのは新機能のごく一部で、実際にはもっと多くの変更があります。
詳細については公式マニュアルが参考になると思います。

Migrating from PHP 5.6.x to PHP 7.0.x