PHP
code:hello world.php
<?php
echo "hello world"
組み込み型
null
bool
table:falsyな値
integer 0
float 0.0, -0.0
string "", "0"
array [] (count($array)==0)
int
table:進数表記
10進 1234
1_234_567 >PHP7.4
8進 01234
0o1234 >PHP8.1
16進 0x1A
2進 0b11101
float
小数点誤差対策
string
内部的な文字コードは、ソースファイルの文字コードに従う
デフォルトでマルチバイト文字は扱えないので、基本的にはmbstring系の関数で文字列操作する方が良い
array
実態は順序付けられたMap。
object
callable
resource
パッケージやモジュールなんかが妙に複雑
table:php-extension
ホスト 概要 例
野良 yumやapt-getでインストールするもの php-mbstring
PEAR メンテされていない昔あったもの
PECL PEARと互換性を持ったバイナリモジュール apcu
Composer PHPで書かれたモジュール laravel
文字列操作
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)
定義済み変数の一覧
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");
pecl系のライブラリについて
源流はPEARで配布されている、PECLコマンドからのビルド&インストールを行なって入れる。 ただし、パッケージマネージャ(yumやdnf, apt-get)でビルド済みのライブラリが配布されている場合があり、こちらを使った方が面倒が無い
配布されていなければ、peclコマンドから入れるのが筋のように思える。php.iniへのエクステンション書き込みが行われないので、そこは自分でやる
echo "extension=apcu.so" | tee --append /etc/php.d/40-apcu.ini
特殊な書き方
$hoge->{$fuga}で$fugaに入ってる文字列をプロパティとして$hogeに問い合わせられる
配列でない物にforeachしたい時に使用する。関数を一時中断する機構・・・?