SE覚書
PHP
PHPの基本
- PHPスクリプトの拡張子は「.php」でなければならない。
- PHPはインタプリタ型の言語である。テキストエディタで記述したソースコードをそのまま実行することができる。
- PHPは「HTML埋め込み型」の記法を採用している。PHPのスクリプトは<?php...?>で囲む必要がある。
- 命令文の区切りには、セミコロン(;)を付けなければならない。
- PHPの命令文では、大文字・小文字を区別しない。
- printはPHPの基本命令の一つで、指定された文字列を出力する。
- 変数は、データを一時的に保管するための入れ物である。
- PHPでは、変数/データ型の宣言は不要である。変数が初めて使用された時点でメモリが確保される。
- PHPの変数は必ず先頭が「$」で始まらなければならない。
- 文字列は必ずダブルクォート(”)またはシングルクォート(’)で囲む。シングルクォートで囲まれた変数は解釈されず、記述のとおりに認識される。
- 配列は、複数のデータをひとまとめに管理したい場合に使用する。
- HTMLフォームは、PHPに対してユーザからのデータを渡すための、最も基本的な手法である。
- フォーム部品の種類はいろいろあるが、その目的や用途に応じて部品を使い分けることによって、ユーザビリティの向上につながる。
- HTTPによる通信の内容は、大きく「HTTPメソッド」「リクエストヘッダ」「リクエストボディ」「HTTPステータス」「レスポンスヘッダ」「レスポンスボディ」に分かれる。
- リクエスト情報には様々なデータが含まれるが、<form method="POST">から渡されたデータはリクエストボディに乗せて送信される。このようなデータのことを「ポストデータ」と呼ぶ。
- ポストデータをPHPスクリプト内で取得するには、スーパーグローバル変数$_POSTを使用する。
- スクリプトからの出力は、すべてhtmlspecialchars関数でエスケープ処理を行うことが推奨される。
- break関数は、あるブロックから強制的に脱出したい場合に使用する。
- break命令に抜け出したいループの数を指定することで、ネストしたループから一気に脱出することができる。
- ループで現在の集会のみをスキップしたい場合には、continue命令を使用する。
- PHPで使える繰り返し構文には、for、foreach、while、do...whileがある。
- PHPではコメント構文として、<!--...-->、//、#、/*...*/の4種類がある。
- 演算子は便宜上、(1)代数演算子、(2)代入演算子、(3)比較演算子、(4)論理演算子、(5)ビット演算子、(6)その他の演算子に分類できる。
- クエリ情報とは、URLの末尾に「~?キー名=値」で表現できるシンプルなデータのことを指す。スーパーグローバル変数$_GETを介して取得することができる。
- クエリ情報には、(1)データサイズに制限がある、(2)使用できない文字がある、(3)データが露出するなどの制限がある一方、ブックマークできるというメリットがある。状況によって、ポストデータと使い分ける必要がある。
- 条件分岐には、単純分岐に使用するif命令と、多岐分岐に使用するswitch命令がある。
- ヘッダ情報は、その内容によって「エンティティヘッダ」、「一般ヘッダ」、「リクエストヘッダ」、「レスポンスヘッダ」に分類される。
- リクエストヘッダを取得するには、スーパーグローバル変数$_SERVERを使用する。
- $_SERVERを使用することで、定義済のサーバ変数を取得することも可能になる。
- HTTPは、「ステートレスなプロトコル」(最初と次のリクエストの関連性を持たない、状態を保持することができない)である。
- ページ間で情報を保持する場合には、クッキーを使用するのが便利である。
- クッキーを発行するにはsetcookie命令、参照するにはスーパーグローバル変数である$_COOKIEを使用する。
- 何かしらの入力に基づいて処理を行い、結果を返す命令のことを「関数」と呼ぶ。
- PHPには様々な関数が用意されており、これらの関数を活用することで直感的なコーディングを行うことが可能になる。
- 関数に対する入力のことを「引数」、関数からの出力のことを「戻り値」と呼ぶ。
- PHPには公式のリファレンスが用意されている。公式リファレンスの構文記法を理解しなければならない。
- 連想配列を使用することで、配列の要素をより分かりやすい文字列キーによって取得することができる。
- セッションを利用することで、アプリケーション共通のデータをクッキーよりも安全に、かつ手軽に管理することができる。
- セッションの読み書きには、スーパーグローバル変数$_SESSIONを使用する。
- セッションを開始するにはsession_start関数、破棄するにはsession_destroy関数を使用する。
- セッション関数には多くの設定パラメータが用意されている。例えば、session.auto_startパラメータを設定することにより、セッションの開始を自動化することができる。
- PHPには、値のデータ型を確認するためにis_xxxxx関数が用意されている。
- 乱数を生成するにはmt_rand関数を使用する。
- 日付関数では、日付データをタイムスタンプ値として表示する。タイムスタンプを使用することで、日付データの演算・比較も簡単に行うことが可能になる。
- タイムスタンプとは、1970年1月1日からの経過秒を示す。
- 任意の日付からタイムスタンプを生成する関数には、minute、strtotime等の関数がある。
- date関数を使用することで、日付データを生成したり、日付や時刻の要素を抽出することができる。
- 日付の妥当性をチェックするには、checkdate関数を使用する。
- テキストファイルを操作するには、最初に操作対象のファイルをfopen関数でオープンする必要がある。
- fopen関数では、後続の処理が読み取り・書き込み・追記のいずれかによって、適切なモードを選択する必要がある。
- ファイルの操作後は、fclose関数でファイルをクローズする。
- ファイルの書き込みは、fputs関数で行う。
- ファイルへの書き込みを行う際には、必ずその前後で対象ファイルをロックすべきである。これにより、同時アクセスによるデータの不整合を防ぐことができる。
- ファイルシステム関数には、いくつかの設定パラメータが用意されている。ファイルがうまく読み込めないなどの問題がある場合、まずこれらの設定を確認するべき。
- リダイレクトを行うには、header関数を使用する。
- ファイル末尾の「?>」は、省略可能であり、記述すべきではない。
- タブ区切りテキストやカンマ区切りテキストを読み込むには、fgetcsv関数を使用すると便利。
- ファイルポインタは、ファイルの読み込み位置を記録するための目印である。ファイルポインタは、ファイルが開かれた時点ではファイルの先頭を示している。
- アプリケーションで繰り返し利用する仕組みは、ユーザ定義関数として定義しておくことにより、コードを簡潔に記述することができる。
- ユーザ定義関数は、function命令で定義することができる。戻り地がある場合にはreturn命令を使用する。
- ファイル全体を読み込むには、file関数を使用する。
- ファイルのリネームを行うにはrename関数を、削除するにはunlink関数を使用する。
- 正規表現パターンを使用することで、非定型のデータから特定の文字列を抽出したり、置換することができる。
- 正規表現によるマッチングを行うにはpreg_match/preg_match_all関数を、置換や分割を行うにはpreg_replace/preg_split関数を使用する。
- 正規表現による置換処理では、置換後の文字列にマッチングした文字列を含めることができる。
- メールを送信するには、mb_send_mail関数を使用する。
- 連想配列から順に値を取得するには、foreach命令を使用すると便利。
- 代表的なメールヘッダには、To、Cc、From、Subjectなどがある。
- 複数行にわたる長いテキストは、ヒアドキュメントやNowdoc構文を使用することでシンプルな記述が可能。
- 環境依存の情報は設定ファイルとして外部化すると、簡単に変更することができるようになる。
- 設定ファイルを連想配列に変換するには、parse_ini_file関数を使用する。
- メールヘッダインジェクション脆弱性を防ぐ一番の方法は、入力値の正否をしっかり確認することである。
- アップロードしたファイルの情報は、スーパーグローバル変数$_FILESで取得することができる。
- アップロードを行う場合、処理に先立って(1)アップロード処理そのものが正しく行われているか、(2)処理するファイルがアップロードされたものであるか、(3)コンテンツタイプの確認、などを行う必要がある。
- アップロードファイルはデフォルトで一時フォルダに保存されるため、move_uploaded_file関数で目的のディレクトリに移動する必要がある。
- 文字コードを変更するには、mb_convert_encoding/mb_convert_variables関数を使用する。
- php.iniには、アップロード処理を制御するための様々なパラメータが用意されている。
- フォルダ情報を取得するには、ディレクトリ関数とファイルシステム関数を使用する。
- ファイルをクライアントにダウンロードさせるには、Content-Type/Content-Dispositionヘッダを使用する。
- リクエスト情報経由でファイルパスを受け渡しする際には、パストラバーサル(Path Traversal)脆弱性に注意が必要。
- クラスとは「データを操作するための様々な機能」を兼ね備えた高度な器である。
- クラスを利用する場合には、必ずコピーを作成する必要がある。コピーを作成することを「インスタンス化」といい、インスタンス化によってできたコピーのことを「オブジェクト」と呼ぶ。
- PHP上でインスタンス化を行うには、new演算子を使用する。
- クラスの配下には、関数や変数が定義されている。これを「メソッド」「プロパティ」と呼ぶ。メソッドやプロパティを呼び出すには「->」演算子を使用する。
- XMLは、データ構造を記述するための拡張可能なマークアップ言語である。
- PHPでは、SimpleXML、XMLReaderをはじめとするXML文書を処理するための様々な関数が用意されている。
- SimpleXML関数を利用することで、オブジェクトのプロパティにアクセスするのと同様にXML文書にアクセスすることができる。
- SimpleXML関数を使用することで、既存のXML文書に対して新しい要素を追加したり、既存の要素を更新・削除することも可能。
- 新しい要素を追加するには、addChildメソッドを使用する。
- 新しい属性を追加するには、addAttributeメソッドを使用する。
- 編集済のXML文書をファイルに保存するには、asXMLメソッドを使用する。
- WebAPIとは、ネットワーク経由で利用可能なAPIを示す。
- クエリ情報を動的に組み立てるには、http_build_query関数を使用すると便利。
- WebAPIにアクセスし、結果を処理するには、SimpleXML関数を使用する。
- データベースとは、後から検索・分析することを目的に、体系的に蓄積した情報群のことを示す。
- MySQLサーバは配下に複数のデータベースを配置することができる。また、データベースはテーブルをはじめとした複数のデータベースオブジェクトから構成される。
- テーブルの中で一つのデータのことをレコード、レコードに含まれるそれぞれの項目(列)のことをフィールド(カラム)と呼ぶ。
- テーブル内の各列には、データ型を明示的に宣言する必要がある。
- 各列には、列のデータ型以外の特性を示す属性として列フラグを設定することも可能。
- データベース抽象化レイヤは、データベースごとの違いを吸収するための仕組みである。
- PDO(PHP Data Objects)はデータベース抽象化レイヤの一種である。
- データベースに接続するには、PDOクラスを使用する。
- データベースを操作するには、SQL命令を使用する。SQL命令を発行するには、execメソッドやprepare/executeメソッドなどを使用する。
- 入力値などからSQL命令を組み立てるには、プレイスホルダを使用する。
- 例外を処理するには、try...catch命令を使用する。
- executeメソッドでSELECT命令を発行した場合、PDOStatementオブジェクトにはテーブルから取得した結果セットが格納される。
- 結果セットとは、テーブルから取得したレコード群を保持するためにメモリ上に用意された一種の仮想テーブルを示す。
- 結果セットは現在のレコード位置を示すレコードポインタを保有する。ポインタが示すレコードのことをカレントレコードと呼ぶ。
- 結果セットの内容を順に取り出していくには、fetchメソッドを使用する。
- SQLはデータベースを操作するための共通言語である。用途によって、データ操作言語、データ定義言語、データ制御言語に分類することができる。
- テキストボックスや隠しフィールドなどにデータベースの値を反映させるには、value属性に必要な値を設定する。
- 同様に、選択ボックスやラジオボタンなどについては、データベースの値とオプション値などを比較し、合致したところでselected/checked属性を出力する。
- クリックされたボタンによって処理を分岐するには、ボタンの値が存在するかどうかで判定する。
- ユーザからの入力は、原則としてすべてチェックしてから処理をすべきである。
- チェックの種類には、必須検証や範囲検証、文字列長検証、データ型検証、正規表現検証などがある。
- クラス配下で定義された関数、変数をメンバ関数・メンバ変数、またはメソッド・プロパティと呼ぶ。
- クラスには、インスタンス化のタイミング、破棄のタイミングで呼び出される__construct、__destructという特殊なメソッドを定義することができる。それぞれコンストラクタ・デストラクタと呼ぶ。
- クラスの重要な目的の一つに、カプセル化がある。これは、クラス内のメンバを保護し、操作しても安全な機能だけを外部に更改することを指す。
- PHPには、public・protected・privateの3つのアクセス修飾子がある。
- static修飾子を付加したメソッドは、インスタンス化することなく、クラス名から直接呼び出すことができる。このようなメソッドを静的メソッドと言い、「::」演算子で呼び出す。
- PHPには、__autoload関数や__call、__get、__setメソッドなど、独自のオブジェクト指向構文が用意されている。
- あるクラスの機能を引き継ぎつつ、新しいクラスを定義することを「継承」と言う。継承元のクラスを「スーパークラス」、継承先のクラスを「サブクラス」と言う。
- スーパークラスのメソッドをサブクラス側で上書きすることを「オーバーライド」と言う。final修飾子を使用することで、オーバーライドを禁止することも可能。
- ポリモーフィズムとは、あるクラスのサブクラス間のメソッドが同名であるにもかかわらず、異なる挙動を実現することを指す。
- サブクラスが同名のメソッドを持つことを保証するには、抽象クラスやインターフェイスを使用すると便利。
- 抽象クラスは、中身を持たない抽象メソッドを含むクラスのことを指す。抽象クラスそのものはインスタンス化できない。
- インターフェイスは中身を一切持たないメソッドの名称だけが定義された「特別なクラス」を指す。インターフェイスはクラスとは異なり、複数個を同時に実装(多重継承)することができるのが特徴。
- 名前空間は、クラスや関数の苗字のようなもので、名前の衝突を防ぐ。
- 名前空間は、namespace命令で定義する。namespace命令はコードの先頭に記述しなければならない。
- 一つのファイルに複数の名前空間を定義することは不可能ではないが、そうすべきではない。
- 名前空間に属するファイルは、名前空間の階層構造に対応するフォルダに保存するのが一般的。
- 名前の指定には、非修飾名・修飾名・完全修飾名がある。
- 名前空間の別名を指定するには、use命令を使用する。
- PEARは、PHPスクリプトで書かれたオフィシャルなクラスライブラリ集。パッケージマネージャでライブラリの管理ができるのが大きな特徴。
- PEAR::Authを使用することで、フォーム認証を実現可能。フォーム認証では自由なレイアウトでログインページを設定することがメリット。
- PEAR::Authでは、ユーザ情報をデータベース以外にもファイルやディレクトリサービス、連想配列などの形式で管理することができる。
- 外部ファイルをアプリケーション共通でインクルードするには、auto_prepend_fileパラメータを使用する。
- .htaccessを使用することで、フォルダ単位にパラメータを設定することができる。
- .htaccessでパラメータを設定する場合、(1)httpd.confのAllowOverrideディレクティブが"ALL"であること、(2).htaccessで設定可能なパラメータであることを確認する必要がある。
- Ajaxを使用することで、サーバ通信の都度に発生する「画面のチラツキ」や「作業の中断」を回避し、より使いやすいユーザインターフェースを構築することができる。
- PEAR::HTML_AJAXは、Ajax機能をより少ないコーディングで実装可能にするライブラリである。
- PEAR::HTML_AJAXによって自動生成されたプロキシクラスを使用することで、通信などの手続きを意識することなく、JavaScriptからサーバ側のメソッドを呼び出すことができる。
- テンプレートエンジンとは、テンプレートを動的に解釈し、動的にページを生成するための実行エンジンである。
- Smartyは、(1)コンパイル型であるため、処理パフォーマンスが高い(2)ライブラリが豊富である(3)機能の拡張が容易であるなどの特徴がある。
- Smartyのコアな機能を担うのは、Smartyクラスの役割である。一般的にはSmartyクラスを直接使うのではなく、サブクラスを定義し、アプリケーションからはこのサブクラスを使用する。
- Smartyクラスには、テンプレート変数を登録するassignメソッドやテンプレートを呼び出すdisplayメソッドなどが用意されている。
- テンプレートファイルでは、関数や就職子、変数などの様々な要素を{~}で定義されたブロックの中に記述することができる。
戻る