「Fatal error: Call-time pass-by-reference has been removed」の対処

PHP 5.4 にアップデートした際に古いバージョンの WP Multibyte Patch を使っていると、以下のようなエラーが表示されることがあります。

Fatal error: Call-time pass-by-reference has been removed in /path/to/wordpress/wp-content/plugins/wp-multibyte-patch/ext/ja/class.php on line 74

このエラーの対処法について説明します。

ちなみに最新バージョンの WP Multibyte Patch では、このエラーは発生しないのでアップデートすれば良いだけなのですが、「対処しないと WP のダッシュボードに入れないんよ」っていう人を想定して書いてます。
# まぁ、最新の WP Multibyte Patch をダウンロードして、上書きしてやればいいだけですが
# あと、他のプラグイン・テーマでも、このエラーが発する可能性がありますし

エラーの原因

PHP 5.4 では、Call-time pass-by-reference (関数呼び出し時の強制参照渡し) 機能が削除されました。
ちなみに今までは php.ini で「allow_call_time_pass_reference」を ON にすれば ( デフォルトで ON です )、この機能が使えていました。
ただし、以下の記述のように将来的に廃止されると宣言されていた機能です。

関数のコール時に引数を強制的に参照で渡す機能の有効/無効を設定 します。この機能は過去のものであり、将来のバージョンの PHP/Zendではサポートされない可能性があります。 推奨される方法は、関数宣言時に参照渡しとするべき引数を指定す る方法です。将来のバージョンでの動作を保障するために、このオ プションをoffとし、スクリプトがこの状態で正しく動作することを 確認することが推奨されます。 (この機能を使用する度に警告が発生し、引数は参照ではなく値で渡 されます。)

関数コール時に参照で引数を渡すことは、コードの明解さを損なうために 廃止されています。関数は、引数が参照渡しであると宣言されて いない場合でも、文書化されていない方法で、その引数を修正できます。 副作用を回避するためには、どの引数を参照渡しとするかを関数宣言でのみ 指定すると良いでしょう。

細かいバージョンは確認していませんが、WP Multibyte Patch の古いバージョンでは、以下のようにこの機能を使用している所がありました。

wp-multibyte-patch/ext/ja/class.php

    $phpmailer_props = $this->get_phpmailer_properties(&$phpmailer);
    $recipient_methods = array('to' => array('add' => 'AddAddress', 'clear' => 'ClearAddresses'), 'cc' => array('add' => 'AddCC', 'clear' => 'ClearCCs'), 'bcc' => array('add' => 'AddBCC', 'clear' => 'ClearBCCs'));

$this->get_phpmailer_properties(&$phpmailer) の引き数 $phpmailer に参照渡しを意味する & がついてますね。
そのため Fatal Error が発生してしまい、画面が真っ白になったりするのです。

修正方法

wp-multibyte-patch/ext/ja/class.php 74行目の get_phpmailer_properties() の引き数 &$phpmailer の先頭の & を消去します。

    $phpmailer_props = $this->get_phpmailer_properties($phpmailer);
    $recipient_methods = array('to' => array('add' => 'AddAddress', 'clear' => 'ClearAddresses'), 'cc' => array('add' => 'AddCC', 'clear' => 'ClearCCs'), 'bcc' => array('add' => 'AddBCC', 'clear' => 'ClearBCCs'));

続いて、44行目の function get_phpmailer_properties() の関数宣言の方で参照渡しであることを明示します。

  function get_phpmailer_properties(&$phpmailer) {
    $array = (array) $phpmailer;
    $new = array();
    foreach($array as $key => $value) {
      $key = preg_replace("/^\\0[^\\0]+\\0/", "", $key);
      $new[$key] = $value;
    }
    return $new;
  }

これで Fatal Error が出なくなって、WordPress にログインできるようになるので、あとはちゃんとプラグイン・テーマ・コアを最新バージョンにアップデートしてやってください。
他のプラグインなどでも、同様のエラーが出る場合は、この方法で対処できます。
もし、最新バージョンにアップデートしても、まだこのエラーが出るようなプラグインの場合は、投げ捨ててしまいましょう。

では、よい PHP 5.4 ライフを!

コメントを残す

メールアドレスが公開されることはありません。