WordPressでのコンストラクタ呼び出し

WordPressでのコンストラクタ呼び出し はコメントを受け付けていません。 Technical, Wordpress

WordPress4.3.0が公開されて早1週間ほど。
皆さんも、そろそろ落ち着いたかなと更新された方も多いのではないでしょうか。
そこで、6割くらいの方が出会うのではなかろうかと思われるエラーログがあります。
今回はそれについての対処をメモしておきたいと思います。

エラーログ

さて、そのエラーログとはどういったものなのか。
引っ張る必要も無いので書いてしまいます。

 PHP Notice:  呼び出された WP_Widget のコンストラクターメソッドはバージョン 4.3.0 から<strong>非推奨</strong>になっています! 代わりに <pre>__construct()</pre> を使ってください。 in /(略)/wp-includes/functions.php on line 3457

こういった内容のエラーが吐出される事があるかと思います。
例ではWP_Widgetコンストラクタについてですが、他にもクラスを拡張して使用している物があればそれが表記されているかと思います。

どうしてこのような内容が出力されるようになったのかといいますと、今回のChangelogに以下のような内容があります。

PHP7 is slated for release later this year. One of the changes is that PHP4 style constructors are deprecated. In order to prepare WordPress to support PHP7, these constructors have been deprecated in WordPress core.

簡単に言うと、
PHP4スタイルの書き方でコンストラクタを書いている場合は、もう非推奨ですから書き方を変えてくださいね。
これはPHP7への準備ですよ。
と言った感じでしょうか。

つまり、コンストラクタをクラスと同名の関数を作って設定しているものに関しては、その方法をやめて、__construct()を使用するようにしてください。ということです。

ではどう対処すべきなのか

最近更新が行われているほとんどのプラグイン等に関しては、拡張された自身のクラスコンストラクタについては、__construct()を使用していると思われます。
ただし、そのコンストラクタから拡張元のコンストラクタを呼び出す時に$this->ClassName()と言った形で呼び出しているものがあるようです。
この呼び出し方に対してエラーを出力しています。

例えば、WP_Widgetを拡張したMy_Widgetというクラスをつくっていた時に、

public function __construct() {
// 処理

$this->WP_Widget( $base_id, $widget_name, $option );
}

といった形の処理が行われているものが残っています。

そこでこの呼出を

parent::__construct( $base_id, $widget_name, $option );

このような形式で書き換える事でエラーメッセージは出力されないようになるはずです。

何をしているかといえばparentつまり拡張元のコンストラクタを呼び出しています。
WordPressにはPHP4系のサーバで動作することも考慮して旧形式のコンストラクタも用意されているため、このような形式で書かれたプラグインも少なくないようです。

今後はプラグイン毎に公式対応してくれるかとは思いますが、エラーログが先に挙げたような無いようで埋められてしまうのも鬱陶しいですので、とりあえず書き換えておくというのも良いかもしれません。
また、今回の部分についてはフックなどがまずありませんので、直接書き換えになるかとは思います。
今後のプラグイン更新内容によっては更新後にこのエラーメッセージが復活する可能性もありますので、その際には同様の部分を調べてみてください。

また、コアな部分の修正になりますので十分にテストを行い、バックアップを取った上での修正をお勧めいたします。
この件に関しましての責任は負いかねますので、ご了承ください。

それでは。

Comments are closed.