LoginSignup
9
6

More than 1 year has passed since last update.

【PHP】implementsとextendsの違い

Posted at

implementsってなんぞや?extendsしか知らんぞ?ってなったので調べてみました。

TL;DR

  • implementsはインターフェイスを使いたい時の演算子
  • extendsはオブジェクトを継承したい時の演算子

implements

implementsはインターフェイスを使いたい時の演算子です。

インターフェイスとは?

クラスが実装する必要があるメソッドを指定するコード

そのクラスに実装しないといけないメソッドをまとめた、パッケージみたいなものです。
複数のファイル(クラス)を作成する際に、決まったメソッドを実装してほしい時に使えます。

例)

▼インターフェイス
<?php

interface Template
{
    public function setVariable($name, $var);
    public function getHtml($template);
}
   
▼インターフェイスに則ったクラス

インターフェイスで定義している setVariablegetHtml を実装している。

<?php

class Hoge implements Template
{
    public function setVariable($name, $var)
    {
       // メソッドの中身 
    }
  
    public function getHtml($template)
    {
        // メソッドの中身
    }
}
▼動かないクラス

インターフェイスを使っているのに、インターフェイスで定義しているメソッドを全て実装していない。

<?php

class Fuga implements Template
{
    public function setVariable($name, $var)
    {
       // メソッドの中身 
    }
}

extends

オブジェクトを継承したい時の演算子です。

継承とは?

  • extendsしたオブジェクトで定義しているメソッドを使える
  • extendsしたオブジェクトで定義しているメソッドの中身を上書きして使える

例)

▼継承元のオブジェクト
<?php

class Foo
{
    public function printItem($string)
    {
        echo 'Foo: ' . $string . PHP_EOL;
    }
}
▼継承したメソッドをそのまま使う場合
<?php

class Bar extends Foo
{
    public function printItems($arr)
    {
        foreach ($arr as $item)
        {
            echo printItem($item);
        }
    }
}
<?php

$bar = new Bar();
$arr = ["hoge", "fuga"];
$bar->printItems($arr);

結果

'Foo: hoge'
'Foo: fuga'
▼継承したメソッドを上書きする場合
<?php

class Bar extends Foo
{
    public function printItem($string)
    {
        echo 'Bar: ' . $string . PHP_EOL;
    }
}
<?php

$bar = new Bar();
$bar->printItem("hoge");

結果

'Bar: hoge'
9
6
1

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
9
6