PHP
専門じゃ無いので雑記
文字列操作
PHPインストール
Windowsへのインストール
簡易サーバー立ち上げ
php -S localhost:3000
変数
代入は基本的に値渡しになる
$hoge = &$fuga で参照渡しが出来る
変数のスコープ
関数スコープ外で使用された変数は、グローバルスコープになる
関数スコープ内で使用された変数は、ローカルスコープになる
これは、グローバルで使用された変数名であっても、ローカルスコープの別の変数になる
関数スコープ内でグローバルスコープの変数を使うには globalキーワードを使う。または、$GLOBALを使用する
code:php
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a;
$GLOBALS'b' = $a + $GLOBALS'b'; }
Sum();
echo $b; // 3
?>
変数の中身を見る
var_dumo($array)
定義済み変数の一覧
for文
code:php
for($i=0, $size=count($array); $size > $i; $i++){ // count()を毎回行うのは効率が悪い
}
foreach文
code:php
foreach($item as $array){
}
配列
$array = array("a","b","c");
連想配列は $hash = array("key" => "val");
長さの取得 count($array);
配列を文字列に結合するのはimplode( ",", $array )(この場合','区切りになる)
配列へのpushは$array[] = 10
null判定
is_null($var)<=>isset($var)
0や空文字はis_null($var) == falseになる
empty($var) 0や空文字もtrueになる
echo
関数では無いらしい・・・?
配列の中身を見る
code:php
$test_array = array("a","b","c","d") ;
for($i = 0 ; $i < count($test_array); $i++){
}
list($a,$b,$c) = $array
$array = array("Z", "Y", "X");であるとして、$a="Z"$b="Y"になるよう配列の中身を取り出す
var_dump()、print_r()などの内容をファイルに保存する
うまくいかん
別ファイルの取り込み
require("hoge.php");
一度だけ版require_once("hoge.php");
文字列型
’’(シングルクォート)と""(ダブルクォート)で挙動が変わるのはrubyっぽい
文字列の長さはstrlen($str)で取得
2バイト文字も考慮するならmb_strlen($str)
文字列の分割
PHPでUA判定
code:php_check_ua
if ((strpos($ua, 'Android') !== false) && (strpos($ua, 'Mobile') !== false) || (strpos($ua, 'iPhone') !== false) || (strpos($ua, 'Windows Phone') !== false)) {
// スマートフォンからアクセスされた場合
header("Location: smartphone/index.html");
exit();
} elseif ((strpos($ua, 'Android') !== false) || (strpos($ua, 'iPad') !== false)) {
// タブレットからアクセスされた場合
header("Location: tablet/index.html");
exit();
} elseif ((strpos($ua, 'DoCoMo') !== false) || (strpos($ua, 'KDDI') !== false) || (strpos($ua, 'SoftBank') !== false) || (strpos($ua, 'Vodafone') !== false) || (strpos($ua, 'J-PHONE') !== false)) {
// 携帯からアクセスされた場合
header("Location: mobile/index.html");
exit();
} else {
// その他(PC)からアクセスされた場合
header("Location: pc/index.html");
exit();
}
PHPでホワイトボックステスト
error_logを使ったプリントデバッグ
error_log(なにがし)
cat /etc/php.ini | grep error_log で確認できる
HTTPヘッダの読み取り
$_SERVER['HTTP_HOGEHOGE']
全部大文字で
HTTPの応答でレスポンスコードを設定
404を返すとか、そういうやつ
http_response_code(int $response_code = 0): int|bool
HTTPの応答でバイナリファイルを返す
要は標準出力に書きこめば良いらしい
POSTBodyの読み取り
Form由来で送信されたのか、Ajaxで送信されたのかで読み取り方が変わる
Ajax由来
JSONの取り扱い
デコード
単にjson文字列だけ渡すと、Object型で帰ってくる
小孫にアクセスするにはdecoded_json->attribute でアクセスする
第2引数にtrueを入れると、連想配列で帰ってくる
小孫にアクセスするには decoded_json['attribute']になる
エンコード
json_encode
連想配列をjsonにする
データだけ渡すと、/が\/になったり日本語がUnicodeコードポイントになったりする(エスケープされる
JSON_UNESCAPED_SLASHES を渡したりすると回避できる 詳細 参考 乱数の生成
トークンの生成とかに使うやつ
bin2hex(random_bytes(32))
base64へのエンコード
base64_encode()
暗号化周り
暗号化と復号化
password_hash() password_verify()
パスワード専用の暗号化処理。
password_hash()では、ハッシュ化するだけでなく、アルゴリズムやソルトも含めた情報を返すらしい。password_verifyに入力パスワードとハッシュを渡すと、一致しているか教えてくれる。 ハッシュは乱数も嚙んでるので、同じパスワードをpassword_hash()しても同じハッシュにはならない。
openssl_encrypt() openssl_decrypt()
汎用的な暗号化/復号化処理
random_bytes() random_int()
「暗号論的に安全な」乱数を生成する
偏りの少ない乱数生成機だよ。位の意味。たぶん
bin2hex()
random_bytes()で作ったバイト列を16進数の文字列に変換してくれる。一緒に使おう
型変換
キャストみたいな操作になる
トレイト
なんか独特な機能
メンバを持てないStaticClass・・・みたいなもの?
StatcClassで良いから僕は使わないかな・・・
クラスのメソッド一覧を出す
$methods = get_class_methods("ClassName");