Open15

PHP

y8uy8u

O'reilly 初めてのPHP 感想メモ

へー、と思ったことを雑に書いていく

※PHP 8.0

y8uy8u

引数への型指定ができる
7系以降は全ての型で使用可能

  • PHP
function hoge(int $num) {
    return $num;
}
  • Go
func hoge(num int) {
    return num
}
y8uy8u

出力

  • 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`)
y8uy8u

三項演算子

この場合echoは文のため使えない

(true) ? print "true" : print "false";
y8uy8u

ファイルの末尾に終了タグ?>があると、バグの温床になるためスクリプトでは書かない

※行番あり

1 <?php
2 echo "Hello World!", PHP_EOL;
3 ?>
4
6
7
8
9 <!-- ↑改行があると空行が増える -->
$ php main.php
Hello World!





<!-- ↑改行があると空行が増える -->
y8uy8u

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;
y8uy8u

Tips

公式だとprintの括弧は不要とされてる

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

print "括弧不要です";
y8uy8u

外部スクリプト呼び出し

  • call.php
function call(string $arg) {
    echo $arg, PHP_EOL;
}
  • require.php
require "./call.php";

call("Hello World!");

Goのパッケージimportみたいにpackage.functionじゃないのが気になる

hendler.hoge()
y8uy8u

Tips

短い形式でのPHPタグ
下記二つのコードは同義

<?= 'この文字列を表示' ?> 
<?php echo 'この文字列を表示' ?> 
y8uy8u

Validation

正規表現を書かなくても下記のようにしてバリデーションを行うことができる

RFC822に準拠したメールアドレスであれば通る
https://practical-scheme.net/gauche/man/gauche-refj/RFC822metuseziXing-Shi-.html

  if (filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
    echo "正しい形式のメールアドレスです。";
  } else {
    echo "不正な形式のメールアドレスです。";
  }

fyi

メールアドレスの規格については諸説あるっぽい

https://qiita.com/wingsys/items/5c00f5ff2e34a6b7ee10

y8uy8u

Cookie / Session

  • ブラウザに保存されるのがCookie
    • ステラおばさんが作ってるのがクッキー
  • サーバーに保存されるのがSession
    • 即興でアンサンブルするのがセッション

すいません

session_start()
 
setcookie()
y8uy8u

Cookie

  • 自身のPC内に有効期限付きで、データを保存する
  • ブラウザごとに細かい違いはあるが保存データ量の最大は4096byte

例)

C:\Users\(ユーザ名)\AppData\Local\Google\Chrome\User Data\Cookies

Cookiesのファイルはバイナリファイルになっている
Cookiesの生データはSQLiteで構成されている

つまりこのファイルを削除すれば全てリセットできる(そんなことせんでも消せるが)

y8uy8u

Session

  • サーバー内に保存されており、保存された情報はブラウザ単位で管理される
  • セッションの有効期限は固定されている(変更可能)
  • 保存データ量の制限は無し(変更可能)

PHPでコントロールしている場合Cookie上にPHPSESSIDという名前で保存されている

y8uy8u

Session Tips

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

y8uy8u

strlen

strlenだとbyte数を取得するため、全角文字が含まれている場合はmb_strlenを使用する

strlen("aiueo")    // 5 
strlen("あいうえお")    // 10 
mb_strlen("あいうえお")     // 5