PHP

下位ページ

リンク

覚えておくこと

  • 関数名の大文字と小文字を区別しない。
    Bar() bar() bAr() などはすべて同じ関数と解釈されるため共存できない。

インストール

指定されたモジュールが見つかりません。が連発

php5.2.5あたりのエラー?
php.iniの

extension=php_bz2.dll

から

extension=php_zlib_filter.dll

までをコメントアウトするとエラーが消えた。

実行

コマンドラインオプション

Usage: php [オプション] <file>
オプション意味
-aインタラクティブモード。対話形式のインターフェースでコードを実行できる。
-c <path>指定したディレクトリの php.ini を読み込んで実行する。
-d foo[=bar]php.ini の定義を個別に指定して実行する。fooが名前、barが値。barが省略された場合は 1
-eデバッガ/プロファイラ用の拡張情報を出力する。
-f <file>対象のファイルを指定する(省略可能)
-hこのヘルプメッセージ(英語)
-iPHP の各種情報を表示する。phpinfo() と同等
-l実行はせず、構文チェックのみ行う
-mShow compiled in modules
-nphp.ini を読み込まずに実行する。
-sソースコードを色付き強調されたHTML形式で表示する。
-vPHP バージョンを表示する
-z <file>Zendエクステンションとしてファイルを読み込む。
-Cスクリプトのディレクトリへ chdir しない(CGIの場合のみ)
-qサイレントモード。HTTPヘッダの出力を抑制する(CGIの場合のみ)

Win系のコマンドラインからのスクリプト実行

  • rオプションからの実行
    php -r "echo 'Hello World!';"
    コードの最初と最後に " が必要なため、コード内でダブルクォーテーションで囲んだエスケープシーケンスが使えない。
  • ソース直記述
    php
    のみでコマンドを実行すると以降はソースと解釈する。
    ソースと書いた後に CTRL+Z を押すと ^Zのような文字が出る。
    echo "Hello World!";
    ^Z
    さらにエンターを押すと、コードトの終了と解釈してそこまでの内容を実行する。
    この書き方だとダブルクオートや文字数の制限を受けない。

秀丸のマクロから実行と構文チェック

  • 実行
    run "cmd /C php \"%f\" && pause";
    この文を run_php.mac として保存して秀丸のメニューから
    マクロ>マクロ登録 で画面を開きタイトル「php実行」
    ファイル名を [...] ボタンから先ほど作ったファイルを登録しOKボタンを押す。
    メニューのマクロ>php実行 を選べばコマンドプロンプトが開き実行結果が表示される。
    ファンクションキーなどに登録しておけば即座に実行できる。
  • 構文チェック
    run "cmd /C php -l \"%f\" && pause";
    この文を run_lint.mac として保存して秀丸のメニューから
    マクロ>マクロ登録 で画面を開きタイトル「php構文チェック」
    ファイル名を同様に選んで登録。

safe-mode(廃止)

ver5で非推奨となり5.4.0で削除された。

コマンドライン引数の取得

$argv[0] にコマンド名、それ以降に引数が順にセットされる。

<?php
var_dump($argv);
?>

getopt コマンドライン引数を解釈して返す

5.3.0移行はWindowsでも動作。

<?php
$a = getopt('a::b:cd');
var_dump($a);
?>
  • 実行結果
    array(4) {
      ["a"]=>
      bool(false)
      ["b"]=>
      string(2) "-c"
      ["d"]=>
      bool(false)
      ["e"]=>
      bool(false)
    }
  • 意味
    • a::
      値も付けられるスイッチとして設定。
      a=0 で0がセットされ、値がない場合falseがセットされる。
    • b:
      必ず値を含むスイッチとして設定。
      b=1 で1がセットされ、値の設定のない「b」のみの場合は次の引数が値としてセットされる。
    • cd
      単独のスイッチとして設定。スイッチがある場合は値がfalse、ない場合はキーごと未定義。=
    • それ以外
      引数を渡しても除外される(-e -f -gなど)

