PHP5にはクラスのオートローディングという便利な関数(function __autoload())があります。
未定義のクラス/インターフェイスを使用しようとした時に 自動的にコールされる __autoload 関数を定義することができます。 この関数をコールすることにより、 スクリプトエンジンは、PHPがエラーで止まる前にクラスをロードする最後の チャンスを与えます。これを使ってモデルを呼べれば楽なんですよね。そうすると
引用元:php.net
$this->load->model('model-name'); $this->model-name->function();という書き方から以下のように普通のPHP5の書き方に変えられる。
$model = new Model-name; $model->function();
そこで軽く調査してみたんですが、どうやら以下のサイトのような方法が多数散見されました。
6 CodeIgniter Hacks for the Mastersほうほう、config/config.phpの最後に__autoload()を入れるとな。
http://net.tutsplus.com/tutorials/php/6-codeigniter-hacks-for-the-masters/
・・・いやいやいや、これダメだろ(゜Д゜) ??
config.phpの最後になんか入れたらログとかベンチマークとか全部こっちいっちゃうんじゃ?
ということで念のためテスト。config.phpの最後にコピーしてlog_messageで何をロードしようとしてるかチェック。
config/config.php
function __autoload($class) { log_message('debug', 'Trying to load class: '.$class); if(file_exists(EXTPATH."models/".strtolower($class).EXT)) { include_once(EXTPATH."models/".strtolower($class).EXT); } }
■ 結果
思った通り。load_class()で呼んでるものは全部オートロードに行っちゃう。この方法は採用しちゃダメな方法です。
それならどうすればいいのか?
正解はspl_autoload_registerを使う、です(断言しちゃったけど大丈夫かな?w)
オートローディングを追加するなら、ヘルパにしてautoload.phpに追加するのが一番簡単でいいんじゃないでしょうか。
(個人的にはファイルが増えるの嫌なのでLoader.phpにstaticメソッドを作ってcore/Controller.phpの最後に追加してますが)
■ spl_autoload_registerをコールするヘルパ
spl_autoload_register — 指定した関数を __autoload() の実装として登録するサンプルヘルパ: spl_autoload_helper.php
http://nz.php.net/manual/ja/function.spl-autoload-register.php
引用元:php.net
<?php /** * SAMPLE SPL Autoload Helper * ファイル名、メソッド名は適宜修正してください。 */ function sample_loader($class) { if(file_exists(APPPATH."models/".strtolower($class).EXT)) { log_message('debug', 'Load '.$class.' models in php5 style'); include_once(APPPATH."models/".strtolower($class).EXT); } } spl_autoload_register('sample_loader');上記ではモデルだけ追加してますが、ライブラリもヘルパも追加することが可能です。
$this->load->model(~~~) とか面倒な人向けの方法でした。
0 件のコメント:
コメントを投稿