PHP8模試 間違えたとこまとめ その2

前回の続き
変数スコープ(有効範囲)
関数(function)の内と外で、変数がどこまで届くかというルール。
覚えるルール
- ローカル変数は、globalと宣言した瞬間に、その辺数は最新のグローバル変数と同期する。
- 関数の中でglobal変数を書き換えると関数の外にも影響する。
- function(関数)の中でglobal $val と宣言した場合、function内(ローカル)で使用していた同名の変数が、外側にある最新のグローバル変数の値に上書きされる。(もともと使用していたローカル変数$valの値は消えてなくなる。)
- globalを宣言した後に、関数内でその変数を書き換えると、関数の外側(グローバル変数)の値も一緒に書き換わる。
<?php
$val = 'a';
$val = 'b'; //グローバルな$valがa→bに上書きされた
$val = 'c'; //b→cに変わる
function func($val = 'd'){
$val = 'e'; //ローカル関数内で$valを定義
global $val; //グローバル変数$valを関数内に。(中身は'c')この時点でローカル変数は削除される。
$val = 'x'; //関数内で書き換える。グローバル変数もxになる
}
$val = 'f'; //関数を呼ぶ直前に、グローバル変数を'f'に上書き
func($val); //外の $val ('x') を引数に渡して関数を実行
echo $val; //出力:x(外側にも影響する)例外処理
プログラムで予期せぬエラーが起きたとき、安全に処理を流すための仕組み。
try→catch→finally の順で処理が進む。
throw:例外を意図的に発生させる(投げる)。→ 例)throw new Exception();
catch:投げられた例外を捕まえるブロック。キーワードを設定する。→異なる例外クラスごとに複数並べることが可能。
finally:例外があってもなくても必ず最後に実行。
Exceptionクラス:プログラムの工夫(リトライや別ルートの処理など)で回復可能な例外。
Errorクラス:メモリ不足や存在しない関数を呼び出したとき、プログラムの工夫だけでは続行が難しい致命的なエラー。
- catchを複数並べるときは、子(具体的な例外)→親(大まかな例外)の順で書いていく。
- PHP8では、catch(Exception $e)と書くときに、$eを省略してもよくなった。
- 発生した例外のファイル名はgetFile()、行番号はgetLine()で取得できる。
$thisとstaticの関係
$thisは「生成された特定のオブジェクトインスタンス自身」を指す特殊な変数。
staticは「インスタンスを作らなくても「クラスそのもの」に紐づいた」仕組み。
→インスタンスがなくても呼び出せるため、静的メソッド(static function)の中で$thisを使うと致命的エラー(Fatal Error)になる。
名前空間
名前空間の先頭に「\(バックスラッシュ)」があれば絶対パス(グローバル)、なければ相対パス(ローカル)
$_SERVER
サーバーやアクセス環境に関する情報が詰まった連想配列。
- $_SERVER['REMOTE_ADDR']:現在のページにアクセスしているユーザーのIPアドレスを格納している要素。
- $_SERVER['PHP_SELF']:ドメインを含まない絶対パスを返す。
- HTTP_HOST:ドメイン名
- PHP_SELF:ドメイン以降の絶対パス
- SCRIPT_NAME:現在のスクリプトパス
同値演算子(==)
型が違っても、自動変換した値が同じならtrueを返す。緩やかな比較。
例)1 == '1' → true
厳密な比較算(===)
値が同じ+型が同じ なら trueを返す。厳しめ比較。
例)1 === "1" → false
filter_input()
$_POSTや$_GETの入力データを直接受け取り検証・除去する。フィルター機能。
FILTER_VALIDATE_EMAILと組み合わせると、メールアドレスの形式が正しいか判定できる。
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if($email === false || $email === null){
echo "無効なメールアドレスです";
} else {
echo "有効なメールアドレスです";
}クロスサイトスクリプティング(XSS)
悪意のあるスクリプトをアップロードして、別のユーザーのブラウザで勝手に実行されてしまう行為。クッキー情報が盗まれたり、偽の画面に誘導されたりする。
無効化手段
strip_tags()
文字列→HTMLタグ(PHPタグも同様)を取り除く(消去する)
<?php
strip_tags("<p>Hello</p>"); //→Helloと表示されるhtmlentities()
HTMLの特殊文字を「HTMLエンティティ(<とか>)」に変換する。<scipt>があってもなくても文字として表示されプログラムが実行されない。
変換可能なものはすべて
htmlspecialchars()
&、"、'、<、>の5つだけ変換する。
DSN(データソース名)の構造
「どの種類のデータベースに(ドライバ名)」「どこにある(ホスト名)」「どのデータベース名で(データベース名)」接続するかを、コロン(:)セミコロン(;)で区切って指定する。
PDO
PHPに拡張モジュールとして標準提供されているDB抽象化レイヤー。DBの種類が変わっても共通のコード体系で操作できる。
PDOを使ってデータベースに接続する場合、1番目に渡す引数$dnsに厳密ルールがある。
先頭:mysql:(今からMySQLにつなぐ宣言)
ホスト名+データベース名:host=ホスト名;dbname=データベース名
PDO($dns, $user(データベースのユーザー名),$password()データベースのパスワード)
