PHP

O'reilly 初めてのPHP 感想メモ
へー、と思ったことを雑に書いていく
※PHP 8.0

型
引数への型指定ができる
7系以降は全ての型で使用可能
- PHP
function hoge(int $num) {
return $num;
}
- Go
func hoge(num int) {
return num
}

出力
- echoは文
- printは式
echo print 違い
echoは複数の引数を取れる
echo add(1, 2), PHP_EOL;
print(add(1, 2) . PHP_EOL);
改行込み
他の言語だと`
で書くやつが"
でもできるっぽい
- PHP
echo "aiueo
kakikukeko
sashisuseso";
- Go
fmt.Println(`aiueo
kakikokeko
sashisuseso`)

三項演算子
この場合echo
は文のため使えない
(true) ? print "true" : print "false";

ファイルの末尾に終了タグ?>
があると、バグの温床になるためスクリプトでは書かない
※行番あり
1 <?php
2 echo "Hello World!", PHP_EOL;
3 ?>
4
6
7
8
9 <!-- ↑改行があると空行が増える -->
$ php main.php
Hello World!
<!-- ↑改行があると空行が増える -->

global変数の参照
global変数を参照渡しする宣言 global
$var = 'global';
echo $var, PHP_EOL;
function main() {
global $var;
echo $var, PHP_EOL;
$var = 'local';
echo $var, PHP_EOL;
}
main();
echo $var, PHP_EOL;

Tips
公式だとprint
の括弧は不要とされてる
printの引数を括弧で囲んで渡しても文法エラーにはなりませんが、 通常の関数コールのような文法に見えてしまいます。 しかし、これは誤解を招く恐れがあります。 なぜなら、括弧は実際には出力を構成する式の一部であり、 print の文法の一部ではないからです。
print "括弧不要です";

外部スクリプト呼び出し
- call.php
function call(string $arg) {
echo $arg, PHP_EOL;
}
- require.php
require "./call.php";
call("Hello World!");
Goのパッケージimportみたいにpackage.function
じゃないのが気になる
hendler.hoge()

Tips
短い形式でのPHPタグ
下記二つのコードは同義
<?= 'この文字列を表示' ?>
<?php echo 'この文字列を表示' ?>

Validation
正規表現を書かなくても下記のようにしてバリデーションを行うことができる
RFC822に準拠したメールアドレスであれば通る
if (filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
echo "正しい形式のメールアドレスです。";
} else {
echo "不正な形式のメールアドレスです。";
}
fyi
メールアドレスの規格については諸説あるっぽい

Cookie / Session
- ブラウザに保存されるのがCookie
- ステラおばさんが作ってるのがクッキー
- サーバーに保存されるのがSession
- 即興でアンサンブルするのがセッション
すいません
session_start()
setcookie()

Cookie
- 自身のPC内に有効期限付きで、データを保存する
- ブラウザごとに細かい違いはあるが保存データ量の最大は4096byte
例)
C:\Users\(ユーザ名)\AppData\Local\Google\Chrome\User Data\Cookies
Cookiesのファイルはバイナリファイルになっている
Cookiesの生データはSQLiteで構成されている
つまりこのファイルを削除すれば全てリセットできる(そんなことせんでも消せるが)

Session
- サーバー内に保存されており、保存された情報はブラウザ単位で管理される
- セッションの有効期限は固定されている(変更可能)
- 保存データ量の制限は無し(変更可能)
PHPでコントロールしている場合Cookie上にPHPSESSID
という名前で保存されている

Session Tips
大概のアプリケーションはデフォルト設定でも問題無し
例外として、金融系などの操作されなかった時間などを制限したい場合は設定が必要

strlen
strlen
だとbyte数を取得するため、全角文字が含まれている場合はmb_strlen
を使用する
strlen("aiueo") // 5
strlen("あいうえお") // 10
mb_strlen("あいうえお") // 5