質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.33%

PHP7環境で「WordPress Importer」を使うとエラーになる件について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,533

aw10

score 17

「数件のstrict standards/noticeでのアップデートリリースはしない」方針のようで、代わりに(有志による?)修正バージョンを見つけました。
修正verの変更点について、自分なりに考えてみたのですが、わからない部分があり、質問させていただきます。

※参考URL
修正版→http://pastebin.com/14xJER5S
フォーラムトピック→https://wordpress.org/support/topic/php-deprecated-class-constructor-name-with-php7

<変更点>
・66行目…(1)
function WP_Import() { /* nothing */ }

public function __construct(){ /* nothing */ }

・798行目…(2)
$$meta['key'] = $meta['value']

${$meta['key']} = $meta['value']

・1032行目…(3)
screen_icon();        // 削除

・1110行目…(4)
function bump_request_timeout(){

function bump_request_timeout($val){

●変更点についての、自分なりの解釈
(1).class同名のfunctionでのコンストラクタが非推奨になったことへの対応
(2).可変変数名の書き方を、より明示的な書き方に修正
(3).WP3.8~非推奨になったコマンド「screen_icon(get_screen_icon)」を削除
(4).「http_request_timeout」の形式が値設定ありなので、互換性のある書き方に修正

●疑問点
(A).この解釈で合っている?
(B).上記(1)のfunctionは、なぜ「public」なのか?

解釈の間違いや、追加情報、補足情報など。
なにかありましたら、コメントをいただけると嬉しいです。
よろしくお願いします。

<開発環境>
XAMPP:7.0.4(PHP7+MariaDB)
WordPress:4.5.2
WordPress Importer:0.6.1
OS:Windows Vista SP2

※Word Pressは5/21現時点での最新版。XAMPPは2つ前のバージョンです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

だいたいそのとおりですが、(2)はPHP5とPHP7で挙動が違う部分で、PHP7では${$meta}['key']と解釈されてしまうので中括弧が必要となります(互換性のない変更点)。

あと、コンストラクタはpublicでないと外部から呼べない、つまりこのクラスを外部からインスタンス化できないことになります(もちろん、それが有用な場面もあることはありますが)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/22 16:37

    (1)について
    あ、なるほど。
    評価順が、PHP5とPHP7で変わったんですね。
    それで、PHP5とPHP7で互換性のある書き方として、中カッコ{}で表現していると。
    リンクまでつけていただいて、ありがとうございます。

    (1)について
    コンストラクタについて、
    ・classが呼び出されたとき、最初の1回だけ自動で実行される。
    ・変数の初期設定などを行う。処理を書かない場合は、メモリ確保&値クリアー的な動作。
    だと思っていました。

    で、class「内部」で最初に実行&値設定の定義なしなら、publicじゃなくても良いのでは?と疑問に思ったんです。

    でも、コンストラクタも関数(というか、メソッド?)の1つなんですね。
    そして、「命令文を書かなくても自動で呼び出される」だけであって、実際は「関数をcallしている」。
    なので、「インスタンスを生成する=外から呼ぶ」には、publicでないと扱えないよ、と。


    あと、余談ですが、関数でスコープを書かない場合は「public」になるんですね。

    簡単なコードで実験してみたら、こうなりました。

    public function __construct() { /**/ } …OK
    private function __construct() { /**/ } …エラー
    function __construct() { /**/ } …OK


    「指定なし=private」だと勘違いしたまま、コンストラクタの書き方が「function __construct」となっているものを見て、「public」である必要はあるのか?と思ってしまった次第。

    PHPは入門書を一からみたいな勉強はできてなくて、ソースを見て何をしているか探っている状態です。
    ちょっとおかしな質問になってしまっていたかも…。すみません。
    文法的なことだけでなく、もっと骨組の方も知っておかないとダメですね。


    今回お答えいただいたこと、大変勉強になりました。
    どうもありがとうございました。

    私がまだ勘違いしている部分、補足などありましたら、追加回答していただけると嬉しいです。
    2~3日してなにもないようであれば、「解決済み」にしたいと思います。
    お手数ですが、よろしくお願いします。

    キャンセル

  • 2016/05/22 18:15

    PHP4時代にprivateやprotectedがなかった名残りで、PHP7でもメソッドは「何も書かなければpublic」となっています。これはJavaやC++とは違います。

    あと、「コンストラクタの可視性でインスタンス化できるかを決める」というのも必然ではなく、たとえばRubyではnewがクラスメソッドで上書き可能なこともあって、コンストラクタ相当のinitializeは常にprivateです(Rubyのprivateはかなり意味が違いますが)。

    キャンセル

  • 2016/05/29 11:27

    追加の回答、ありがとうございます。お礼が遅くなってしまってすみません。

    おおお、なかなか奥が深いですね。そして、それがまた面白いとこかも。
    PHPでコンストラクタを「わざと」privateにする活用シーンは、もっと修行を積んでから考えることにします(汗)。

    わかりやすく丁寧に教えていただき、助かりました。
    おかげ様で、とても勉強になりました。
    どうもありがとうございました。


    ※私の前回のコメント、「(1)について」が2つありますが、最初が(2)、次が(1)、でした。
    誤記が多くてすみません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る