目次
PHPのクラス・オブジェクトの勉強、その3。インターフェイスやらメソッドチェーンやら例外処理やら。
インターフェイス
- インターフェイス | オブジェクト指向PHP.NET
- 【 ほでなすPHP 】 PHP5の基本 -> インターフェイス
- PHPにはインターフェイスというものがありますよ、という話 - id:anatooのブログ
とりあえず勉強してみるも具体的にコードを書いていないから抽象メソッドとかインターフェイスとかなんなんだって感じなんだけど上のリンク先を読んでみてなんとなく分かったような分からないような。。インターフェイスは抽象クラスとかなり似ている。テキトーにまとめてみると…
インターフェイス | 抽象クラス |
---|---|
抽象プロパティは定義できない(というかインターフェイスは抽象メソッドのみ定義できる) | 左に同じ。また、インターフェイスも抽象メソッドも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