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 詳しい方、ご教示のほど何卒宜しくお願い申し上げます。

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

まず、ビット演算の一般論としてですが、 3bit(3桁の2進数)で表現できる値は、10進数でいう1 , 2 , 4 と それの組み合わせの 1+2=3, 1+4=5, 2+4=6,1+2+4=7と、3bitともなしの0で つまり、0,1,2,3,4,5,6,7 の8通りの組み合わせがあります。 (ここでの使用用途では、そこまで組み合わせはないかもしませんが) リンク先のバグの説明では、 1bit目から3bit目までが有効の1+2+4の7という値を期待しているのに,実際は 1bit目から6bit目まで有効の1+2+4+8+16+32の63になってしまうと記載されています。 これを &7でビット演算することで、6bitを3bitに絞り込むことができます。 (7でANDすることで、3bitにビットマスクされます) 例 (1+2+4+8+16+32 ) & 7 → 7 (1+4+8+16+32 ) & 7 → 5 (1+8+16+32) & 7 → 1

chiku-san
質問者

お礼

ご丁寧な回答をありがとうございます! なるほど、6bitになる想定外の値を3bitに絞りこむための演算なのですね。 理解が進みました。 ビット演算の仕組みをもっと理解しないといけませんね。 基礎的な部分からわかりやすく解説してくれているサイトなど探して見たいと思います。

