8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

parent::と$this->の違いとは(個人的見解)

Last updated at Posted at 2019-09-24

TL;DR(個人的見解)

基本$this->を使う。
使わないとどうしようもない(独自処理を挟みつつ親メソッドを呼ぶ)時だけparent::を使う
(個人差有り)(そんなことねーよ!って方いたらコメントでご教授ください🙇‍♀️)

調べるに至った経緯

会社のコードで同じメソッドが$this->で呼ばれてたり、parent::で呼ばれてたりしてた(なんで)

parent::も$this->もイけちゃう

class A {
    public function hoge() {
        var_dump('ほげだよ');
    }
}

class B {
    public function callHogeByParent(){
        parent::hoge(); // イけちゃう
    }
    public function callHogeByThis(){
        $this->hoge(); // イけちゃう
    }
}

両者の違いはなんなのか(個人的見解)

スコープ定義演算子 (::) - PHP.net

static, 定数 およびオーバーライドされたクラスのプロパティやメソッドにアクセスすることができます。

アロー演算子とは、クラスのメソッドを呼び出すときに使用するもの(PHP.netのいい感じのページが見つけられなかった)

$this->はクラス(親でも子でも可)のメソッドを呼び出すもので、parent::はクラス(親のみ可)のメソッドを呼び出すもの

私の中の結論

どっちも親クラスアクセスできる、かつ、::は静的メソッドってイメージがあったので、なんか混乱した。
そして会社のコードが表記揺れしてた(なんで)。

parent::を使えば、明示的に親クラスのメソッドですよ、と言える。
しかし親クラスのメソッドを呼び出すときに、何でもかんでもparent::使ってたらそれはダルすぎる。

ただ、parent::を使わなきゃコーディングできないタイミングがある。
それは、独自処理を挟みつつ親メソッドを呼びたいときだ。

class A {
    public function hoge(){
        var_dump('hoge');
    }
}

class B {
    public function hoge(){
        var_dump('Bの');
        parent::hoge(); // 独自処理を挟みつつ、親のhogeも使いたい。
    }
}

もっとわかりやすい例だと、constructor。

class A {
    public function constructor(){
        // 初期化処理
    }
}

class B {
    public function constructor(){
        // Bの初期化処理
        parent::constructor(); // Aの初期化処理
    }
}

こういう時は、parent::使わないと実現できない。
逆にこの時以外使っちゃうとなんか揺れてる気がして嫌なので、「使わないとどうしようもない時」だけ、parent::を使う、と結論づけた。
(結論がわかったら途端に「そりゃそうじゃ」となったが、渦中は意外と気づけないものだなぁ。)
てかその前に表記揺れさせないこと。(そりゃそうじゃ)

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?