※ ChatGPTを利用し、要約された質問です(原文:wordpressのソースコード内の論理演算の意味)
WordPressソースコードの論理演算の意味について
このQ&Aのポイント
WordPressのソースコード内にある論理演算に関して、ビット演算子を使用して設定オプションの変更可能性を判断しています。
ビットマスク値として定義された数値と、INI_ALLやINI_USERとのビット演算を行い、ユーザースクリプトでの変更可能性を判定しています。
このような判定方法は、PHPのバグに関係しており、特定のバージョンで発生するaccessレベルの変更を回避するために使用されています。
wordpressのソースコード内の論理演算の意味
wordpressのソースコードを読んでいるphp初心者です。
どうしても理解できない部分があり質問させて頂きます。
wp-includes/load.phpの中に、以下のようなコードが書かれています。
if ( ! isset( $ini_all ) ) {
$ini_all = false;
// Sometimes `ini_get_all()` is disabled via the `disable_functions` option for "security purposes".
if ( function_exists( 'ini_get_all' ) ) {
$ini_all = ini_get_all();
}
}
// Bit operator to workaround https://bugs.php.net/bug.php?id=44936 which changes access level to 63 in PHP 5.2.6 - 5.2.17.
if ( isset( $ini_all[ $setting ]['access'] ) && ( INI_ALL === ( $ini_all[ $setting ]['access'] & 7 ) || INI_USER === ( $ini_all[ $setting ]['access'] & 7 ) ) ) {
return true;
}
[wordpress 関数解説URL]
https://developer.wordpress.org/reference/functions/wp_is_ini_value_changeable/
https://core.trac.wordpress.org/browser/trunk/src/wp-includes/load.php (1017行目)
ini_get_all()で取得したphpの設定オプション(ディレクティブ名をキーとする連想配列)のaccessの値をチェックして、変更可能かどうかを判断しているように見えますが、以下の比較の意図がわからずに困っています。
INI_ALL === ( $ini_all[ $setting ]['access'] & 7 )
INI_USER === ( $ini_all[ $setting ]['access'] & 7 )
$ini_all[ $setting ]['access']の値がビットマスク値になっていて1,2,4,7のいずれかの整数で、それを定義済み定数のINI_ALL(7)やINI_USER(1)と比較して、ユーザースクリプト (ini_set() などで) で変更できるか、できないかを判断して戻す雰囲気はわかるのですが、なぜビット演算子&で7とつなげて、比較する必要があるのですか?
おそらく、以下のページに書いてあるphpのバグに関係しているように思われますが、こうすることでなぜ回避できるのか理解できずに困っています。
https://bugs.php.net/bug.php?id=44936
詳しい方、ご教示のほど何卒宜しくお願い申し上げます。
お礼
ご丁寧な回答をありがとうございます! なるほど、6bitになる想定外の値を3bitに絞りこむための演算なのですね。 理解が進みました。 ビット演算の仕組みをもっと理解しないといけませんね。 基礎的な部分からわかりやすく解説してくれているサイトなど探して見たいと思います。