関連するQ&A

  • wordpressでワーニングが出て解決できません

    Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'comments_allow_only_column' not found or invalid function name in C:\xampp\htdocs\wordpress\wp-includes\plugin.php on line 170 ↓plugin.php の170行目の下記の★★部分でエラーが出ているようなのですが PHPの知識がないためどこが悪いのかわかりません。 フォームを設置した部分あたりから全てのページにエラーがでるようになってしまいました。 環境はローカルに設定しています。 $value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args'])); -------------------- function apply_filters($tag, $value) { global $wp_filter, $merged_filters, $wp_current_filter; $args = array(); // Do 'all' actions first if ( isset($wp_filter['all']) ) { $wp_current_filter[] = $tag; $args = func_get_args(); _wp_call_all_hook($args); } if ( !isset($wp_filter[$tag]) ) { if ( isset($wp_filter['all']) ) array_pop($wp_current_filter); return $value; } if ( !isset($wp_filter['all']) ) $wp_current_filter[] = $tag; // Sort if ( !isset( $merged_filters[ $tag ] ) ) { ksort($wp_filter[$tag]); $merged_filters[ $tag ] = true; } reset( $wp_filter[ $tag ] ); if ( empty($args) ) $args = func_get_args(); do { foreach( (array) current($wp_filter[$tag]) as $the_ ) if ( !is_null($the_['function']) ){ $args[1] = $value; ★★$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args'])); } どの辺を修正すればよいのでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • WORDPRESSのfunctions.php

    こんばんは。 タイトルの「functions.php」のカスタマイズについて、いろんなサイトで書かれています。 http://www.webcreatorbox.com/tech/customize-wordpress-admin-page/ 私も試そうと思っていますが、「wp-content/themes/(テーマ名)」の中と「wp-includes」の中と2つあります。 どっちのことでしょうか?

    • 締切済み
    • CSS
  • 未来サーバーとWordPress

    Filezira で未来サーバーにwordpressフォルダを転送しましたが、 下記のエラーが出ています。 Warning: require(/home/u670729528/public_html/wp-includes/load.php): failed to open stream: No such file or directory in /home/u670729528/public_html/wp-settings.php on line 21 Fatal error: require(): Failed opening required '/home/u670729528/public_html/wp-includes/load.php' (include_path='.:/usr/lib/php') in /home/u670729528/public_html/wp-settings.php on line 21 load.php か wp-settings.phpの内容がおかしいのでしょうか? wp-settings.phpの21行目を見ると require( ABSPATH . WPINC . '/load.php' );  と書かれています。 それと未来サーバーのデータベースは空ですが何も入れなくていいですか? 階層的には wordpressの直下にwp-settings.phpがあり、wordpressの直下の wp-includesフォルダの直下にload.phpがアップロードされています。

    • 締切済み
    • PHP
  • wordpressのエラーメッセージの対処方法

    wordpressのエラーメッセージを解消する方法についてご教示頂ける方 何卒宜しくお願い申し上げます。 【質問事項】 管理画面(ダッシュボード)から私が作成していますサイトにログインしようとID及びPASS を入力し、ログインを試みますと、以下のメッセージが発生し、ログインが不可能な状態 となりました。 解消する方法について、 ご教示賜われる方がいらっしゃいましたら、何卒宜しくお願い申し上げます。 ***以下エラーメッセージ*** Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 709 Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 710 Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 711 Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 712 ************************************************ 【エラーメッセージが出ることになった直接的な原因】 エラーメッセージが出る事になった原因。 functions.php修正によるもの。 * / / function.php(子テーマ) ADD_FILTER( 'widget_tag_cloud_args'、 'my_widget_tag_cloud_args'); 関数my_widget_tag_cloud_args($ argsを){ $ argsを=配列( '順番' => 'RAND'、 '数' => 50、 '最小'=> 8、 '最大' => 10 ); $ argsをを返します。 } (注)リターン$args;を入れ漏れていたことにより、     途中経過的として、サイト事態が白紙となり、     現段階の【メッセージ内容】になっております。 何卒宜しくお願い申し上げます。

  • wordpressのURL変更について

    http://0000.com/wpをhttp://0000.comに変更をしようと思いました。 まず設定画面からサイトの名前をhttp://0000.com/wpからhttp://0000.comに変更し、 index.phpをFTPから抜き <?php /** * Front to the WordPress application. This file doesn't do anything, but loads * wp-blog-header.php which does and tells WordPress to load the theme. * * @package WordPress */ /** * Tells WordPress to load the WordPress theme and output it. * * @var bool */ define('WP_USE_THEMES', true); /** Loads the WordPress Environment and Template */ require('./wp-blog-header.php'); ?> の↓を変更。 /** Loads the WordPress Environment and Template */ require('./wordpress/wp-blog-header.php'); ?> その後一つ上の層にindex.phpをあげたのですがサイトにアクセスすると、 Warning: require(./wordpress/wp-blog-header.php) [function.require]: failed to open stream: No such file or directory in /home/sites/heteml/users113/0/1/f/01f-boy/web/pimp/index.php on line 17 Warning: require(./wordpress/wp-blog-header.php) [function.require]: failed to open stream: No such file or directory in /home/sites/heteml/users113/0/1/f/01f-boy/web/pimp/index.php on line 17 Fatal error: require() [function.require]: Failed opening required './wordpress/wp-blog-header.php' (include_path='.:/usr/local/php5/php') in /home/sites/heteml/users113/0/1/f/01f-boy/web/pimp/index.php on line 17 と出てきてサイトが表示されません 。 wp-blog-header.phpがなにかあるのかと思い開けると下記のコードが書いてありました。 <?php /** * Loads the WordPress environment and template. * * @package WordPress */ if ( !isset($wp_did_header) ) { $wp_did_header = true; require_once( dirname(__FILE__) . '/wp-load.php' ); wp(); require_once( ABSPATH . WPINC . '/template-loader.php' ); } ?> しかし自分はphpがよくわからないためどこを変更すればhttp://0000.comでサイトが見れるのかわかりません。 教えてください。

    • ベストアンサー
    • PHP
  • WordPressの.htaccessについて

    こんにちは。 wordpressでマルチサイトの環境を設定しようとしています。 ネットワークの設置より、次のような.htaccessを/wordpress/ディレクトリに配置しました。 --- RewriteEngine On RewriteBase /wordpress/ RewriteRule ^index\.php$ - [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L] --- このファイルを配置しなくても、 http://domain.jp/wordpress/wp-admin/network/setup.php や http://domain.jp/wordpress/wp-admin/network/users.php は表示されますし、 http://domain.jp/wordpress/ にアクセスすると1つ目のブログが表示されます。 しかしこのファイルを配置しない場合、新たに作成した2つ目のブログである http://domain.jp/wordpress/test01/ は表示されません。ファイルを配置した場合は表示されます。 しかし、ディレクトリを見ても/wordpress/にはtest01ディレクトリは存在しません。おそらくは何らかの転送を行っているのだと思いますが、上記の.htaccessファイルを配置した場合、 http://domain.jp/wordpress/test01/ はどういう法則で、どこに転送されるのでしょうか。 どなたか教えてください。よろしくお願いいたします。

    • 締切済み
    • PHP
  • Wordpress初心者です

    wordpress初心者です。 wordpressを勉強しようとしていて、最初でつまづいてしまいました。 XAMPPを導入して、htdocs/wordpress/wp-content/themes/twentythirteen/index.php をhttp://localohst/wordpress/wp-content/themes/twentythirteen/index.php で表示させようとしたら、 Fatal error: Call to undefined function get_header() in C:\xampp\htdocs¥wordpress\wp-content\themes\twentythirteen\index.php on line 17 とエラーが出てしまって表示できません。何が原因でどのように対処すればよいのでしょうか? よろしくお願いします。

    • 締切済み
    • CSS
  • wordpressの記事にブックマークを設置したい

    wordpress の記事にブックマーク一覧を設置したいと考えております。 wp-hatena というプラグインをアップ→有効化し、 以下のようなコードを埋め込むとのことなのですが、 どこに埋め込むべきかがわかりません。 ※参照 http://wppluginsj.sourceforge.jp/wp-hatena/ <?php if(isset($wph)) { $wph->addHatena(); $wph->adddelicious(); }?> 上記以外にもyahooブックマーク等も取り揃えたく。 ちなみに、バージョンはは2.7.1です。 宜しくお願い致します。

  • 関数に@を付けて呼び出す

    Wordpressのwp-includes/functions.phpに、この様な記述がありますが、 return @unserialize( $original ); @header( 'X-Content-Type-Options: nosniff' ); 関数に@を付けて呼び出した場合、@を付けない呼び出しとどう違うのでしょうか。

    • ベストアンサー
    • PHP
  • wordpressのインストールについて

    質問の内容を書いてくださいwordpress最新版をダウンロード、ffftpで、サーバー(ロリポップhttp://3kaduki.girly.jp/haka/)にフォルダの名前だけ変えてアップロードしました。 http://3kaduki.girly.jp/haka/3ka_blog/ にwordpressが入ったはずなので、 http://3kaduki.girly.jp/haka/3ka_blog/ にアクセスしました。 すると、データベースの設定画面になるとネットには書いてありましたが、なりません。 英文エラーになります。 Warning: require_once() [function.require-once]: Unable to access /home/users/2/girly.jp-3kaduki/web/haka/3ka_blog/wp-includes/load.php in /home/users/2/girly.jp-3kaduki/web/haka/3ka_blog/wp-load.php on line 48 Warning: require_once(/home/users/2/girly.jp-3kaduki/web/haka/3ka_blog/wp-includes/load.php) [function.require-once]: failed to open stream: No such file or directory in /home/users/2/girly.jp-3kaduki/web/haka/3ka_blog/wp-load.php on line 48 Fatal error: require_once() [function.require]: Failed opening required '/home/users/2/girly.jp-3kaduki/web/haka/3ka_blog/wp-includes/load.php' (include_path='.:/usr/local/php5.2/php') in /home/users/2/girly.jp-3kaduki/web/haka/3ka_blog/wp-load.php on line 48 助けてもらえませんか。よろしくおねがいします。 ちなみに、ロリポップには簡単インストールと云う便利ツールからインストールできましたが、 現在、休止中で、復旧のメドも立っていないのです(>_<")