toma-stkのCakePHP自習室

2008-01-25cake/configure.php - 初期化 (CakePHP解析 #5) このエントリーを含むブックマーク

前回の続きです。「cake/bootstrap.php」が「cake/configure.php」を読み込んでConfigureインスタンス(Singleton)を作っていますので、今日はこのConfigureインスタンスの動きをちょこっと解析。

bootstrap.phpから、&getInstanceメソッドが呼び出されていますね。このメソッドの中身は下記のとおり。

(※<?phpハイライトカラーを有効にするために記述しています)

<?php
function &getInstance() {
	static $instance = array();
	if (!$instance) {
		$instance[0] =& new Configure;
		$instance[0]->__loadBootstrap();
	}
	return $instance[0];
}
?>

PHP4のSingletonの挙動については、前回のエントリーで書いたので省略。ちょっと分からないのは、呼び出し元が次のようにしているところ。

<?php
$paths = Configure::getInstance();
?>

「::」はインスタンス化無しでstaticなメソッドを実行ということなんだろうけど、PHP4の場合は戻り値変数がstatic宣言されていれば、そのメソッドはstaticなメソッドでみなされるのかな?

うーん、よく分からん。次に進めちゃいます。


次は「__loadBootstrap()」ですが、これはConfigureクラスの一番下に定義されています。中身をみると自分で自分を初期化しているって感じかな。途中で「app/config/bootstrap.php」を読み込んでいますね。

この「app/config/bootstrap.php」ファイルはどうやら、作り手に対して「アプリケーション全体のグローバルな定数や関数を定義したり、または、それらが定義されているファイルを読み込みなよっ」て言っているんだと思います。

次回はConfigureクラスをもうちょっと突っ込んで解析してみたいと思います。

qjdjeophedqjdjeophed2013/07/26 07:16jspdstuvezsppn, <a href="http://www.ytoyjvkxqk.com/">vkpkdidjhk</a> , [url=http://www.lerzvwkvde.com/]iikdmemgqs[/url], http://www.tanuzceqoo.com/ vkpkdidjhk

rftokdguxcrftokdguxc2014/01/20 08:17rngewtuvezsppn, <a href="http://www.qpjhmlthou.com/">vlzogukklz</a>

wgkqwbzcitwgkqwbzcit2014/01/22 23:47mtpxktuvezsppn, <a href="http://www.ohmjtshgfb.com/">frtnameiem</a>

flzifyczckflzifyczck2014/01/26 02:12mnldttuvezsppn, http://www.vzqpmkirhr.com/ gsqssvepow

2008-01-24cake/bootstrap.php - Configureクラスとシングルトン (CakePHP解析 #4) このエントリーを含むブックマーク

本日は「bootstrap.php」の解析ですが、このファイルはCakePHPのかなり重要な部分な感じがします。

ちょこっとずつ進めていきます。

まずは↓から。

require LIBS . 'configure.php';
$paths = Configure::getInstance();

cake/libs内のconfigure.phpを読み込んだ後、インスタンスを取得しています。getInstance()から、Singleton(シングルトン)であることが分かります。PHP4のシングルトンの解説は下記のサイトが分かりやすいです。

http://www.doyouphp.jp/sample/sample_class_dp_singleton.shtml


また、&getInstance()メソッドの「&」や「&=」の意味は「てくめも@coop」さんのサイトに解説が載っています。

http://www.ecoop.net/memo/2007-10-22-1.html

ソッド定義とメソッド呼び出しの両方に & を付けないと、参照でなくコピーになってしまい…

今日はあまり時間がないので、ここまでorz

次回はbootstrap.phpが「Configure」インスタンスで何をしているのか解析したいと思います。

2008-01-21/app/webroot/.htaccess(CakePHP解析 #3) このエントリーを含むブックマーク

本日は「/app/webroot/.htaccess」を解析します。

ソースは下記のとおり。

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

</IfModule>


RewriteCond

RewriteCondはURLをRewriteする条件になります。

「%{REQUEST_FILENAME}」は「要求したファイル名(フォルダ名)が」という意味。

URL指定で、「/app/webroot/aaa」ならば「aaa」がそれに当たります。

そして「!-d」は、この例であれば「aaa」というフォルダが存在するのであればRewriteしない。「!-f」はファイルが存在するのであればRewriteしないということになります。

この処理については、phaさんが自習室で詳しくまとめられています。

http://studyroom.g.hatena.ne.jp/pha/20070511/p1


QSAとは?

次にRewriteRule ^(.*)$ index.php?url=$1 [QSA,L]ですが、

URL書き換え部分は(.*)が$1に書き換わります。

「/app/webroot/aaa」でアクセスしたら、「/app/webroot/index.php?url=aaa」となります。

後にくっついている[QSA,L]の「QSA」の意味ですが、とみぞーノートさんのサイトに詳しくまとめられています。

http://wiki.bit-hive.com/tomizoo/pg/mod_rewrite%20-%20QSA%A5%D5%A5%E9%A5%B0



次のエントリーでは「cake/bootstrap.php」を解説したいと思います。

OsmanOsman2012/08/19 10:17Now I know who the brinay one is, I'll keep looking for your posts.

fhxszsddnhfhxszsddnh2012/08/19 20:254clhI7 <a href="http://pkzssbdpvtql.com/">pkzssbdpvtql</a>

yazhedfyazhedf2012/08/21 19:42ggn9xi <a href="http://dwnckwocaqww.com/">dwnckwocaqww</a>

2008-01-19/.htaccess(CakePHP解析 #2) このエントリーを含むブックマーク

前回は「app/webroot/index.php」から学習をスタートしましたが、じゃぁ「index.php」や「app/index.php」どうなっているのかと言いますと.htaccessによってシカトされてますね。おそらくmod_rewriteが使えない場合の対策なのでしょうが、その場合の処理まで解析していてはキリがありません。今日は最上層にある/.htaccessの解析をします。

/.htaccess(app/.htaccessもほぼ同じ内容)

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteRule ^$ app/webroot/ [L]

RewriteRule (.*) app/webroot/$1 [L]

</IfModule>


<IfModule mod_rewrite.c>~</IfModule>

まずは、<IfModule mod_rewrite.c>~</IfModule>ですが、これはmod_rewriteモジュールが有効かどうか調べて、有効であれば中身の処理を実行するという意味です。


RewriteEngine on以下

次に中身の解説ですが、こちらの技林さんのサイトの解説が凄く分かりやすいです。この処理でapp/webroot/に飛ばしているわけですね。

http://tech.bayashi.net/svr/doc/apache/mod_rewrite.html


正規表現は欠かせません

また、mod_rewriteを知る上で正規表現の知識は欠かせません。自分の正規表現入門お薦めサイトはこちらのサイトです。

http://www.mnet.ne.jp/~nakama/

更に正規表現を理解したい人はやはり「フクロウ本」を読むことをお奨めします。

詳説 正規表現 第2版

詳説 正規表現 第2版


[L]って何?

これまた、技林さんのサイトの解説が分かりやすいです。

http://tech.bayashi.jp/archives/entry/techweb/2007/001981.html

1つ目でマッチしたら、それ以降は実行しないということですね。


(.*) app/webroot/$1だけで良くね?

と思って、ローカル環境で^$ app/webroot/を外して試してみましたが普通に動きました。うーん、でもやっぱ何かしらの理由があるんだろうな…。誰か分かる方いらっしゃいましたら教えてください(><)


次のエントリーでは「app/webroot/.htaccess」を解説したいと思います。

2008-01-17app/webroot/index.php(CakePHP解析 #1) このエントリーを含むブックマーク

今日から、はてな自習室を使ってCakePHPを解析しつつPHPCakePHPを勉強していきたいと思います。

よろしくお願いします。m(_ _)m

まずは「app/webroot/index.php」からですが、ここで肝になるのは『include_path』ではないでしょうか。

<?php
if (!defined('CORE_PATH')) {
	if (function_exists('ini_set')) {
		ini_set('include_path',
 CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS .
 APP_DIR . DS . PATH_SEPARATOR . ini_get('include_path'));
		define('APP_PATH', null);
		define('CORE_PATH', null);
	} else {
		define('APP_PATH', ROOT . DS . APP_DIR . DS);
		define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
	}
}
?>

で、include_pathってなんぞや?ってなるわけですが、こちらのデジットさんの説明がとっても分かりやすいです。

http://digit-01.com/ownpage/php_include_path.html

ここが重要ですね。探す順番。

PHP実行ファイルからrequire()、include()等で読み出されるファイルは、次の順番で探されます。

1. include_pathで設定されているディレクトリ

2. 実行しているファイルのあるディレクトリ

3. ./ 又は ../ で始まっている場合は、 実行しているファイルのあるディレクトリからの相対パス

更に、require()、include()されたファイル(例えば「inc.php」)の中にrequire()、include()がある場合は、当然上記のディレクトリを探した後に「inc.php」ファイルがあるディレクトリも探します。

自分の環境で「var_dump(ini_get('include_path'));」としてみたところ次のように出力されました。

string(57) "C:\www\schedule;C:\www\schedule\app\;.;C:\xampp\php\pear\"

CakePHPのフォルダを配置した場所が「C:\www\schedule」なので、CakePHPのルートに当たるディレクトリとその下層の「app」フォルダがinclude_pathに追加されたようです。ちなみに「.;C:\xampp\php\pear\」はphp.iniファイルに設定されていました。

このinclude_pathの設定により、requireやincludeでいちいち相対パスを指定する必要が無くなるわけですね。include_pathの概念がよく分かってなかったので早速勉強になりました。

IliasIlias2012/08/18 18:54My hat is off to your astute cmmoand over this topic-bravo!

sxrwtrdfxjysxrwtrdfxjy2012/08/19 07:48H9vMW2 <a href="http://kjpsoprdybvt.com/">kjpsoprdybvt</a>

ogqrmwouioogqrmwouio2012/08/20 06:09JHixxc , [url=http://pihhhtgutjsz.com/]pihhhtgutjsz[/url], [link=http://kujnvfsfrqri.com/]kujnvfsfrqri[/link], http://gtgfhvuxnasp.com/