[PHP] クラスの勉強 その3 / インターフェイス / メソッドチェーン

PHPのクラス・オブジェクトの勉強、その3。インターフェイスやらメソッドチェーンやら例外処理やら。

インターフェイス

とりあえず勉強してみるも具体的にコードを書いていないから抽象メソッドとかインターフェイスとかなんなんだって感じなんだけど上のリンク先を読んでみてなんとなく分かったような分からないような。。インターフェイスは抽象クラスとかなり似ている。テキトーにまとめてみると…

インターフェイス抽象クラス
抽象プロパティは定義できない(というかインターフェイスは抽象メソッドのみ定義できる)左に同じ。また、インターフェイスも抽象メソッドもstaticメソッドの定義ができる。
publicな抽象メソッドのみ定義できる(abstractは省略しなければならない)public と protected の2つの抽象メソッドを定義できる。また、非抽象メンバも定義できる。
複数のインターフェイスを同時に実装できる(多重継承が可能)複数の抽象クラスを同時に実装はできない
定義済みのインターフェイスが存在する抽象クラスに定義済みのものはないよね…?

タイプヒンティングでインターフェイスを使えたりといろいろと使えると便利な感じ?

<?php
interface HumanInterface
{
  public function getLanguage();

  //abstract は省略必須
  //てかpublic も省略できるな。。
  //とはいえ省略はしないほうがいいけど…
  function writeHello();
}
abstract class HumanAbstract
{
  public $language = "none";
  abstract protected function setLanguage($language);
}
class HumanClass
  extends HumanAbstract
  implements HumanInterface
{
  public function getLanguage()
  {
    return $this->language;
  }
  public function writeHello(){
    if($this->getLanguage() == "en"){
      echo "Hello!";
    } elseif($this->getLanguage() == "ja") {
      echo "こんにちわ!";
    }
  }
  protected function setLanguage($language)
  {
    $this->language = (string) $language;
  }
  function __construct($language)
  {
    $this->setLanguage($language);
  }
}
$human = new HumanClass("en");
$human->writeHello();
$human = new HumanClass("ja");
$human->writeHello();
?>

結果

Hello!こんにちわ!
<?php
interface TestInterface{
  public function test();
}
abstract class TestAbstract{
  abstract public function test();
}
class TestClass1 extends TestAbstract
{
  public function test(){}
}
class TestClass2 extends TestInterface
{
  public function test(){}
}
?>

結果

Fatal error: Class TestClass2 cannot extend
 from interface TestInterface in *** on line 15

extends で継承しようとするとE_ERRORが出る。

メソッドチェーン

メソッドの返り血をオブジェクトにすべし。 メソッドを矢印->で連結して連続して実行できる。

<?php
class Cls{
  private $var;
  function __construct($num)
  {
    $this->var = (int) $num;
  }
  public function eins()
  {
    $this->var += 1;
    return $this;
  }
  public function twei($obj)
  {
    $obj->prop = $this->var + 2;
    return $obj;
  }
  static public function new_cls($num)
  {
    return new Cls($num);
  }
}
class Sub{
  public $prop;
  public function drei(){
    $this->prop += 100;
    return $this;
  }
  public function print_prop()
  {
    echo $this->prop;
  }
}

echo Cls::new_cls(10)->eins()->twei(new stdClass)->prop;
echo "\n-----\n";
echo Cls::new_cls(10000)->eins()->twei(new Sub)->drei()->print_prop();
?>

結果

13
-----
10103

こういうのもできる

class A
{
  public static function chain1()
  {
    return Z::chain2();
  }
}
class Z
{
  public static function chain2()
  {
    echo "OK";
  }
}
A::chain1();

結果

OK
Share
関連記事