PEAR

  • PEARパッケージのインストール
    pear install パッケージ名
    パッケージ名の / は _ で記述する( aaa/bbb → aaa_bbb )

演算子

名前構文意味
算術演算子$a + $b加算
$a - $b減算
$a * $b乗算
$a / $b除算
$a % $b剰余(除算の余り)
$a = $b++$a = $b; $b = $b + 1; と等価
$a = $b--$a = $b; $b = $b - 1; と等価
$a = ++$b$b = $b + 1; $a = $b; と等価
$a = --$b$b = $b - 1; $a = $b; と等価
配列演算子$a + $b配列$aと$bを結合する。同じキーは$aの値が保持される
$a == $b配列$aと$bのキーと値が等価
$a != $b
$a <> $b
上記条件を満たさない
$a === $b配列$aと$bのキーと値が等価でかつ、並びが同じでデータ型も同じ
$a !== $b上記条件を満たさない
比較演算子$a < $b
$a <= $b
$a == $b等価(値が同じ)
$a != $b
$a <> $b
不等価(値が違う)
$a === $b等価(データ型と値が同じ/型変換を行わない)
$a !== $b不等価(データ型か値が違う/型変換を行わない)
$a > $b
$a >= $b
論理演算子$a and $b
$a && $b
真偽値のAND演算
$a or $b
$a || $b
真偽値のOR演算
$a xor $b真偽値のXOR演算
! $a真偽値の否定(反転)
ビット演算子$a & $bビットごとのAND演算
$a | $bビットごとのOR演算
$a ^ $bビットごとのXOR演算
~ $aビットごとの否定(反転)
$a << $b$aを上位に$bビットシフト
32ビット以上のシフトは行わないこと
$a >> $b$aを下位に$bビットシフト
32ビット以上のシフトは行わないこと
エラー演算子@関数や変数の前につけ、エラーが発生しても無視する
三項演算子式 ? 条件1 : 条件2式が真なら条件1を評価し、偽なら条件2を評価する
文字列演算子$a . $b文字列の結合
複合演算子$a += $b$a = $a + $b と等価
$a -= $b$a = $a - $b と等価
$a *= $b$a = $a * $b と等価
$a /= $b$a = $a / $b と等価
$a %= $b$a = $a % $b と等価
$a .= $b$a = $a . $b と等価

制御構文

条件分岐

if 文
if( 条件式 )
	echo "TRUE\n";	// 真の時 ; までが実行される

if( 条件式 ){
	echo "TRUE\n";	// 真の時 {} 内のブロックが実行される
}
if 〜 elseif 〜 else 文
if( 条件式 ){		// 真の時 { } 内が実行される
	echo "TRUE\n";
}elseif( 条件式2 ){	// 真の時 { } 内が実行される
	echo "TRUE 2\n";
}else{			// すべて偽の時 { } 内が実行される
	echo "ALL FALSE\n";
}
switch 〜 case 文
switch ( 値 ) {	//値が case と一致した時にその条件に分岐
	case 0 :
		echo "0\n";
		break;	//break でブロック内から脱出
	case 1 :
		echo "1\n";
		break;
}

switch ( 値 ) {	//値が case と一致した時にその条件に分岐
	case 0 :
		echo "0\n";
		break;	//break でブロック内から脱出
	case 1 :
		echo "1\n";
		break;
	default :	//上記のどの条件にも当てはまらなければ default に分岐
		echo "others\n";
}

case を複数併用
switch ( 値 ) {	//値が case と一致した時にその条件に分岐
	case 0 :
	case 1 :
	case 2 :
	case 3 :
	case 4 :
	case 5 :
		echo "0〜5\n";
		break;	//break までが実行される
	default :	//上記のどの条件にも当てはまらなければ default に分岐
		echo "others\n";
}

