wordpressのソースを読みながらPHPを勉強する その2

Uncategorized

【シリーズ一覧】 /wp-load.php

error_reporting()はどんなエラーを出力するかを設定するもの。デフォルトでは”E_ALL &~ E_NOTICE”らしい。^は排他的論理輪だから、E_ALLからE_NOTICEとE_USER_NOTICEのビットを0にしたもの(これらを無効にしたもの)に設定する。しかしこのE_ALLは6143(=1011111111111)あるいは30719(=111011111111111)と言う中途半端な値になっている(バージョンによって違う?)。いずれにしても12bit目が0になっている。じゃあこのビットは何かというと、E_STRICT=2048=100000000000だ。このE_STRICTというのは特別扱いなのか。わかりずらい。 E_STRICTはPHPコードに対していろいろなアドバイスをしてくれるもののようだ。E_NOTICEとE_USER_NOTICEの違いはUSERの方は、trigger_error()を使ってエラーを表示させる。というよりtrigger_error()はUSER系のエラーしか発生させられないので、コードの中で独自のエラー処理のためのものだと思われる。PHP本体からUSER系のエラーが発生されることはないのだろう。 PHPではエラーが発生したとき呼ばれる関数をset_error_handlerで登録できるので、それを呼びたいときにtrigger_error()を使ってUSER系のエラーを発生させる。といってもこの関数が呼ばれるかどうかはerror_reporting()の設定には依存しないので、エラーハンドラの中でerror_reportingの値を見なければならない。しかし見ると言っても取得関数がないようだが、2回呼ばなければならないのか?それともini_get()を使えばいいのか? そもそもini_set()があるのにerror_reporting()関数があるのはなぜだろうか?よくわからないのでスルー。 /wp-load.php

file_existsはその名のとおりファイルがあるかを調べてくれる。ディレクトリでも調べる。しかしPHPは内部にキャッシュを持っているようで、いったんこの関数がTrueを返した後ファイルを削除してからまた呼んでもTrueを返すらしい。もちろんここでいう削除は同じスクリプト内でのunlink()によるものではない場合。こういう場合はclearstatcache()を呼ばなければならない。んーー。 wp-config.phpがなければwordpressはまだインストールされていないものとしてインストーラが動くようだ。よってこのファイルをみれば各種設定がみれるだろう。 /wp-settings.php

WP_MEMORY_LIMITはこれまでどこでも設定されていないので’32M’が設定される。PHPの’memory_limit’の値がこれより低ければ大きくする。 しかしintval()に’32M’を渡しても32ににしかならないような気がする。memory_limitの値は文字列’32M’を受け付けるが数値の場合はバイトのようだ。よってWP_MEMORY_LIMITを設定する場合は数値にした方がよさそう。

wordpressのソースを読みながらPHPを勉強する その1

Uncategorized

【シリーズ一覧】 /index.php

WP_USE_THEMESをtrueにセット。 defineは定数を定義する。定義されて定数は”$”なしで参照できる。すでに定義されているかを調べるにはdefined()を使う。変数にdefineされたものが入っている場合はconstant()を使う。一度定義された定数は変更できない。定数はどこらかでも参照できる。

WP_USE_THEMESをfalseにするとなにも表示されなくなる。現在のところ使い道不明。 /index.php

requireはファイルを読み込んで実行する。includeとの違いはエラー処理のみで、requireはエラーになるとスクリプトの実行がとまる。 /wp-blog-header.php

issetは変数がセットされていればtrueを返す。「セットされている」とは一回も”=”で値が代入されてないか、NULLがセットされいる状態を言うらしい。empty()というのもあり、これは0とか空文字とか空arrayのときtrueを返す。

他のファイルで使われている変数があって、そのファイルをrequireしたファイルでその変数をisset()をした場合はtrueになるし、値はそのファイルで設定した値になる。つまりrequireやincludeは名前空間的には同じになるようだ。 関数の中で使った変数は関数の外ではissetにならない(falseを返す)。しかし以下の例では$aはissetにならない。

以下の場合もnotを返す。

これはsetを返して欲しかったんだが、なぜnotなのか。phpでは関数外で書かれた変数は全部global扱いなので、上のように書いても意味はないのだろう。そこで以下のようにしたら、setになった。

実行されない限りglobalも評価されないということだろう。では関数内で変数がglobalかどうか知るにはどうすればいいのかというと$GLOBALS[]を使えばいいらしい。

よって変数$wp_did_headerはif文の中を1回だけ実行されるようにしたいのだろう。しかしそれならdefineを使ったほうがいいと思うが、defineよりも緩くしたということだろうか。 /wp-blog-header.php

__FILE__はマジックコンスタントといって自分のファイルのパスをフルパスで返す。4.0.2以降はシンボリックリンクも解決してくれる。dirname()はディレクトリを返すので、この文はこのファイルがあるディレクトリにあるwp-load.phpをrequire_onceする。require_onceは一回だけrequireすることだろう。しかしこの場合以下のように書いてはいけないのだろうか。

phpにはカレントディレクトリを変える関数もあるし、デフォルトのカレントディレクトリは最初に実行されたファイルのディレクトリになると思うので、dirname(__FILE__)として自分と同じディレクトリにしているのだろう。ちなみにマジックコンスタントとして以下のようなものもある。 __LINE__ : これがかかれている行番号 __DIR__ : dirname(__FILE__)と同じ。5.3.0から利用可能 __FUNCTION__ : 実行されている関数 __CLASS__, __METHOD__,__NAMESPACE__ : 省略。 おわり