前回の続き。
##オートローディング機能の実装
とりあえず、不十分ではありますが、UserModel の実体ができましたので、オートローディングの機能を作成します。オートローディング機能を使うと、new ClassName()
をするなど、クラスをインスタンス化したり、静的メソッドを実行する際に、毎回 require
や require_once
を記述しなくても済むようになります。
PHP5.3 以上で実装された名前空間を上手に利用してこの機能を実装してみましょう。
前回、UserModel は以下のように作成しました。
<?php
final class UserModel
{
(中略)
名前空間を利用して、以下のように変更します。
<?php
namespace MyApp\model
final class UserModel
{
(中略)
classes/model/UserModel.class.php に配置しているファイルを自動的に require する機能を実装すれば良いわけです。
動作を検証しながら作成を進めます。
ブラウザで実行結果を確認しながら進めるので、webroot/index.php を作成します。
<?php
$objUserModel = new MyApp\model\UserModel;
このように記述すると、通常、「そんなクラスねえ!」って怒られるわけですが、autoload を作っておくとよしなにやってくれるわけですね。
リファレンスにも書かれているように、
spl_autoload_register() を使えば、より柔軟にクラスのオートロードができます。 そのため、今や __autoload() を使うことはおすすめできません。 将来のバージョンではこの機能が非推奨となり、削除されるかもしれません。
なので、素直に、spl_autoload_register 関数 を利用します。
ついでに、どのファイルからも共通で読み込みして利用する common.php, 各種設定値を定義する config.php を作成しておきましょう。
以後、webroot 以下に作成するファイルには require_once '../common.php';
を共通して記述することになります。
<?php
require_once '../common.php';
$objUserModel = new MyApp\model\UserModel;
var_dump($objUserModel); //@todo 後で消す
common.php
から config.php
を読み込んでおけば、忘れることもありません。
<?php
require_once 'config.php';
//本番の時には PRODUCTION に書き換える
define('MODE', DEVELOPPING);
// 開発モードのときにエラーを表示する
if (MODE === DEVELOPPING) {
ini_set('display_errors', true);
error_reporting(E_ALL);
} else {
ini_set('display_errors', false);
}
require_once BASE_DIR . '/autoload.php';
spl_autoload_register('autoloader');
<?php
/**
* 開発モード
*/
define('DEVELOPPING', 1);
/**
* 本番モード
*/
define('PRODUCTION', 2);
define('BASE_DIR', __DIR__);
<?php
function autoloader($name)
{
$arrToken = explode('\\', $name);
$arrToken[0] = '/classes';
$filename = BASE_DIR . implode("/", $arrToken) . '.class.php';
if (file_exists($filename)) {
require_once($filename);
}
}
ここまでできれば、ブラウザから index.php にアクセスすると、
object(MyApp\model\UserModel)[1]
private '_userId' => null
private '_password' => null
private '_displayName' => null
private '_email' => null
private '_token' => null
private '_loginFailureCount' => null
private '_loginFailureDatetime' => null
private '_deleteFlag' => null
上記のようにブラウザに表示されるはずです。
続きはまた後日…