switch ( 値 ) {	//値が case と一致した時にその条件に分岐
	case 0 :
	case 1 :
	case 2 :
		echo "0〜2\n";	//breakがないのでこれ以降も実行される
	case 3 :
	case 4 :
	case 5 :
		echo "0〜5\n";
		break;	//break までが実行される
	default :	//上記のどの条件にも当てはまらなければ default に分岐
		echo "others\n";
}

ループ制御

for文
(初期値 ; 条件が真ならループ ; ループの最後に実行)
for($i = 0 ; $i < 10 ; $i++){ // 0から9
	echo $i;
}

for($i = 0 ; $i < 10 ; $i++) // 同様
	echo $i;
foreach文
配列の要素を取得
$arr = array(101,102,103); //[0]=>101,[1]=>102,[2]=>103
foreach($arr as $value) {
	echo "$value\n";
}
foreach文
配列のキーと要素を取得
$arr = array(101,102,103); //[0]=>101,[1]=>102,[2]=>103
foreach($arr as $key=>$value) {
	echo "$key=$value\n";
}
foreach文
配列のキーと要素を直接参照
キーと要素の先頭に&を付けることでその変数の変更が配列の内容にも影響する。
$arr = array(101,102,103); //[0]=>101,[1]=>102,[2]=>103
foreach($arr as &$key=>&$value) {
	$value = '0';
	echo "$key=$arr[$key]\n";
}
continue文
これ以降の処理をやめてループの先頭に戻る。
perlで言うところのnextだが、next は php では配列処理の関数に使われているので注意。
	//0,1,2,3,4, 6,7,8,9
	for($i = 0 ; $i < 10 ; $i++){ // 0から9
		if( $i == 5 ) continue; //5を飛ばしてループを続ける
		echo $i;
	}
break文
ループから出る。
	//0,1,2,3,4
	for($i = 0 ; $i < 10 ; $i++){ // 0から9
		if( $i == 5 ) break; /5でループを抜ける
		echo $i;
	}

ヒアドキュメント

Perlと違って、>が3つ付き、セミコロンは文末に付けることに注意。

$contents =<<<END_OF_SENTENCE
AAA
BBB
CCC
END_OF_SENTENCE;

文字列に \ をやたら使ってみる

$str = '\1\\2\\\3\\\\4\\\\\5\\\\\\6';
echo $str."\n";
echo str_replace('\\', '/', $str);

実行結果

\1\2\\3\\4\\\5\\\6
/1/2//3//4///5///6
  • シングルクオートで囲った場合の解釈
    1. \1 は存在しないエスケープシーケンスなので文字の '\' '1' と解釈 = '\1'
    2. \\2 は \\ が文字 '\' を示すため = '\2'
    3. \\\3 は \\ が文字 '\'、 \3 が存在しないので '\' '3' と解釈 = '\\3'
    4. \\\\4 は \\ \\ がそれぞれ文字 '\' 2つを示すため = '\\4'
    5. \\\\\5 は \\ \\ がそれぞれ文字 '\' 2つをを示し、\5 が存在しないので '\' '5' と解釈 = '\\\5'
    6. \\\\\\6 は \\ \\ \\ がそれぞれ文字 '\' 3つを示すため = '\\\6'

セキュリティ

バイナリセーフでない関数

データの中にヌルバイト(0x00)が含まれているとそれ以降は想定していない関数があります。
ヌルバイト以降が汚染されたデータでも削除や変換を行えません。
ereg_** よりは preg_** や mb_ereg_** を使うほうが安心できます。

ereg(), ereg_replace(), eregi(), eregi_replace(), 
split(), spliti(), 
include(), include_once(), require(), require_once() 
fopen(), file_get_contents(), readfile(), basename() 

以上は 23. 関数とバイナリセーフExternal Site に書かれたようにバイナリセーフではないようです。

エラーメッセ

Deprecated: Assigning the return value of new by reference is deprecated in ファイルパス on line 行数

廃止予定の関数などを使うと「非推奨」と言われ警告が出る。(実行はされる)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規新規下位 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-18 (土) 19:27:05 (980d)