/index.php
1 define('WP_USE_THEMES', true);
WP_USE_THEMESをtrueにセット。
defineは定数を定義する。定義されて定数は”$”なしで参照できる。すでに定義されているかを調べるにはdefined()を使う。変数にdefineされたものが入っている場合はconstant()を使う。一度定義された定数は変更できない。定数はどこらかでも参照できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php define('AAA', 1); echo AAA; # 1を出力 $v = "AAA"; echo constant($v); # 1を出力 define('AAA', 2); # PHP Notice: error echo AAA; # 1を出力。2にはならない。 echo BBB; # PHP Notice: error # BBBをそのまま出力 $x = CCC; # PHP Notice: error echo $x; # CCCを出力 ?> |
WP_USE_THEMESをfalseにするとなにも表示されなくなる。現在のところ使い道不明。
/index.php
1 require('./wp-blog-header.php');
requireはファイルを読み込んで実行する。includeとの違いはエラー処理のみで、requireはエラーになるとスクリプトの実行がとまる。
/wp-blog-header.php
12 if ( !isset($wp_did_header) ) {$wp_did_header = true;
issetは変数がセットされていればtrueを返す。「セットされている」とは一回も”=”で値が代入されてないか、NULLがセットされいる状態を言うらしい。empty()というのもあり、これは0とか空文字とか空arrayのときtrueを返す。
1 2 3 4 5 6 7 8 9 10 11 12 |
$a=0; $b=NULL; $c=false; $d = 1; unset($d); echo $e; echo isset($a) ? "set" : "not"; # setを返す echo isset($b) ? "set" : "not"; # notを返す echo isset($c) ? "set" : "not"; # setを返す echo isset($d) ? "set" : "not"; # notを返す echo isset($e) ? "set" : "not"; # notを返す |
他のファイルで使われている変数があって、そのファイルをrequireしたファイルでその変数をisset()をした場合はtrueになるし、値はそのファイルで設定した値になる。つまりrequireやincludeは名前空間的には同じになるようだ。
関数の中で使った変数は関数の外ではissetにならない(falseを返す)。しかし以下の例では$aはissetにならない。
1 2 3 4 5 6 7 8 |
<?php global $a; function f() { $a = 200; } echo isset($a) ? "set" : "not"; # notを返す。 ?> |
以下の場合もnotを返す。
1 2 3 4 5 6 7 8 9 |
<?php global $a; function f() { $a = 200; } f(); echo isset($a) ? "set" : "not"; # notを返す。 ?> |
これはsetを返して欲しかったんだが、なぜnotなのか。phpでは関数外で書かれた変数は全部global扱いなので、上のように書いても意味はないのだろう。そこで以下のようにしたら、setになった。
1 2 3 4 5 6 7 8 9 10 |
<?php function f() { global $a; $a = 200; } echo isset($a) ? "set" : "not"; # notを返す。 f(); echo isset($a) ? "set" : "not"; # setを返す。 ?> |
実行されない限りglobalも評価されないということだろう。では関数内で変数がglobalかどうか知るにはどうすればいいのかというと$GLOBALS[]を使えばいいらしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php function f1() { global $a; $a = 200; f2(); } function f2() { echo isset($a) ? "set" : "not"; # not echo isset($GLOBALS['a']) ? "set" : "not"; # set echo isset($b) ? "set" : "not"; # not echo isset($GLOBALS['b']) ? "set" : "not"; # set } $b = 1; f1(); ?> |
よって変数$wp_did_headerはif文の中を1回だけ実行されるようにしたいのだろう。しかしそれならdefineを使ったほうがいいと思うが、defineよりも緩くしたということだろうか。
/wp-blog-header.php
1 require_once( dirname(__FILE__) . '/wp-load.php' );
__FILE__はマジックコンスタントといって自分のファイルのパスをフルパスで返す。4.0.2以降はシンボリックリンクも解決してくれる。dirname()はディレクトリを返すので、この文はこのファイルがあるディレクトリにあるwp-load.phpをrequire_onceする。require_onceは一回だけrequireすることだろう。しかしこの場合以下のように書いてはいけないのだろうか。
1 |
require_once( './wp-load.php' ); |
phpにはカレントディレクトリを変える関数もあるし、デフォルトのカレントディレクトリは最初に実行されたファイルのディレクトリになると思うので、dirname(__FILE__)として自分と同じディレクトリにしているのだろう。ちなみにマジックコンスタントとして以下のようなものもある。
__LINE__ : これがかかれている行番号
__DIR__ : dirname(__FILE__)と同じ。5.3.0から利用可能
__FUNCTION__ : 実行されている関数
__CLASS__, __METHOD__,__NAMESPACE__ : 省略。
おわり