php覚え書き(基礎編)
目次
- 情報の表示
- 開始タグと終了タグ
- echoとprintの違い
- 構文
- コメント
- 定数
- 変数
- 文字列の連結
- ヒアドキュメントとNowdoc
- 文字列関数
- (私的)コーディング規約
- 値渡しと参照渡し
- 変数のスコープ
- セッション変数
- 複雑なフォーム変数とリクエスト変数
- クッキー
- 静的変数
- 値の代入と表示とTRUE,FALSE,NULLの扱い
- 変数と型に関する操作
- 配列
- 式と演算子
- 制御構造
- ファイルのインクルード
- 関数
情報の表示
<? phpinfo(); ?>
開始タグと終了タグ
PHPの開始タグと終了タグは下記の4種類のタグがあるが、サーバ環境によっては使えないものがありPHPマニュアルによると1の<?php ... ?>タグが推奨されている
- <?php ... ?>
- <script language="php"> ... </script>
- <? ... ?>
- <% ... %>
echoとprintの違い
echo "Hello PHP!!<br>\n"; print("Hello PHP!!<br>\n");
単純な使い方では違いは無いが、微妙な違いが存在する。
PHPスクリプト講座:echoとprintの違い -- そふぃのphp入門を参照の事。
構文
行末」にセミコロンが必要。
コメント
C++の/* ..... */ ,// の他に#も使える。
定数
define("const_name", "const_value");
定数の先頭には$が付かない。
スコープは常にグローバル。(関数内も)
定数に指定できるのは、スカラデータのみ。
PHP 5.3.0 以降ではconst キーワードを使って定数を定義することもできる。
const const_name = 'const_value';
使われ方によって変化する自動的に定義される定数(マジカル定数)には以下のものがある。
__LINE__ ,__FILE__,,__DIR__ ,__FUNCTION__ ,__CLASS__ ,__METHOD__,__NAMESPACE__
定義済みの定数も存在する。
定数名文字列を引数にしてconstant関数をコールする事により定数の値を得る事もできる。
echo constant("const_name");
変数
変数宣言は必要無い。
変数の先頭は$で始まる。
可変変数
変数に変数名の文字列を代入する事により、変数の値を参照する事ができる。
$foo="bar"; $var_name="foo"; echo "\${$var_name}='{$$var_name}'<br />";
文字列の連結
$c = $a . $b
ヒアドキュメントとNowdoc
ヒアドキュメントが使えるがperlやshellスクリプトが<<なのに対してphpでは<<<と<が1個多い。
ヒアドキュメントがダブルクォートで括られた文字列と同様に変数展開をおこなうのに対し識別子をシングルクォートで囲む(Newdocと言う,PHP 5.3.0 以降で使用可)と変数展開をおこなわない。
また、終端識別子のある行はセミコロン (;) 以外の他の文字が含まれていてはならない。
変数名の終りを明示的に指定したい場合は、変数名を波括弧で括う。
<?php $x=3; $y=5; $z=$x+y; $htmlText = <<<EOF <html> <head> <title>xxx</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <p>{$x}+{$y}={$z}</> </body> EOF; print $htmlText; ?>
文字列関数
文字列関数には以下のものがある。
- addcslashes - C 言語と同様にスラッシュで文字列をクォートする
- addslashes - 文字列をスラッシュでクォートする
- bin2hex - バイナリデータを16進表現に変換する
- chop - rtrim のエイリアス
- chr - 特定の文字を返す
- chunk_split - 文字列をより小さな部分に分割する
- convert_cyr_string - キリル文字セットを他のものに変換する
- convert_uudecode - uuencode された文字列をデコードする
- convert_uuencode - 文字列を uuencode する
- count_chars - 文字列で使用されている文字に関する情報を返す
- crc32 - 文字列の crc32 多項式計算を行う
- crypt - 文字列の一方向の暗号化 (ハッシュ化) を行う
- echo - 1 つ以上の文字列を出力する
- explode - 文字列を文字列により分割する
- fprintf - フォーマットされた文字列をストリームに書き込む
- get_html_translation_table - htmlspecialchars および htmlentities で使用される変換テーブルを返す
- hebrev - 論理表記のヘブライ語を物理表記に変換する
- hebrevc - 論理表記のヘブライ語を、改行の変換も含めて物理表記に変換する
- html_entity_decode - HTML エンティティを適切な文字に変換する
- htmlentities - 適用可能な文字を全て HTML エンティティに変換する
- htmlspecialchars_decode - 特殊な HTML エンティティを文字に戻す
- htmlspecialchars - 特殊文字を HTML エンティティに変換する
- implode - 配列要素を文字列により連結する
- join - implode のエイリアス
- lcfirst - 文字列の最初の文字を小文字にする
- levenshtein - 二つの文字列のレーベンシュタイン距離を計算する
- localeconv - 数値に関するフォーマット情報を得る
- ltrim - 文字列の最初から空白 (もしくはその他の文字) を取り除く
- md5_file - 指定したファイルのMD5ハッシュ値を計算する
- md5 - 文字列のmd5ハッシュ値を計算する
- metaphone - 文字列の metaphone キーを計算する
- money_format - 数値を金額文字列にフォーマットする
- nl_langinfo - 言語およびロケール情報を検索する
- nl2br - 改行文字の前に HTML の改行タグを挿入する
- number_format - 数字を千位毎にグループ化してフォーマットする
- ord - 文字の ASCII 値を返す
- parse_str - 文字列を処理し、変数に代入する
- print - 文字列を出力する
- printf - フォーマット済みの文字列を出力する
- quoted_printable_decode - quoted-printable 文字列を 8 ビット文字列に変換する
- quoted_printable_encode - 8 ビット文字列を quoted-printable 文字列に変換する
- quotemeta - メタ文字をクォートする
- rtrim - 文字列の最後から空白 (もしくは他の文字) を削除する
- setlocale - ロケール情報を設定する
- sha1_file - ファイルの sha1 ハッシュを計算する
- sha1 - 文字列の sha1 ハッシュを計算する
- similar_text - 二つの文字列の間の類似性を計算する
- soundex - 文字列の soundex キーを計算する
- sprintf - フォーマットされた文字列を返す
- sscanf - フォーマット文字列に基づき入力を処理する
- str_getcsv - CSV 文字列をパースして配列に格納する
- str_ireplace - 大文字小文字を区別しない str_replace
- str_pad - 文字列を固定長の他の文字列で埋める
- str_repeat - 文字列を反復する
- str_replace - 検索文字列に一致したすべての文字列を置換する
- str_rot13 - 文字列に rot13 変換を行う
- str_shuffle - 文字列をランダムにシャッフルする
- str_split - 文字列を配列に変換する
- str_word_count - 文字列に使用されている単語についての情報を返す
- strcasecmp - 大文字小文字を区別しないバイナリセーフな文字列比較を行う
- strchr - strstr のエイリアス
- strcmp - バイナリセーフな文字列比較
- strcoll - ロケールに基づく文字列比較
- strcspn - マスクにマッチしない最初のセグメントの長さを返す
- strip_tags - 文字列から HTML および PHP タグを取り除く
- stripcslashes - addcslashes でクォートされた文字列をアンクォートする
- stripos - 大文字小文字を区別せずに文字列が最初に現れる位置を探す
- stripslashes - クォートされた文字列のクォート部分を取り除く
- stristr - 大文字小文字を区別しない strstr
- strlen - 文字列の長さを得る
- strnatcasecmp - "自然順"アルゴリズムにより大文字小文字を区別しない文字列比較を行う
- strnatcmp - "自然順"アルゴリズムにより文字列比較を行う
- strncasecmp - バイナリセーフで大文字小文字を区別しない文字列比較を、最初の n 文字について行う
- strncmp - 最初の n 文字についてバイナリセーフな文字列比較を行う
- strpbrk - 文字列の中から任意の文字を探す
- strpos - 文字列が最初に現れる場所を見つける
- strrchr - 文字列中に文字が最後に現れる場所を取得する
- strrev - 文字列を逆順にする
- strripos - 文字列中で、特定の(大文字小文字を区別しない)文字列が最後に現れた位置を探す
- strrpos - 文字列中に、ある文字が最後に現れる場所を探す
- strspn - マスクに一致する最初のセグメントの長さを返す
- strstr - 文字列が最初に現れる位置を見つける
- strtok - 文字列をトークンに分割する
- strtolower - 文字列を小文字にする
- strtoupper - 文字列を大文字にする
- strtr - 特定の文字を変換する
- substr_compare - 指定した位置から指定した長さの 2 つの文字列について、バイナリ対応で比較する
- substr_count - 副文字列の出現回数を数える
- substr_replace - 文字列の一部を置換する
- substr - 文字列の一部分を返す
- trim - 文字列の先頭および末尾にあるホワイトスペースを取り除く
- ucfirst - 文字列の最初の文字を大文字にする
- ucwords - 文字列の各単語の最初の文字を大文字にする
- vfprintf - フォーマットされた文字列をストリームに書き込む
- vprintf - フォーマットされた文字列を出力する
- vsprintf - フォーマットされた文字列を返す
- wordwrap - 文字列分割文字を使用して、指定した文字数に文字列を分割する
(私的)コーディング規約
後で変更するかもしれないが、とりあえず以下のきまりを決めておく。
- 変数名の先頭は小文字を使う。
- 定数の変数名は大文字を使う。
値渡しと参照渡し
デフォルトでは変数に変数を代入すると値渡しとなる。
$foo="abc"; $bar=$foo; $foo="def"; print "\$bar={$bar}\n";
参照渡しにするには&をつける。
$bar=&$foo;
変数のスコープ
変数のスコープは以下の3種類がある。
- 関数の外で使用される変数は通常グローバルスコープとなり関数の中では未定義となる。
- 関数の中で使用されるか変数は通常ローカルスコープとなり関数の外では未定義となる。
-
関数の中でも使用できるグローバル変数、スーパーグローバルという組み込みの変数が存在する。
$GLOBALS ,$_SERVER ,$_GET ,$_POST ,$_FILES ,$_COOKIE ,$_SESSION ,$_REQUEST ,$_ENV
関数の中でグローバル変数を使うにはglobalキーワードを使う方法とスーパーグローバル変数$GLOBALSを使う方法がある。
$foo='$fooはグローバル変数です。'; $bar='$barはグローバル変数です。'; func1(); echo "{$bar}<br />"; func2(); function func1(){ global $foo,$bar; echo "{$foo}<br />"; $bar="\$barの値は変更されました。"; } function func2(){ echo $GLOBALS["foo"] , "<br />"; }
変数が定義されているかどうかはisset関数で調べる事ができる。
$foo="abc"; function func(){ if (isset($foo)) { echo '$fooは定義されています。'; }else{ echo '$fooは定義されていません。'; } $bar="def"; if (isset($bar)) { echo '$barは定義されています。'; }else{ echo '$barは定義されていません。'; } } func();
JavaServletには、pageスコープ、requestスコープ、sessionスコープ、applicationスコープの4つのスコープがあります。
phpではpageスコープは通常の変数,requestスコープは$_GET ,$_POST ,$_REQUEST変数、sessionスコープは$_SESSIONで実現できますが、applicationスコープに該当する変数は無いようです。($_SERVER変数に値を代入してページ間で値を共有する事はできないようです。)
セッション変数
-
セッションを開始する。
ブラウザに文字列を出力する前に実行する必要がある。
生成されたセッションを復元する(他のphpページ保存されたセッション変数を取り出す)場合にもsession_strat()関数を実行する必要がある。 -
セッション変数の値の設定と取得
スーパーグローバル変数$_SESSIONにより値の設定,取得をおこなう。 -
セッションの破棄
session_destroy()関数を使用する。
以下の例は他のphpページで保存されたセッションスコープとリクエストスコープの変数を取得する例です。
input.php
<?php session_start(); # session_startはブラウザに文字列を出力する前に実行する必要がある。 ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>input.php</title> </head> <body> <?php $_SESSION["ses"]="xxx"; ?> <form action="output.php"> <input type="submit" name="button" value="button_value"> </form> </body> </html>
output.php
<?php session_start(); # session_startはブラウザに文字列を出力する前に実行する必要がある。 ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>output.php</title> </head> <body> <?php echo $_SESSION["ses"],"<br />"; echo $_REQUEST["button"],"<br />"; ?> </body> </html>
複雑なフォーム変数とリクエスト変数
PHPマニュアルページに載っていた「複雑なフォーム変数」の例とその実行結果を以下に示す。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <?php if ($_POST) { echo '<pre>'; echoo $_POST[personal]['name'],"\n"; echo htmlspecialchars(print_r($_POST, true)); echo '</pre>'; } ?> <form action="" method="post"> Name: <input type="text" name="personal[name]" /><br /> Email: <input type="text" name="personal[email]" /><br /> Beer: <br /> <select multiple name="beer[]"> <option value="warthog">Warthog</option> <option value="guinness">Guinness</option> <option value="stuttgarter">Stuttgarter Schwabenbrau</option> </select><br /> <input type="submit" value="submit me!" /> </form> </body> </html>
クッキー
クッキーの送信
クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要がある。
setcookie("hogi", 'hogi_value', time()+60*60*24*7); // 有効期限は7日間,有効期限は秒単位で指定する。
有効期限は省略可能。
有効期限に0 を設定したり省略したりした場合は、クッキーはセッションの最後 (ブラウザを閉じるとき) が有効期限となる。
setcookie("hoge", 'hoge_value');
配列として送信する事もできる。
setcookie("fuga[foo]", 'fuga_foo_value');
クッキー値を参照するにはクッキー送信時の次のページのロードから $_COOKIE変数にて参照できる。
echo $_COOKIE["hogi"],"<br />"; echo $_COOKIE["hoge"],"<br />"; echo $_COOKIE["fuga"]['foo'],"<br />";
クッキーを削除するには有効期限を過去に設定する。
setcookie("hogi", '', time()-3600);
静的変数
C言語と同様に関数内にstaic変数を定義できる。
function counter_func(){ static $cnt=0; $cnt++; return $cnt; } for($i=0;$i<10;$i++){ $result=counter_func(); } print $result;
値の代入と表示とTRUE,FALSE,NULLの扱い
TRUE,FALSE,NULLは大文字小文字に依存しない。
TRUEをechoで表示すると1を,FALSE,NULLをechoで表示すると空文字を出力します。
NULLは値を持たないことを表す。
$foo=true; echo "$foo<br />"; // TRUEは1を出力 $bar=tRUe; echo "$bar<br />"; // これも1を出力 $baz=fAlSe; echo "$baz<br />"; // 空文字を出力 $hogi=abc; // 任意の半角文字は文字列を代入 echo "$hogi<br />"; // 半角文字は文字列と解釈 $hoge=123; // 任意の数値を代入 echo "$hoge<br />"; // 当然、数値として認識 // $xxx=全角; // 全角文字は引用符で囲まないとエラーとなる。 $fuga=nULl; echo is_null($fuga),"<br />"; // $fugaはNULLなのでTRUE,従って1を出力 echo "$fuga<br />"; // NULLは空文字を出力 var_dump((bool) $fuga); // NULLはFALSEとみなされる
変数と型に関する操作
型を強制的に他の型に変換したい場合、変数を キャスト するか、 settype() 関数を使う。
settype() は変換に成功するとTRUE、失敗するとFALSEを返す。
settype() - 変数の型をセットする
gettype - 変数の型を取得する
var_dump - 変数に関する情報をダンプする 。
isset - 変数がセットされていること、そして NULL でないことを検査する(変数が存在すればTRUE、 そうでなければFALSEを返す。)
empty - 変数が空であるかどうかを検査する(空でないか、0でない値であれば FALSE を返す。)
unset - 指定した変数の割当を解除する
is_array() - 変数が配列かどうかを検査する
is_bool() - 変数が boolean であるかを調べる
is_float() - 変数の型が float かどうか調べる
is_int() - 変数が整数型かどうかを検査する
is_null() - 変数が NULL かどうか調べる
is_numeric() - 変数が数字または数値形式の文字列であるかを調べる
is_object() - 変数がオブジェクトかどうかを検査する
is_resource() - 変数がリソースかどうかを調べる
is_scalar() - 変数がスカラかどうかを調べる
is_string() - 変数の型が文字列かどうかを調べる
function_exists() - 指定した関数が定義されている場合に TRUE を返す
method_exists() - クラスメソッドが存在するかどうかを確認する
PHPの型にはクラスのインスタンスを示すオブジェクト型,cのファイルハンドルなどを示すリソース型およびNULL型も存在する。
配列
PHPの配列は通常の配列と連想配列を区別なく扱う。
配列は「$変数名[キー]=値」で扱う事ができる。
キー値として文字列または整数値を指定する。
値はどの型でも指定できる。これにより異なった型の値を処理する事ができる。
キーを省略した場合、整数添字の最大値が使用され、 新しいキーはその最大値 +1 となる。
整数値は負の数とすることができ、 負の添字についても同様となる。
例えば、最高時の添字が -6 の場合、次のキーは -5 となる。
整数添字がまだ存在しない場合、キーは 0 (ゼロ) とる。
print_r関数を使用すると指定した変数に関する情報を解りやすく出力する事ができる 。
$arr = array( "foo", "bar","baz" ); // 自動的に0からの数値キーの配列になる。 // $arr[0] => "foo" , $arr[1] => "bar", $arr[2] => "baz" ) print_r($arr); $arr_hash = array("foo" => "bar", 3 => true, "xxx" => 99); // 数値キーと文字列キーの混在 // キーとして TRUE を使用した場合、 整数型の 1 がキーとして解釈される。 // $arr_hash["foo"] => "bar", $arr_hash[3] => 1, $arr_hash["xxx"] => 99 print_r($arr_hash); $arr2 = array(3.33 => true); // 3.33は整数値に自動的に変換される。 // $arr[3] => 1 print_r($arr2); $arr_hash = array("foo" => "bar", -1 => true, "xxx" => "yyy"); $arr_hash[]="abc"; // $arr_hash[0] => "abc" (キーはその最大値 +1) print_r($arr_hash);
特定のキー/値の組を削除したい場合には、 unset() を使う
unset($arr[2]); // 配列から要素を削除する unset($arr); // 配列全体を削除する
配列の要素を繰り返し処理するのに制御構造としてforeachを使うと便利。
$arr = array( "foo", "bar","baz" );
foreach ($arr as $key => $value) {
echo "\$arr[$key] => {$value}<br />";
}
PHP 5 以降では、配列を参照渡しすることでその値を直接変更できる。
$arr = array( "foo", "bar","baz" ); foreach ($arr as &$value) { $value = strtoupper($value); } // $arr[0] => "FOO", $arr[1] => "BAR". $arr[2] => "BAZ" print_r($arr);
配列への代入は、通常の代入と同様に値がコピーされる。
配列をリファレンスでコピーする場合には、 リファレンス演算子を使う。
配列に関する関数には以下のものがある。
- array_change_key_case - 配列のすべてのキーを変更する
- array_chunk - 配列を分割する
- array_combine - 一方の配列をキーとして、もう一方の配列を値として、ひとつの配列を生成する
- array_count_values - 配列の値の数を数える
- array_diff_assoc - 追加された添字の確認を含めて配列の差を計算する
- array_diff_key - キーを基準にして配列の差を計算する
- array_diff_uassoc - ユーザが指定したコールバック関数を利用し、 追加された添字の確認を含めて配列の差を計算する
- array_diff_ukey - キーを基準にし、コールバック関数を用いて配列の差を計算する
- array_diff - 配列の差を計算する
- array_fill_keys - キーを指定して、配列を値で埋める
- array_fill - 配列を指定した値で埋める
- array_filter - コールバック関数を使用して、配列の要素をフィルタリングする
- array_flip - 配列のキーと値を反転する
- array_intersect_assoc - 追加された添字の確認も含めて配列の共通項を確認する
- array_intersect_key - キーを基準にして配列の共通項を計算する
- array_intersect_uassoc - 追加された添字の確認も含め、コールバック関数を用いて 配列の共通項を確認する
- array_intersect_ukey - キーを基準にし、コールバック関数を用いて 配列の共通項を計算する
- array_intersect - 配列の共通項を計算する
- array_key_exists - 指定したキーまたは添字が配列にあるかどうかを調べる
- array_keys - 配列のキーをすべて返す
- array_map - 指定した配列の要素にコールバック関数を適用する
- array_merge_recursive - 二つ以上の配列を再帰的にマージする
- array_merge - ひとつまたは複数の配列をマージする
- array_multisort - 複数の多次元の配列をソートする
- array_pad - 指定長、指定した値で配列を埋める
- array_pop - 配列の末尾から要素を取り除く
- array_product - 配列の値の積を計算する
- array_push - 一つ以上の要素を配列の最後に追加する
- array_rand - 配列から一つ以上の要素をランダムに取得する
- array_reduce - コールバック関数を用いて配列を普通の値に変更することにより、配列を再帰的に減らす
- array_replace_recursive - 渡された配列の要素を再帰的に置き換える
- array_replace - 渡された配列の要素を置き換える
- array_reverse - 要素を逆順にした配列を返す
- array_search - 指定した値を配列で検索し、見つかった場合に対応するキーを返す
- array_shift - 配列の先頭から要素を一つ取り出す
- array_slice - 配列の一部を展開する
- array_splice - 配列の一部を削除し、他の要素で置換する
- array_sum - 配列の中の値の合計を計算する
- array_udiff_assoc - データの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
- array_udiff_uassoc - データと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
- array_udiff - データの比較にコールバック関数を用い、配列の差を計算する
- array_uintersect_assoc - データの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
- array_uintersect_uassoc - データと添字の比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
- array_uintersect - データの比較にコールバック関数を用い、配列の共通項を計算する
- array_unique - 配列から重複した値を削除する
- array_unshift - 一つ以上の要素を配列の最初に加える
- array_values - 配列の全ての値を返す
- array_walk_recursive - 配列の全ての要素に、ユーザー関数を再帰的に適用する
- array_walk - 配列の全ての要素にユーザ関数を適用する
- array - 配列を生成する
- arsort - 連想キーと要素との関係を維持しつつ配列を逆順にソートする
- asort - 連想キーと要素との関係を維持しつつ配列をソートする
- compact - 変数名とその値から配列を作成する
- count - 変数に含まれるすべての要素、 あるいはオブジェクトに含まれるプロパティの数を数える
- current - 配列内の現在の要素を返す
- each - 配列から現在のキーと値のペアを返して、カーソルを進める
- end - 配列の内部ポインタを最終要素にセットする
- extract - 配列からシンボルテーブルに変数をインポートする
- in_array - 配列に値があるかチェックする
- key - 配列からキーを取り出す
- krsort - 配列をキーで逆順にソートする
- ksort - 配列をキーでソートする
- list - 配列と同様の形式で、複数の変数への代入を行う
- natcasesort - 大文字小文字を区別しない"自然順"アルゴリズムを用いて配列をソートする
- natsort - "自然順"アルゴリズムで配列をソートする
- next - 内部配列ポインタを進める
- pos - current のエイリアス
- prev - 内部の配列ポインタをひとつ前に戻す
- range - ある範囲の整数を有する配列を作成する
- reset - 配列の内部ポインタを先頭の要素にセットする
- rsort - 配列を逆順にソートする
- shuffle - 配列をシャッフルする
- sizeof - count のエイリアス
- sort - 配列をソートする
- uasort - ユーザ定義の比較関数で配列をソートし、連想インデックスを保持する
- uksort - ユーザ定義の比較関数を用いて、キーで配列をソートする
- usort - ユーザー定義の比較関数を使用して、配列を値でソートする
式と演算子
通常の比較演算子のほかに厳密な等価演算子: === (イコールかつ同じ型) そして !== (イコールではないまたは型が違う) も サポートされている。
式の前に付けた場合、 その式により生成されたエラーメッセージは無視される エラー制御演算子(@)もサポートされている。(あまり使う事お無いと思うが)
PerlやシェルスクリプトのようPerlやシェルスクリプトのように実行演算子、バッククォート (``) をサポートされている。
バッククオート演算子は、セーフモード が有効な場合 もしくは shell_exec() が無効な場合は無効となる。 capeshellcmd(), exec(), passthru(), popen(), shell_exec(), system()などの関数も用意されている。
windows環境のxamppでこの機能を実行した例を以下に示します。
windowsではSHIFT-JISの文字列を返すため文字コードとしてSHIFT-JISを指定しています。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift-jis"> <title>Insert title here</title> </head> <body> <?php $output = `dir /w`; echo "<pre>"; echo $output; echo shell_exec('tree C:\xampp\htdocs\xampp'); echo "</pre>"; ?> </body> </html>
&&や||も使えるがPerlのように論理演算子としてand,or,xorも使える。
配列演算子も使える。
$a + $b ,$a == $b , $a === $b( $a および $b のキー/値のペアが等しく、その並び順が等しく、 かつデータ型も等しい場合に TRUE。) , $a != $b ,$a <> $b ,$a !== $b
// 配列の加算 $a = array("a" => "apple", "b" => "banana"); $b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); $c =$a + $b; // $c[a] => apple. $c[b] => banana, $c[c] => cherry // 既に存在する要素については上書きされない。 print_r($c);
文字列を文字の配列のように、角括弧の後に任意の文字をゼロから始まるオフセットで指定することにより、 文字列内の文字にアクセス/修正することが可能。
$s = 'hello';
for ($i=0; $i<strlen";
}
型演算子instanceof を使用して、 ある PHP 変数が特定の クラス のオブジェクトのインスタンスであるかどうかを調べる事ができる。
instanceof演算子はスーパクラスやインターフェースおよび別のオブジェクトや文字列変数を使用することもできる。
継承関係(子クラス)にあればTRUEを返す。 get_class()関数を使うとオブジェクトのクラス名を得instanceof 演算子は PHP 5 から使用可能。
以下の例ではすべてTRUEを返す。
class MyClass extends ParentClass { } $a = new MyClass; var_dump($a instanceof MyClass); $b="MyClass"; // 文字列でクラス名を指定 var_dump($a instanceof $b); $c = new MyClass; // オブジェクトを指定 var_dump($a instanceof $c); class ParentClass { } // スーパクラスを指定 var_dump($a instanceof ParentClass); interface MyInterface { } class MyClass2 implements MyInterface { } $x = new MyClass2; // インターフェースを指定 var_dump($c instanceof MyInterface);
制御構造
C言語と同様にしてif/else if/else,while ,do-while ,for ,goto ,switch ,break ,continueの構文を使用できる。
制御構造には波括弧を endif;,endwhile;, endfor;,endforeach;, endswitch;に変更した 別の構文が存在するが、まぎらわしいだけで波括弧を使った方がC言語と同じで構文となるのでこれらの構文は使わない方が良いと思う。
elseifというキーワードも存在するがまぎらわしいのでこれも私は使いたくない。
else ifは言語ごとに微妙な違いが存在する。(『else if』綴りの微妙な違いを参照,下記に転記しておく。)
- 『else if』:C言語,JavaScript,Java,C++(続に言うC系言語) rl,Ruby
- 『elseif』:VB,PHP
- 『elif』:sh,Python
forループで配列を操作する場合は
for($i = 0; $i < sizeof($people); ++$i)
よりも
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
の方が実行速度が速くなる。
配列の要素を操作するのに便利な制御構造foreachがある。
- 配列の要素の値をを一つずつ取り出す foreach ($arr as $value)
- 配列の要素のキーと値をを一つずつ取り出す foreach ($arr as $key => $value)
- 配列の要素を照渡しで一つずつ取り出す(PHP 5 以降) foreach ($arr as &$value)
switch文はcase式に、スカラー型に式を評価する 任意の式、つまり、整数、浮動小数点、文字列を使う事ができる点が異なる。
break とcontinue はオプションの引数で 処理をスキップするループ構造のレベルの数を指定する事もできる点がc言語と異なる。
PHP 5.3 以降はgoto 演算子もサポートされていますがあまり使わない方が良いでしょう。
ファイルのインクルード
ファイルのインクルードにはrequireとinclude,require_once とinclude_once がある。
ファイルのインクルードは、指定されたパスから行います。
パスを指定しない場合は、 include_path で指定されているパスより対象のファイルを探す。
絶対パス,相対パスを指定する事もできる。
パスを指定した場合は、 include_path は無視される。
requireとincludeの違いは読み込みに失敗した場合にrequireとrequire_onceはエラーで処理を停止するのに対して、
includeとinclude_onceではWarningを出力して処理は続行する事でその他の違いは無い。
require,includeとrequire_once ,include_onceとの違いは、
require,includeが指定されるたびに何回もファイルを読み込むのに対して、
require_once ,include_onceは、すでに読み込まれている場合はそのファイルを読み込みまない。
関数の定義を読み込む場合は、同じ関数定義を何回も読み込むとエラーとなってしまうので、require_once またはinclude_onceを使う。
ファイルが読み込まれるときには、 読み込まれるファイルの先頭で PHPモードを抜けてHTMLモードになり、最後に再びPHPモードに戻るので、 読み込むファイル中のPHPコードとして実行する必要がある コードは、 有効なPHPの開始タグおよび終了タグで括る必要がある。
vars.php <h2>include file</h2> <hr /> <?php $color = 'green'; $fruit = 'apple'; ?> vars.phpをインクルードするphpファイル <?php include 'vars.php'; echo "A $color $fruit"; // A green apple ?>
読み込まれたファイル内では、ファイルの実行処理を終了し呼出側の スクリプトに戻るためにreturn()文を実行することが可能で、 読み込まれたファイルから値を返すことができる。
スクリプト中で自動的にファイルをインクルードするにはphp.ini の auto_prepend_file および auto_append_file オプションがある。
関数
phpの関数定義の構文はJavaScriptのようにfunctionキーワードを使う。
関数の中では、他の関数や クラス 定義 を含む PHP のあらゆる有効なコードを使用することがでる。
PHP では、関数は参照される前に定義されている必要はない。
ただし、ある条件下でのみ関数が定義される場合(関数の中で別の関数を定義されている場合を含む)には、その関数定義は関数がコールされる前に 行われていなければならない。
関数やクラスはすべてグローバルスコープにあり - 関数の内部で定義したものであっても関数の外部からコールできる。
このため、条件下でのみ関数を定義する事に利用価値は無いと思う。
関数名は大文字小文字を区別しない。
関数を再帰的にコールすることが可能だが、100 から 200 を超えるような再帰呼び出しは スタックが破壊される危険があるため避けるべき。
function_exists関数を使って指定した関数が定義されているかどうか知る事ができる。
内部(ビルトイン)関数
バージョンや拡張機能などによって使用できる関数には違いがある。
拡張機能のON/OFFはphpinfo()関数またはget_loaded_extensions()関数で調べる事ができる。
現在使用できる関数はget_defined_functions()関数で確認できる。
参照渡しで引数を渡す事もできる。
// 参照渡しで引数を渡す関数の例 function some_func(&$arg) { // 引数に別の値を代入すると呼び出し元の変数もその値になる。 $arg="別の値"; } $foo="元の値"; some_func($foo); echo $foo;
デフォルト引数値を指定する事もできる。
配列および特殊な型 NULL をデフォルト値とすることも可能。
デフォルト値は、定数式である必要があり、 (例えば) 変数やクラスのメンバーであってはならない。
引数のデフォルト値を使用する際には、デフォルト値を有する引数はデ フォルト値がない引数の右側に全てある必要がある。
// 関数の引数にデフォルト引数値を指定した例 function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL) { $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker; return "Making a cup of ".join(", ", $types)." with $device.\n"; } echo makecoffee(); echo makecoffee(array("cappuccino", "lavazza"), "teapot");
可変長引数に関して特別な構文は必要としない。
引数リストは従来と同様に関数定義で明示的に指定することができ、 動作も従来と変わらない。
関数定義の引数リストで指定した引数より少ない引数を指定した場合はエラーになる。
関数の中で可変長引数にアクセスするには func_num_args(), func_get_arg(), func_get_args() 関数を使用する。
- func_get_arg - 引数のリストから要素をひとつ返す
- func_get_args - 関数の引数リストを配列として返す
- func_num_args - 関数に渡された引数の数を返す
// 可変長引数リストの例 function foo($arg1) { // func_num_args()とfunc_get_arg()関数を使って可変長引数にアクセスする。 $args_length=func_num_args(); //引数の数を出 for($i=0;$i<$args_length;$i++) printf("%d番目の引数:%s<br />",$i,func_get_arg($i)); echo "\$arg1={$arg1}<br />"; // func_get_args()関数を使って可変長引数にアクセスする。 $args=func_get_args(); foreach ($args as $key => $value) { echo "\$args[$key] => {$value}<br />"; } } foo("a","b","c"); // foo(); 関数定義の引数リストの中で指定した引数より少ない引数を指定した場合はエラーになる。
arrayとlistを使って複数の値を返す関数の例を以下に示します。
function math_operate($a,$b) { return array ($a+$b, $a-$b, $a*$b, $a/$b); } $a=2; $b=3; list ($add, $sub, $mul, $div) = math_operate($a, $b); echo "{$a}+{$b}={$add}<br />"; echo "{$a}-{$b}={$sub}<br />"; echo "{$a}*{$b}={$mul}<br />"; echo "{$a}/{$b}={$div}<br />";
関数からリファレンスを返すには、リファレンス演算子 & を関数宣 言部および変数への返り値を代入する際の両方で使用する。
function &returns_reference() { return $someref; } $newref =& returns_reference();
可変関数
変数に関数名の文字列を代入する事により、変数名の後に括弧が付いて関数を呼び出すことができる。
この機能は、コールバック、関数テーブル等を実装するために使用できる。 オブジェクトのメソッドを可変関数を使ってコールすることもできる。
// 可変関数の例 function foo($name) { return "hello $name"; } $bar="foo"; echo $bar("Mr. Brown"),"<br />"; //可変メソッドの例 class Baz { private $name="Baz"; function BazMethod() { return "hello " . $this->name; } } $hogi = new Baz(); $bar = "BazMethod"; echo $hogi->$bar(),"<br />";
無名関数
PHP 5.3.0 以降からJavaScriptのように無名関数を関数の引数として渡したり、変数に代入できるようになった。
無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できる。
コールバック パラメータとして使う際に便利だが、用途はそれだけにとどまらない。
クロージャは、変数の値として使用することもでる。
PHP は、そのような記述があると自動的に内部クラス Closure のインスタンスに変換する。
変数へのクロージャの代入は、他の代入と同じように記述し、 同じく最後にセミコロンをつける。
5.3以前のバージョンでもcreate_function を使って無名関数を作成する事もできる。
// コールバック関数を引数にとる関数の実装例 function operate_func($a,$b,$func){ return call_user_func($func,$a,$b); } // 無名関数をコールバックパラメータとして関数に渡す。 echo operate_func(2, 3, function($a,$b){ return $a+$b;}); // 無名関数の変数への代入 $func=function($a,$b){ return $a+$b;}; echo $func(4,5); // 変数に代入した無名関数をコールバックパラメータとして関数に渡す。 echo operate_func(5,6,$func); // create_function関数による匿名関数の例 $func2 = create_function('$a,$b', 'return $a+$b;'); echo $func2(7,8);
クロージャは、変数を親のスコープから引き継ぐことができる。
引き継ぐ変数は、関数のヘッダで宣言しなければならない。(useキーワード)
親のスコープからの変数の引き継ぎは、グローバル変数を使うのとは異る。
グローバル変数は、 関数が実行されるかどうかにかかわらずグローバルスコープに存在する。
クロージャの親スコープは、クロージャが宣言されている関数となる (関数の呼び出し元のスコープである必要はない)。
// クロージャのスコープ function foo($bar) { return function ($baz) use ($bar) { return $bar . $baz; }; } $a_func=foo("a_head"); $b_func=foo("b_head"); echo $a_func("a_tail"); echo $b_func("b_tail");
callback(コールバック関数)
関数の引数として他の関数を指定する事ができる。
call_user_func() や usort() 等の関数は、ユーザが定義するコールバック関数を引数として受け入る。
コールバック関数は、単純な関数だけでなく、オブジェクトのメソッド あるいはクラスの静的メソッドであってもかまわない。
PHP 関数はその名前を単に文字列として渡される。(可変関数)
どのようなビルトインまたはユーザ定義の関数も渡すことができる。
オブジェクトのインスタンスを渡すための方法の 1 つは、 オブジェクトを 0 番目の要素、 メソッド名を 1 番目の要素として含む配列を渡すことである。
静的なクラスメソッドの場合、 0 番目の要素としてオブジェクトを渡す代わりにクラス名を渡すことにより、 オブジェクトのインスタンスを作成せずに渡すことができる。
一般的なユーザ定義関数とは異なり、create_function() では無名コールバック関数を作成することができる。PHP 5.3.0 以降は、 クロージャ(無名関数) を callback パラメータに渡せるようになった。
// コールバック関数の例 function add($a,$b){ return $a+$b; }; // コールバックメソッドの例 class MyClass { static private $a=2; static private $b=3; static function myCallbackMethod() { return self::$a+self::$b; } } // タイプ 1: 単純なコールバック echo call_user_func('add', 3, 4); // タイプ 2: 静的クラスメソッドのコール echo call_user_func(array('MyClass', 'myCallbackMethod')); // タイプ 3: オブジェクトメソッドのコール $obj = new MyClass(); echo call_user_func(array($obj, 'myCallbackMethod')); // タイプ 4: 静的クラスメソッドのコール (PHP 5.2.3 以降) echo call_user_func('MyClass::myCallbackMethod'); // タイプ 5: 相対指定による静的クラスメソッドのコール (PHP 5.3.0 以降) class A { public static function who() { echo "A\n"; } } class B extends A { public static function who() { echo "B\n"; } } call_user_func(array('B', 'parent::who')); // A
関数処理関数として以下のものがある。
- call_user_func_array - パラメータの配列を指定してユーザ関数をコールする
- call_user_func - 最初の引数で指定したユーザ関数をコールする
- create_function - 匿名関数 (ラムダ形式) を作成する
- forward_static_call_array - 静的メソッドをコールし、引数を配列で渡す
- forward_static_call - 静的メソッドをコールする
- func_get_arg - 引数のリストから要素をひとつ返す
- func_get_args - 関数の引数リストを配列として返す
- func_num_args - 関数に渡された引数の数を返す
- function_exists - 指定した関数が定義されている場合に TRUE を返す
- get_defined_functions - 定義済みの全ての関数を配列で返す
- register_shutdown_function - シャットダウン時に実行する関数を登録する
- register_tick_function - 各 tick で実行する関数を登録する
- unregister_tick_function - 各 tick の実行用の関数の登録を解除する