第5週


ユーザー定義関数 / 標準クラスライブラリ

前回の宿題

正規表現:m修飾子

デフォルトでは、検索対象文字列を(実際には複数行からなる 場合でも)単一の行からなるとして処理する。
しかしこの修飾子をつけることで、 対象文字列の中に "\n" がある場合は、
それぞれの行に対してマッチングを行う

例. サンプル10

正規表現:preg系とereg系

  • preg系
      Perl互換で、eregよりも高速。
  • ereg系
      バイナリーセーフではないので、PHP5.2から非推奨。
      PHP6からは削除予定(らしい)。

mb_convert_string と mb_convert_variables

string mb_convert_encoding (string $str, string $to [, mixed $from])

PHP Manual:mb_convert_encoding

string mb_convert_variables (string $to, mixed $from, mixed &$vars [, …])

PHP Manual:mb_convert_variables

例. サンプル11


ユーザー定義関数

標準的な関数ではカバーされていなが、
アプリケーション開発者が自分で定義した関数

function 関数名 (仮引数、…) {
    //処理
    retrun 戻り値;
}

※関数名の記法:CamelCase?記法   ⇒名前の先頭を小文字で始め、単語の区切りを大文字で表す記法

また、ユーザー定義関数は複数のスクリプトで共有することが多いので、
再利用性を高める意味でも、ユーザー定義関数は別ファイルとして保存しておき、
それぞれのスクリプトからは必要に応じて別ファイルに取り込むことがよい。

外部ファイルを取り込むときは、なるべくrequire_onceを使うとよい

requireとincludeの違い

  • require命令
    指定されたファイルが見つからなかった場合、Fatal Error(致命的なエラー)を出して
    その場でスクリプトを中断する
  • include命令
    指定されたファイルが見つからなかった場合、Warning(警告)を発するだけで処理を続行する
  • require_once/include_once命令
    それぞれrequire、includeの「1度きり」版
    指定されたファイルがすでに読み込み済みである場合、require_once/include_onceはスクリプトを読みこまず、
    処理をスキップする。
    そうすることによって、循環呼び出し(呼び出し元と呼び出し先で互いにインクルードしあうこと)を未然に防ぐ。

関数を定義する位置

関数は基本的にスクリプトのどの位置に定義してもかまわない。
これはfunction命令による関数定義が、実行時にではなくコンパイル時に行われているため。 しかし、以下のような場合は注意が必要

  • 条件分岐の中で関数が定義されている場合

例. サンプル1

この場合、関数は条件式を満たした場合のみ定義される。
つまり条件式が評価されるまで関数は定義されないので、この場合関数呼び出しコードは
関数定義のコードの後に記述しなければならない

  • 関数内関数である場合

例. サンプル2

この場合、コンパイル段階では関数は登録されるだけで実行されるわけではない。
つまり関数内関数は実行時に親の関数が呼び出されるまで実行されない。

変数の有効範囲(スコープ)

スコープとは、スクリプトの中での変数の有効範囲のこと。

グローバル変数とローカル変数

  • グローバル変数
      スクリプト全体から参照できる変数
  • ローカル変数
      定義された関数の中でのみ参照できる変数

global

例外的に関数ブロッの中からグローバル変数を使用する場合には、
global命令を使用する

例. サンプル3

静的変数

ローカル変数は関数は関数内にのみ適用される変数なので、
関数が呼び出されるたびに初期化される

例. サンプル4

関数の終了後もローカル変数を維持するためには静的変数(static命令)を使用する。
静的変数は、関数の初回呼び出しの時にのみ初期化され、その後関数処理が終了しても維持される。

unset関数の挙動

グローバル変数とunset関数

関数内でghlobal変数が破棄されても、あくまでローカル変数として破棄されるだけで、
関数外部には影響しない.

関数内部でグローバル変数を破棄したい場合には、

unset($GLOBALS['x']);

を使用する

例. サンプル5

static変数とunset関数

静的変数を破棄した場合、その関数での「以降の処理」でのみ変数を破棄する

例. サンプル6


引数

デフォルト値

関数名 (引数 = デフォルト値)
function getTriangleArea ($base = 5, $height =1) {
    return $base * $height / 2:
}

引数の参照渡し

引数の前に「&」をつける

例. サンプル7

※参照渡しされた引数を関数の中で破棄(unset)されても、もとの変数には影響しない。

※参照渡しは時としてコードの流れをわかりにくくする原因にもなるので、汎用は禁物。

可変長引数の関数

引数の個数があらかじめ決まっていない関数のこと。
組み込み関数としては、max、minなどが代表例にあたる。

ユーザー定義関数でも、可変長引数の関数を定義することは可能。

関数の呼び出しと戻り値


複数の戻り値

関数から複数の値を返したい場合、return命令では、
return 1, 2;
のような複数の値を返すことはできない。

この場合は、配列やオブジェクトにして値を一つにまとめたうえで、
値を返さなければならない。

また、戻り値を配列として受け取ってもよいが、戻り値の含まれる個別の要素を
そのまま変数に振り分けたい場合には、list命令を使う

再帰関数

関数が、関数内で自分自身を呼び出す関数のこと

例. サンプル8

可変関数

$変数名()の形式で呼び出せる関数。
これによって変数名に応じて対応する関数を検索実行することができる。

この可変関数は、 関数そのものを引数として渡したり、あるいは受け取ったりする高階関数に使用されることが多い。

例. サンプル9

無名関数(PHP5.3〜)

その場限りでしか利用しない、使い捨ての関数に使用。

function (引数) {
    // 任意の処理
    return 戻り値;
}

オブジェクト指向とクラスライブラリ

プログラムで扱う対象をオブジェクトに見立てて、
オブジェクトを中心にコードを組み立てていく手法のことをオブジェクト指向プログラミングという。

PHPでもオブジェクト指向プログラミングに対応した
オブジェクト指向型ライブラリ(クラスライブラリ)も多く提供されるようになっている。


クラスと関数と変数

関数は、与えられた引数に対して処理結果を戻り値として出力する仕組み。

これに対してクラスから作られるオブジェクトは、自分自身でデータを持つことが出来る。
処理前、処理後のデータを保存しておき、必要に応じて別途利用できる。

クラス/オブジェクトと関数、変数は以下のように比較できる。

データを保持できるデータを処理できる
変数×
関数×
クラス/オブジェクト

クラスとオブジェクト

  • クラス
      特定のオブジェクトを表すための「設計書」
      なお、同一のクラスは1つしかない
  • オブジェクト
      クラスをもとに作られたもの

※クラスはデータが保持できるが、異なる値を代入していくと、
 1つのクラスで保持しなければいけないデータがいくつもでてきて矛盾が起きる。
 そこで、クラスを使う際には、クラス自体には手を加えず、
 それをコピー(インスタンス化)したものに対して操作していく。

インスタンス化とメンバの呼び出し

クラスを基にしてコピーを作ることをインスタンス化
インスタンス化によってできるものをインスタンス(オブジェクト)という。

クラスのインスタンス化(new 演算子)

$ オブジェクト変数名 = new クラス名 ([引数…])

クラスに属する関数と変数のことをそれぞれメンバ関数メンバ変数
またはメソッドプロパティと呼ぶ。

プロパティ/メソッドの呼び出し

[戻り値 =] オブジェクト変数->メソッド名([引数…])
オブジェクト変数->プロパティ [= 値]

静的メソッド/静的プロパティ

例外的にオブジェクトを生成せずに呼びだせるメソッドやプロパティ

[戻り値 =] クラス名::メソッド名([引数…])
クラス名::プロパティ [= 値]

※呼び出しもとがオブジェクト変数ではなく、クラスであることに注意!!

標準クラスライブラリ


DateTime?クラス

日付/時刻の演算や整形を行うためのクラス。
関数型のライブラリとして、ほとんど同等の機能を持つ日付/時刻関数もある。
PHP5.2以降で使用可能。

DateTime?クラスのインスタンス化

$ オブジェクト変数名 = new DateTime();

また、PHP5.3以降はいくつかの新しいメッソドを追加している

Directorylteratorクラス

指定されたディレクトリ配下のファイル情報にアクセスするためのクラス。

$ オブジェクト変数名 = new Directorylterator(string $file_path);

PEAR

PHPには標準で利用可能なライブラリのほかに、さまざまな拡張ライブラリが用意されている。
PEAR(PHP Extension and Application Repository)はそのうちのひとつ。
PHPスクリプトで書かれたクラスライブラリの1つで、以下のような特徴がある。

  • 500個以上にも及ぶ豊富なパッケージ
  • pearコマンド1つでインストールが可能
  • PHPで書かれているのでソースコードの確認が容易
  • ドキュメントが充実している

※PEARの利点はインストールした時点で、多くの関数が作成されていること。
 これによって、容易に・スピーディーに開発が可能になる。

パッケージマネージャ

PEARを利用するには、パッケージ管理とインストールを支援するパッケージマネージャ(pearコマンド)が必要。
Linux環境では、デフォルトでパッケージマネージャを利用可能。
Windows環境では、PHP本体とは別にパッケージマネージャをインストールする必要あり。

パッケージマネージャが利用可能になったら、個々のパッケージをインストールする。

PEARの例

  • PEAR::Auth
アプリケーションに対して、簡単に「フォーム認証」機能の実装が可能。
  • PEAR::HTML_QuickForm?
その名の通り、フォームを手軽に構築するための機能。
  • PEAR::Pager
大量のデータをページング機能で分割。
  • PEAR::Spreadsheet_Excel_Writer
PHPアプリケーションから動的にExcel形式のファイルを生成するためのライブラリ。

その他、たくさん。


参考資料

  • 独習PHP 第2版