PHP‚Ìinterface‚Ƃ͉½‚©

Posted by Hiraku on 2013-10-14

‹v‚µ‚Ô‚è‚̍XV‚Å‚·BÅ‹ßACs‚¾‚ÆŽv‚Á‚ĐFX‚È–{‚ð“Ç‚Ý‹™‚Á‚Ä‚¢‚é‚Ì‚Å‚·‚ªA‚â‚Á‚Æ‚±‚³PHP‚Ìinterface‚ª•ª‚©‚é‚悤‚É‚È‚Á‚Ä‚«‚½Š´‚¶‚ª‚ ‚é‚̂ŁA‚Ü‚Æ‚ß‚Ä‚Ý‚Ü‚·B

interface‚Æ‚Í

ƒCƒ“ƒ^[ƒtƒF[ƒX‚́AƒNƒ‰ƒX‚©‚ç"ƒ†[ƒU[’è‹`Œ^"‚Ì”\—݂͂̂𕪗£‚µ‚½Œ¾Œê‹@\‚Å‚·BPHP‚Ì‚»‚ê‚ÍJava‚Ìinterface‚̃pƒNƒŠ‚Å‚·B

"ƒ†[ƒU[’è‹`Œ^"‚Æ‚¢‚¤’PŒê‚ðŽg‚¢‚Ü‚µ‚½B“®“IŒ^•t‚«Œ¾Œê‚Ì‚±‚Æ‚ðuŒ^‚Ì‚È‚¢Œ¾Œêv‚ÆŒ¾‚¤l‚ª‚½‚Ü‚É‚¢‚é‚ñ‚Å‚·‚ªA‚Æ‚ñ‚Å‚à‚ˁ[ŠÔˆá‚¢‚Å‚·BPHP‚É‚¾‚Á‚ÄŒ^‚Í‚ ‚è‚Ü‚·B•Ï”‚ªŒ^‚ðŽ‚½‚¸A’l‚ªŒ^‚ðŽ‚Á‚Ä‚¢‚é‚Æ‚¢‚¤‚¾‚¯‚̘b‚Å‚·B

interface‚ðéŒ¾‚·‚镶–@‚̓Nƒ‰ƒX‚Æ‚æ‚­Ž—‚Ä‚¢‚Ü‚·‚ªAƒL[ƒ[ƒhclass‚Ì‘ã‚í‚è‚ɃL[ƒ[ƒhinterface‚ðŽg‚¢‚Ü‚·B’†g‚Í’è‹`‚Ì‚È‚¢ƒƒ\ƒbƒh‚̐錾‚ð‘‚«‚Ü‚·B‚È‚¨A’萔‚àŠÜ‚߂邱‚Æ‚ª‰Â”\‚Å‚·B


<?php
interface FooInterface
{
  const MOGE = 1;
  public function doSomething1();
  public function doSomething2(DateTime $date);
}

‚Å‚«‚ ‚ª‚Á‚½FooInterface‚́AƒNƒ‰ƒX‚Å‚Í‚È‚¢‚Ì‚Ånew‚ŃCƒ“ƒXƒ^ƒ“ƒX‰»‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñBimplementsƒL[ƒ[ƒh‚ðŽg‚¢AƒNƒ‰ƒX‚Æ‚µ‚Ä’†g‚ðŽÀ‘•‚·‚é‚Ænew‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·B

//ƒ\[ƒXƒR[ƒh‚Í‚³‚Á‚«‚Ì‚à‚Ì‚©‚瑱‚¢‚Ä‚¢‚éƒCƒ[ƒW‚Å‚·
class Foo implements FooInterface
{
  public function doSomething1()
  {
  }

  public function doSomething2(DateTime $date)
  {
  }
}

$foo = new Foo;
var_dump($foo instanceof FooInterface); //true

interface‚͉½‚Ì–ð‚É—§‚‚̂©

Ž„‚͍ŏ‰Ainterface‚ÌŽg‚¢“¹‚ª‚æ‚­‚í‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½BƒCƒ“ƒXƒ^ƒ“ƒX‰»‚Å‚«‚È‚¢ƒNƒ‰ƒX‚̏o—ˆ‘¹‚È‚¢‚ŁAéŒ¾‚·‚ê‚΋Lq—Ê‚ª‘‚¦‚邾‚¯‚Å‚·BŽÀÛAinterface‚ðˆêØŽg‚킸‚Æ‚àPHP‚̃R[ƒh‚͏‘‚¯‚Ü‚·Bc‚Ü‚ A‚»‚ñ‚È‚±‚Æ‚ðŒ¾‚¢Žn‚ß‚é‚ƁAgoto•¶‚³‚¦‚ ‚ê‚Îfor•¶‚àtry catch‚àŠÖ”‚à•s—vA‚Á‚Ä‚±‚Æ‚É‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·Binterface‚ª‘¶Ý‚·‚é‚Ì‚Í•Ö—˜‚ȏê–Ê‚ª‚ ‚é‚©‚ç‚Å‚·B

interface‚Í‚»‚ê’P“Æ‚Å‚Í–ð‚É—§‚¿‚Ü‚¹‚ñB‚à‚Á‚Ï‚çAƒ^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚Æ‘g‚ݍ‡‚킹‚ÄŽg‚¢‚Ü‚·Bƒ^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚ÉŽg‚í‚ê‚Ä‚¢‚È‚¢interface‚ªƒ\[ƒXƒR[ƒh’†‚ɏoŒ»‚µ‚½‚çAu‚¨‘O‚͉½‚ª‚µ‚½‚¢‚ñ‚¾v‚ƃŒƒrƒ…[ƒRƒƒ“ƒg‚ɏ‘‚¢‚ÄOK‚Å‚·B(³Šm‚É‚Í‘¼‚É‚àŽg‚¢“¹‚ª‚ ‚é‚Ì‚Å‚·‚ªA‚â‚₱‚µ‚­‚È‚é‚̂ňê’U‚»‚¤‚¢‚¤‚±‚Æ‚É‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢)

//...
function useFoo(FooInterface $foo) {
  $foo->doSomething1();
  $foo->doSomething2(new DateTime);
}

$foo instanceof FooInterface ‚ð–ž‚½‚µ‚Ä‚¢‚È‚¢$foo‚ð“n‚µ‚½ê‡A‚±‚ÌuseFoo()ŠÖ”‚ðŽÀs‚·‚é‚ƃGƒ‰[‚ª”­¶‚µ‚ÄPHP‚ª’âŽ~‚µ‚Ü‚·B“®“IŒŸ¸‚È‚Ì‚ÅŒø‰Ê‚ÍŒÀ’è“I‚Å‚·‚ªAƒJƒoƒŒƒbƒW100%‚̃†ƒjƒbƒgƒeƒXƒg‚Æ‘g‚ݍ‡‚킹‚ê‚ΑŠú‚ɃvƒƒOƒ‰ƒ€‚Ì–â‘è‚É‹C‚­‚±‚Æ‚ª‚Å‚«‚é‚Å‚µ‚傤B

‚±‚̏ꍇAƒ^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚ð’ʉ߂µ‚½$foo‚́Aƒƒ\ƒbƒhdoSomething1‚ÆdoSomething2‚ðŽ‚Á‚Ä‚¢‚邱‚ƂƂƁAƒƒ\ƒbƒh‚̈ø”‚ÌŒ^‚ª•ÛØ‚³‚ê‚Ä‚¢‚Ü‚·B

ƒNƒ‰ƒX‚É‚æ‚éƒ^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚Ƃ̈Ⴂ

‚Æ‚±‚ë‚ŁAƒ^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚ɂ̓Nƒ‰ƒX‚àŽg‚¦‚Ü‚·B

function useFoo2(Foo $foo) {
    $foo->doSomething1();
    $foo->doSomething2(new DateTime);
}

‚¶‚á‚ A‚â‚Á‚Ï‚èinterface‚È‚ñ‚ÄŽg‚킸‚ɁAƒNƒ‰ƒX‚¾‚¯Žg‚Á‚½‚Ù‚¤‚ª‚¨ŽèŒy‚¶‚á‚È‚¢‚©A‚ÆŽv‚¤‚©‚à‚µ‚ê‚Ü‚¹‚ñB

‚±‚Ì•Ó‚è‚Í‚à‚¤­‚µŽÀ—á‚ðo‚³‚È‚¢‚ƃsƒ“‚Æ‚±‚È‚¢‚à‚Ì‚Å‚·Binterface‚ª–ð‚É—§‚‚̂́A‚à‚¤­‚µ‘å‚«‚È—±“xA‚¢‚­‚‚©‚̃Nƒ‰ƒX‚ð‚Ü‚Æ‚ß‚½ƒpƒbƒP[ƒW‚̂悤‚ÈŠT”O‚ªo‚Ä‚«‚½Žž‚Å‚·B

‚æ‚­‚ ‚é—á‚Æ‚µ‚āAWebƒAƒvƒŠƒP[ƒVƒ‡ƒ“ƒtƒŒ[ƒ€ƒ[ƒN‚ƁAƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚ð‘g‚ݍ‡‚킹‚ÄŽg‚¤‚±‚Æ‚ðl‚¦‚Ü‚·B

ƒtƒŒ[ƒ€ƒ[ƒN‚͉½‚Å‚à‚æ‚¢‚Å‚·BSymfony‚Å‚àZF‚Å‚àD‚«‚È‚à‚Ì‚ð‘z‘œ‚µ‚Ä‚­‚¾‚³‚¢B‚È‚ñ‚©‚í‚©‚ç‚ñ‚ªƒtƒŒ[ƒ€ƒ[ƒN‚Æ‚¢‚¤‚à‚Ì‚ª‚ ‚éA‚Æ‚µ‚Ü‚·B

blog_interface1.png

‘å’ï‚̃tƒŒ[ƒ€ƒ[ƒN‚̓eƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚ðŽg‚Á‚āAƒeƒ“ƒvƒŒ[ƒgã‚ɕϐ”‚ð“WŠJ‚µ‚āAHTML‚𐶐¬‚µ‚Ü‚·B‚µ‚©‚µ¢‚Ì’†‚É‚ÍSmarty‚â‚çTwig‚â‚çMustache‚â‚çA‘½‚­‚̃eƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚ª‚ ‚é‚̂ŁAD‚݂ɉž‚¶‚č·‚µ‘Ö‚¦‚ç‚ê‚é‚悤‚É‚µ‚½‚¢‚Å‚·B

ƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚àA‚±‚ê‚Ü‚½‰½‚©‚æ‚­‚í‚©‚è‚Ü‚¹‚ñ‚ªAuƒeƒ“ƒvƒŒ[ƒg‚Ì•¶Žš—ñ‚ƕϐ”‚Ì‘g‚ð“n‚¹‚ÎHTML‚É•ÏŠ·‚µ‚Ä‚­‚ê‚éA“¹‹ï‚̂悤‚ȃIƒuƒWƒFƒNƒgv‚Æ‚µ‚Ü‚·BƒtƒŒ[ƒ€ƒ[ƒN‚ªƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚ðŽg‚¤ŠÖŒW‚Å‚·B

blog_interface2.png

‚³‚āAƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚͍·‚µ‘Ö‚¦‚ç‚ê‚é‚悤‚É‚µ‚½‚¢‚Ì‚Å‚µ‚½B‚µ‚©‚µƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚ªu‰½‚¾‚©‚í‚©‚ç‚ñ‚ª“¹‹ï“I‚ȃIƒuƒWƒFƒNƒgv‚Æ‚¢‚¤‚¾‚¯‚ł́AŽd—l‚ª‚í‚©‚ç‚È‚¢‚Ì‚ÅŽg‚¢‚悤‚ª‚ ‚è‚Ü‚¹‚ñB‚»‚±‚ŁAŽd—l‚ðŒˆ‚ß‘Å‚¿‚µ‚ÄŽg‚¤‚±‚Æ‚É‚µ‚Ü‚·B‚à‚µAƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‘¤‚ªŒˆ‚ß‘Å‚¿‚µ‚½‚à‚̂ƈႤŽd—l‚È‚ç‚΁A·•ª‚ðŽæ‚莝‚ƒ‰ƒbƒp[ƒIƒuƒWƒFƒNƒg‚ðì‚ê‚΂¢‚¢‚Ì‚Å‚·B

‚±‚Ì‚Æ‚«AƒtƒŒ[ƒ€ƒ[ƒNÝŒvŽÒ‚́AƒNƒ‰ƒX‚Ń^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚·‚é‚©Ainterface‚Ń^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚·‚é‚©‘I‚Ô‚±‚Æ‚ª‚Å‚«‚Ü‚·B

namespace MyFramework;

class DefaultTemplateEngine {
  public function render($template, array $context)
  {
    //...
  }
}
//...

class FrameworkController {
  //...
  public function renderView(DefaultTemplateEngine $templateEngine, $template, array $context)
  {
    return $templateEngine->render($template, $context);
  }
  //...
}
namespace MyFramework;

interface TemplateEngineInterface {
  public function render($template, array $context);
}

class FrameworkController {
  //...
  public function renderView(TemplateEngineInterface $templateEngine, $template, array $context)
  {
    return $templateEngine->render($template, $context);
  }
  //...
}

c‚Ü‚¾ƒsƒ“‚Æ‚±‚È‚¢‚Å‚·‚ˁB‚ł͐æ‚قǂ̐}‚ɁA‚à‚¤ˆêl“oêl•¨‚𑝂₵‚Ä‚Ý‚Ü‚µ‚傤Bƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚̓[ƒ‹‚Ì’èŒ^•¶‚ðˆµ‚¤‚Ì‚É‚à•Ö—˜‚Ȃ̂ŁAƒ[ƒ‰[‚à“¯‚¶ƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚ðŽg‚¤‚Æ‚µ‚Ü‚·B

blog_interface3.png

‚±‚̃[ƒ‰[‚àƒNƒ‰ƒX‚ð—v‹‚·‚é‚©AƒCƒ“ƒ^[ƒtƒF[ƒX‚ð—v‹‚·‚é‚©‘I‚ׂ܂·B‚³‚Ä‚³‚āA‚Ç‚Á‚¿‚ª—D‚ê‚Ä‚¢‚é‚Å‚µ‚傤‚©H

—¼ŽÒ‚ªƒNƒ‰ƒX‚ð—v‹‚µ‚½‚Æ‚µ‚Ü‚·B‚·‚é‚ƁA‘€ì‚ðƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚Ɉڏ÷‚·‚邾‚¯‚̃Nƒ‰ƒX‚ðƒpƒbƒP[ƒW‚²‚Ƃɍì‚ç‚È‚¢‚Æ‚¢‚¯‚Ü‚¹‚ñB‚È‚ñ‚©–Ê“|‚­‚³‚¢‚Å‚·‚ˁBŽÀ‘•‚à–Ê“|‚Å‚·‚µAƒCƒ“ƒXƒ^ƒ“ƒX‚ðŽg‚¢•ª‚¯‚È‚¯‚ê‚΂Ȃç‚È‚¢‚Ì‚ÅŠÇ—‚à”ÏŽG‚É‚È‚è‚Ü‚·B

//ƒtƒŒ[ƒ€ƒ[ƒN—p‚̃eƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“ƒNƒ‰ƒX
class FrameworkTemplateEngine extends MyFramework\DefaultTemplateEngine
{
  //...
}

//ƒ[ƒ‰[—p‚̃eƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“ƒNƒ‰ƒX
class MailerTemplateEngine extends MyMailer\DefaultTemplateEngine
{
  //...
}

—¼ŽÒ‚ªƒCƒ“ƒ^[ƒtƒF[ƒX‚ð—v‹‚µ‚½‚Æ‚µ‚Ü‚·B‚·‚é‚ƁA“ñ‚‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚ðŽÀ‘•‚µ‚½ˆê‚‚̃Nƒ‰ƒX‚ðì‚邾‚¯‚ōς݂܂·BƒNƒ‰ƒX‚ªˆêŒÂ‚Æ‚¢‚¤‚±‚Ƃ̓Cƒ“ƒXƒ^ƒ“ƒX‚àˆê‚‚ł悢‚̂ŁAƒCƒ“ƒXƒ^ƒ“ƒX‚ÌŠÇ—‚à’Pƒ–¾‰õ‚Å‚·BŠî’êƒNƒ‰ƒX‚̓eƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚Ì‘¤‚̃Nƒ‰ƒX‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚é‚̂ŁAŽÀ‘•‚àŠÈ’P‚É‚È‚è‚Ü‚·B

//ƒtƒŒ[ƒ€ƒ[ƒN‚àƒ[ƒ‰[‚à—¼•ûŽg‚¢‚܂킹‚éƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“ƒNƒ‰ƒX
class TemplateEngine extends HogeTemplateEngine implements
  MyMailer\ViewInterface,
  MyFramework\TemplateEngineInterface
{
  //...
}

PHP‚̃Nƒ‰ƒX‚Í’PˆêŒp³‚µ‚©‹–‚³‚ê‚Ä‚¢‚Ü‚¹‚ñBƒNƒ‰ƒX‚Ń^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚·‚é‚Æ‚¢‚¤‚±‚Ƃ́A‚»‚̃Nƒ‰ƒX‚©A‚à‚µ‚­‚Í”h¶ƒNƒ‰ƒX‚ð—v‹‚·‚é‚Æ‚¢‚¤‚±‚Æ‚Å‚·B‚±‚ê‚ÍŽÀ‚́A”ñí‚ÉŒµ‚µ‚¢§–ñ‚Å‚·BƒCƒ“ƒ^[ƒtƒF[ƒX‚̏ꍇ‚Í’PˆêŒp³‚̐§–ñ‚ðŽó‚¯‚È‚¢‚½‚߁A§–ñ‚ªŠÉ‚­‚È‚è‚Ü‚·B

ƒpƒbƒP[ƒW‚ªƒNƒ‰ƒX‚ð—v‹‚·‚é‚ƁA‚í‚´‚í‚´ê—p‚ɃNƒ‰ƒX‚ðì‚ç‚È‚­‚Ä‚Í‚È‚ç‚È‚¢‚µA‚µ‚©‚àì‚Á‚½ƒNƒ‰ƒX‚Í‘¼Š‚̃pƒbƒP[ƒW‚ÅŽg‚¢‚܂킵‚Å‚«‚È‚­‚È‚è‚Ü‚·BƒNƒ‰ƒX‚ð—v‹‚·‚é‚Æ‚¢‚¤‚̂́uƒIƒŒ—l‚Ì—¬‹V‚ɏ]‚¦IIÄ—˜—pHƒIƒŒ‚Ì’m‚Á‚½‚±‚Æ‚Å‚Í‚È‚¢Iv‚Ý‚½‚¢‚ɏォ‚ç–ڐü‚̈̂»‚¤‚Ȑ݌v‚È‚Ì‚Å‚·B‰º•i‚Å‚·‚ˁB

‚Æ‚¢‚¤‚킯‚ŁAƒ^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚ŃNƒ‰ƒX‚Å‚Í‚È‚­ƒCƒ“ƒ^[ƒtƒF[ƒX‚ð—v‹‚·‚邱‚ƂŁAŒª‹•‚Å‘g‚ݍ‡‚킹‚â‚·‚¢ƒ‰ƒCƒuƒ‰ƒŠ‚ªì‚ê‚āA‚µ‚©‚àŒ^‚É‚æ‚éi‚ ‚é’ö“x‚́j•iŽ¿•ÛØ‚ª‚Å‚«‚Ü‚·B–³ˆÅ‚ɃNƒ‰ƒX‚ð—v‹‚·‚é‚Ì‚Í•sì–@‚È‚Ì‚Å‚â‚ß‚Ü‚µ‚傤B

PHP‚Ìinterface‚Ì‘Ê–Ú‚È‚Æ‚±‚ë

‚´‚Á‚Æinterface‚ÌŽg‚¢‚Ç‚±‚ë‚ɂ‚¢‚ď‘‚¢‚Ä‚«‚Ü‚µ‚½‚ªA‚æ‚­l‚¦‚é‚ÆPHP‚Ìinterface‚̓Cƒ}ƒCƒ`‚È‚Æ‚±‚낪‚ ‚è‚Ü‚·Bu“®“I‚ÈŒŸ¸‚µ‚©‚Å‚«‚È‚¢v‚Æ‚¢‚¤‚Ì‚ÍŒ¾Œê“I‚ÉŽd•û‚È‚¢‚Ì‚Å‚·‚ªA‚»‚êˆÈŠO‚É‚à‘Ê–Ú‚È‚Æ‚±‚낪ˆê”t‚Å‚·B

Œ^‚Ì‹Lq—Í‚ª•nŽã

interface‚ðŒ^‚ÆŒ¾‚¤‚ɂ́A‹Lq—Í‚ª•K—v‚Å‚·B‚µ‚©‚µPHP‚ÌŒ^ƒVƒXƒeƒ€‚Í‚Æ‚Ä‚à•nŽã‚Å‚·Binterface‚ɂ̓ƒ\ƒbƒh‚ªŽÀÝ‚·‚邱‚ƂƁAƒƒ\ƒbƒh‚̈ø”‚ÌŒ^‚µ‚©‹Lq‚Å‚«‚Ü‚¹‚ñBƒƒ\ƒbƒh‚Ì–ß‚è’l‚ÌŒ^‚ÍŽ¦‚¹‚È‚¢‚µAŒ^‚ðˆø”‚ÉŽæ‚é‚悤‚ÈŒ^‚âAŠÖ”‚ðŽ¦‚·Œ^‚à‹Lq‚Å‚«‚Ü‚¹‚ñB

ƒ}ƒWƒbƒNƒƒ\ƒbƒh‚Æ‚Ì‘Š«‚ªˆ«‚¢

PHP‚̃Nƒ‰ƒX‚É‚Í‘¶Ý‚µ‚È‚¢ƒƒ\ƒbƒh‚ð‚ ‚½‚©‚à‘¶Ý‚·‚é‚悤‚ÉŒ©‚¹‚©‚¯‚邽‚ß‚Ì__call‚â__get‚Æ‚¢‚Á‚½ƒ}ƒWƒbƒNƒƒ\ƒbƒh‚ª‘¶Ý‚µ‚Ü‚·B‚µ‚©‚µAinterface‚É‚æ‚éƒ^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚ł́A‚±‚ê‚ç‚Ì’†g‚܂ł͕ۏ؂ł«‚È‚¢‚½‚߁A‘g‚ݍ‡‚킹‚ÄŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB

ƒ}ƒWƒbƒNƒƒ\ƒbƒh‚ð•ÛØ‚µ‚½‚¢ê‡‚́Afinal‚ð“K‹X‘g‚ݍ‡‚킹‚½ã‚ŁAƒNƒ‰ƒX‚ł̃^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚ª•K{‚É‚È‚è‚Ü‚·B

‘½dŽÀ‘•‚ª•ÛØ‚³‚ê‚Ä‚¢‚È‚¢

‰½‚æ‚è’v–½“I‚Ȃ̂́A‚±‚Ì“_‚Å‚·BPHP‚ɂ̓ƒ\ƒbƒh‚̃I[ƒo[ƒ[ƒh‹@”\‚ª‚È‚¢‚̂ŁAƒVƒOƒlƒ`ƒƒ‚ª‹£‡‚·‚é‚ÆŽÀ‘•‚Å‚«‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚Å‚·B‚¹‚Á‚©‚­Œ¾Œê“I‚É•K—v‚à‚È‚¢‚Ì‚Éinterface‚ð’è‹`‚µ‚āA‚¨‘V—§‚Ä‚µ‚Ä‚â‚Á‚Ä‚àŽg‚¦‚È‚¢‚±‚Æ‚ª‚ ‚é‚Ì‚¾‚©‚炽‚Ü‚ç‚ñ‚Å‚·BŒ»ŽÀ‚ɁAPsr\Log\LoggerInterface‚ƁAZend\Log\LoggerInterface‚̓VƒOƒlƒ`ƒƒ‚ª‹£‡‚·‚邽‚߁A“¯Žž‚ÉŽÀ‘•‚Å‚«‚Ü‚¹‚ñB

ŽÀ‘•‚Å‚«‚È‚¢ƒP[ƒX‚͈ȑO‚ÉQiita‚Å‚Ü‚Æ‚ß‚½‚Ì‚Å‚»‚¿‚ç‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

PHP - interface‚ªƒGƒ‰[‚É‚È‚éƒP[ƒX - Qiita [ƒL[ƒ^]

‚±‚ñ‚È•—‚ÉŽc”O‚È‚Æ‚±‚낪‘½‚¢‚½‚߁APHP‚É‚¨‚¢‚ẮA‚ ‚Ü‚èƒCƒ“ƒ^[ƒtƒF[ƒX‚𗐔­‚·‚é‚ÆŽg‚¢‚É‚­‚¢ƒ\[ƒXƒR[ƒh‚É‚È‚é‚悤‚È‹C‚ª‚µ‚Ü‚·B­‚È‚­‚Æ‚àŽ©•ª‚Ő§Œä‚Å‚«‚éƒpƒbƒP[ƒW“à‚ÌŒ^‚ɂ‚¢‚ẮAƒNƒ‰ƒX‚Ń^ƒCƒvƒqƒ“ƒg‚µ‚Ä‚à–â‘è‚È‚¢‚ÆŽv‚¢‚Ü‚·B

‚Æ‚Í‚¢‚¦A’ŠÛƒNƒ‰ƒX‚ð‹­—v‚·‚é‚æ‚è‚Íinterface‚ð‹­—v‚µ‚½•û‚ª‘½dŽÀ‘•‚̉”\«‚ªŽc‚³‚ê‚Ä‚¢‚邾‚¯‚Ü‚¾ƒ}ƒV‚Ȃ̂ŁAƒpƒbƒP[ƒWŠO•”‚Æ‚Ì‹«ŠEã‚́A‚â‚Í‚èinterface‚ðŽg‚Á‚Ä‹Lq‚µ‚Ä‚¨‚¢‚½•û‚ªeØ‚Å‚·B

PHP‚Ìinterface‚ÍŒöÌŒ^‚Å‚ ‚é

‚Æ‚±‚ë‚ŁAPHP‚Ìinterface‚Í‚ ‚­‚܂Ő錾Žž‚ÉŒ^‚ªŒˆ‚Ü‚èA‹ô‘R“¯‚¶ƒVƒOƒlƒ`ƒƒ‚ðŽ‚Á‚Ä‚¢‚Ä‚à“¯‚¶Œ^‚¾‚Æ‚ÍŒ©‚È‚³‚ê‚Ü‚¹‚ñB‚±‚¤‚¢‚¤«Ž¿‚ðŒöÌŒ^‚ƌĂт܂·B

<?php
interface FooInterface {
    public function doSomething();
}

interface MooInterface {
    public function doSomething();
}

class Hoge implements FooInterface {
    public function doSomething() { }
}

$hoge = new Hoge;

var_dump($hoge instanceof FooInterface); // true
var_dump($hoge instanceof MooInterface); // false. “¯‚¶ƒVƒOƒlƒ`ƒƒ‚ðŽ‚Á‚Ä‚¢‚邯‚Ç•Ê‚ÌŒ^

ŒöÌŒ^‚Æ‚Í‹t‚ɁAéŒ¾Žž‚Ì–¼‘O‚Í‚ ‚Ü‚èd—vŽ‹‚³‚ꂸA‹ô‘R“¯‚¶ƒVƒOƒlƒ`ƒƒ‚ðŽ‚Á‚Ä‚¢‚ê‚Γ¯‚¶Œ^‚Æ‚Ý‚È‚·Œ¾Œê‚à‚ ‚è‚Ü‚·B‚±‚Ì—§ê‚ð\‘¢“I•”•ªŒ^(Structural Subtyping)‚ÆŒ¾‚¢‚Ü‚·BPHP‚ɍ\‘¢“I•”•ªŒ^‚ÍŽÀ‘•‚³‚ê‚Ä‚¢‚È‚¢‚̂ŁAŽc”O‚È‚ª‚çŽg‚¦‚Ü‚¹‚ñB\‘¢“I•”•ªŒ^‚ªŽÀ‘•‚³‚ê‚Ä‚¢‚錾Œê‚Æ‚µ‚Ä‚ÍTypeScript‚âScala‚È‚Ç‚ª‚ ‚è‚Ü‚·B

//TypeScript‚Ì—á
class A { }
interface I { }
 var a : A = new A;
 var i : I = a;  //–³ŠÖŒW‚ÌIŒ^•Ï”‚É‘ã“ü‚µ‚Ä‚¢‚邪AƒGƒ‰[‚É‚È‚ç‚È‚¢B

\‘¢“I•”•ªŒ^‚͐ÓI‚ȃ_ƒbƒNƒ^ƒCƒsƒ“ƒO‚Å‚ ‚é‚ÆŒ¾‚í‚ê‚邱‚Æ‚ª‚ ‚è‚Ü‚·BŒöÌŒ^‚Í‚ ‚­‚܂Ő錾Žž‚ɏ‘‚¢‚Ä‚ ‚邱‚Æ‚µ‚©M—p‚µ‚È‚¢‚̂ŁA‚¨–ðŠ“I‚Æ‚¢‚¤‚©A—Z’Ê‚ª—˜‚©‚È‚¢ƒCƒ[ƒW‚Å‚·BŒÂl“I‚ɂ́A\‘¢“I•”•ªŒ^‚Ì•û‚ª’†g‚ðŒ©‚Ä‚­‚ê‚é‚̂ŏ_“î‚Å•Ö—˜‚È‹C‚ª‚µ‚Ä‚¢‚Ü‚·B

ŒöÌŒ^‚Ì—˜“_

‚µ‚©‚µAŒöÌŒ^‚¾‚©‚炱‚»‚Ì’·Š‚à‚ ‚è‚Ü‚·B

\‘¢“I•”•ªŒ^‚̏ꍇA‹ô‘R‚̃VƒOƒlƒ`ƒƒˆê’v‚È‚Ì‚©AˆÓ}‚µ‚Ĉê’v‚³‚¹‚½‚Ì‚©‚ª‹æ•Ê‚Å‚«‚Ü‚¹‚ñBŒöÌŒ^‚̏ꍇA­‚È‚­‚Æ‚àéŒ¾Žž‚ÉŽw’肵‚Ä‚¢‚é‚Æ‚¢‚¤‚±‚Ƃ́Ainterface‚ÌŽd—l‚ð“ǂ݁AˆÓ}‚µ‚ÄŽÀ‘•‚µ‚Ä‚¢‚é‚Æ‚¢‚¤•\–¾‚É‚È‚é‚Ì‚Å‚·B

‚±‚̐«Ž¿‚́A‚Ђ邪‚¦‚¹‚ÎŒ^‚Ì‹Lq—Í‚ª•nŽã‚Å‚àƒJƒo[‚Å‚«‚é‚Æ‚¢‚¤‚±‚Æ‚Å‚·B‚¾‚Á‚Ä’†g‚æ‚è•\–¾‚µ‚Ä‚¢‚邱‚Æ‚ª‘厖‚¾‚ÆŒ¾‚¤‚Ì‚Å‚·‚©‚çB‚¿‚å‚Á‚ƃXƒsƒŠƒ`ƒ…ƒAƒ‹‚ÈŠ´‚¶‚Å‚·B

‚»‚µ‚Ä‚±‚ÌŒöÌŒ^‚̐«Ž¿‚ðÅ‘åŒÀŠˆ—p‚·‚éƒpƒ^[ƒ“‚±‚»‚ªƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚Å‚·Bƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚Ƃ́A’†g‚ª‹ó‚É‚È‚Á‚Ä‚¢‚éƒCƒ“ƒ^[ƒtƒF[ƒX‚Ì‚±‚Æ‚Å‚·B

interface Marker { }

ƒtƒ@ƒbIH ‰½‚»‚êAƒCƒ“ƒ^[ƒtƒF[ƒX‚̈Ӗ¡‚È‚¢‚¶‚á‚ñB‚¢‚â‚¢‚âAŒöÌŒ^‚Å‚ ‚ê‚ÎŽg‚¢“¹‚ª‚ ‚é‚ñ‚Å‚·B‚ ‚Ƃŏڂµ‚­à–¾‚µ‚Ü‚·B

æ‚Ù‚ÇPHP‚̃CƒP‚Ä‚È‚¢Š‚Æ‚µ‚āA‘½dŽÀ‘•‚ª‚Å‚«‚È‚¢ƒP[ƒX‚ª‚ ‚é‚Əq‚ׂ܂µ‚½‚ªAƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚Í’†g‚ª‚È‚¢‚Ì‚Å‹£‡‚ªâ‘΂ɋN‚±‚è‚Ü‚¹‚ñBƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚Å‚ ‚ê‚΁APHP‚Å‚à‘½dŽÀ‘•‚ª•ÛØ‚³‚ê‚é‚̂ŁAˆÀS‚µ‚ÄŽg‚¦‚Ü‚·B

ƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚ðŽg‚¢‚±‚È‚·

ƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚ÌŽg‚¢“¹‚Æ‚µ‚ẮA—áŠO‚̏_“î‚È•ß‘¨‚âAƒAƒmƒe[ƒVƒ‡ƒ“‚Ì‘ã‘Ö‚ª‹“‚°‚ç‚ê‚Ü‚·B

—áŠO‚̏_“î‚È•ß‘¨

—áŠO‚Ì•ß‘¨‚ɂ̓^ƒCƒvƒqƒ“ƒeƒBƒ“ƒO‚ð—˜—p‚Å‚«‚Ü‚·B

SPL‚É•W€“I‚È—áŠO‚ªˆê’Ê‚èŽÀ‘•‚³‚ê‚Ä‚¢‚é‚̂ŁA’ʏí‚Í‚±‚¿‚ç‚ÌŒ^ŠK‘w‚ðŽg‚Á‚Ä—áŠO•ß‘¨‚ð‹Lq‚·‚é‚Í‚¸‚Å‚·B‚µ‚©‚µ‚È‚ª‚çA“ÆŽ©‚Ì—áŠO‚ðì‚Á‚Ä“ÆŽ©‚Ì—áŠOˆ—‚ð‚µ‚½‚¢ê‡‚à‚ ‚é‚Å‚µ‚傤B‚±‚ÌŽžA“ÆŽ©‚Ì—áŠOƒNƒ‰ƒX‚ð’è‹`‚µ‚Ä‚µ‚Ü‚¤‚ƁASPL‚Æ‚Í•Ê‚ÌŒp³ƒcƒŠ[‚É‘®‚µ‚Ä‚µ‚Ü‚¤‚½‚߁Aˆê”Ê“I‚ÈSPL‚Ì—áŠO•ß‘¨‚ªŽg‚¦‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·B

‚±‚ñ‚ÈŽžAƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚ðŽg‚Á‚ÄŒ^‚ðƒ~ƒbƒNƒXƒCƒ“‚·‚é‚ƁASPL‚Å‚à“ÆŽ©Œ^‚Å‚à—áŠO‚ð•ß‘¨‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·B

interface MyExceptionMarker { }

class MyInvalidArgumentException extends InvalidArgumentException implements
  MyExceptionMarker
{
}

class MyOutOfBoundsException extends OutOfBoundsException implements
  MyExceptionMarker
{
}


//...

//‚±‚ê‚Å‚à—áŠO‚ð•ß‘¨‚Å‚«‚邵
try {
  doSomething();
} catch (InvalidArgumentException $e) {
  //...
} catch (OutOfBoundsException $e) {
  //...
}

//‚±‚ê‚Å‚à—áŠO‚ð•ß‘¨‚Å‚«‚é
try {
  doSomething();
} catch (MyExceptionMarker $e) {
  //...
}

‚±‚̃pƒ^[ƒ“‚ÍZend Framework‚È‚Ç‚ÅŽg‚í‚ê‚Ä‚¢‚Ü‚·B

ƒAƒmƒe[ƒVƒ‡ƒ“‚Ì‘ã‘Ö

ƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚́AƒNƒ‰ƒX‚É•t—^‚³‚ꂽƒƒ^î•ñ‚ÆŒ©‚È‚·‚±‚Æ‚à‚Å‚«‚Ü‚·BƒNƒ‰ƒX‚Ƀ^ƒO‚ð‘Å‚Á‚Ä‚¢‚é‚悤‚ÈŠ´‚¶‚Å‚·B‚Ȃ̂ŁAƒNƒ‰ƒXƒAƒmƒe[ƒVƒ‡ƒ“‚Ì‘ã‘ÖŽè’i‚Æ‚µ‚Ä—˜—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

‚½‚Æ‚¦‚ÎDIƒRƒ“ƒeƒi‚Å“Á’è‚̃Nƒ‰ƒX‚ðƒCƒ“ƒXƒ^ƒ“ƒX‰»‚·‚éÛA‚ ‚éƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚ª•t—^‚³‚ê‚Ä‚¢‚ê‚΃vƒƒpƒeƒB‚ðƒCƒ“ƒWƒFƒNƒVƒ‡ƒ“‚·‚é‚Æ‚©AƒCƒ“ƒXƒ^ƒ“ƒX‚ÌŠÇ—‚ðƒVƒ“ƒOƒ‹ƒgƒ“‚ɕύX‚·‚é‚Æ‚¢‚Á‚½‚±‚Æ‚ª‰Â”\‚Å‚·B‚±‚±‚Å‚Í‹ï‘Ì“I‚ÈŽÀ‘•‚ÍŽ¦‚µ‚Ü‚¹‚ñ‚ªAuƒNƒ‰ƒX‚»‚Ì‚à‚Ì‚ðˆµ‚¤ƒ‰ƒCƒuƒ‰ƒŠv‚Æ‘g‚ݍ‡‚킹‚é‚ƐFX‚ÈŽg‚¢•û‚ª‚ ‚é‚Í‚¸‚Å‚·B

namespace My\MarkerInterface as at;

//ƒNƒ‰ƒX‚ɁuƒVƒ“ƒOƒ‹ƒgƒ“‚Æ‚µ‚Ĉµ‚¦vuƒŒƒCƒW[ƒ[ƒh‚œǂݍž‚߁v‚Æ‚¢‚Á‚½ˆó‚ð‚‚¯‚Ä‚¢‚é
class Hoge implements
  at\Singleton,
  at\LazyLoad
{
  //...
}

ƒAƒmƒe[ƒVƒ‡ƒ“‚̃‰ƒCƒuƒ‰ƒŠ‚Ídoctrine/common‚È‚Ç‚ª‚ ‚è‚Ü‚·‚ªAƒ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚̏ꍇ‚̓ŠƒtƒŒƒNƒVƒ‡ƒ“‚·‚çŽg‚킸A‘f‚ÌPHP‚Ì‹@”\‚¾‚¯‚ÅŽÀŒ»‚Å‚«‚邽‚߁Aƒ‰ƒCƒuƒ‰ƒŠ‚É”ä‚ׂĈ³“|“I‚ɍ‚‘¬‚É“®ì‚µ‚Ü‚·B‚Ȃ̂Ń}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚ÌŽg‚¢‚Ç‚±‚ë‚͐FXŒ¤‹†‚Å‚«‚é‚Ì‚Å‚Í‚È‚¢‚Å‚µ‚傤‚©B

‚Ü‚Æ‚ß

  • ƒ‰ƒCƒuƒ‰ƒŠ‚̃vƒ‰ƒOƒCƒ“‹@\•”•ª‚Å“Á’è‚̃Nƒ‰ƒX‚ð—v‹‚·‚é‚̂͏ォ‚ç–ڐü‚Ń€ƒJ‚‚­ì‚è‚Å‚·B‚»‚¤‚¢‚¤ˆÌ‚»‚¤‚ȃ‰ƒCƒuƒ‰ƒŠ‚͍ì‚ç‚È‚¢‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B—v‹‚·‚é‚Ȃ班‚È‚­‚Æ‚àinterface‚ð—v‹‚µ‚Ä‚­‚¾‚³‚¢B
  • PHP‚Ìinterface‚Í‚»‚±‚܂Őô—û‚³‚ꂽ‚à‚Ì‚Å‚Í‚È‚¢‚Ì‚ÅŠú‘Ò‚µ‚·‚¬‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB
  • ŒöÌŒ^‚ðÌ—p‚µ‚Ä‚¢‚邪‚䂦‚ɉ½‚Æ‚©Žg‚¢“¹‚ªŽc‚Á‚Ä‚¢‚é‚̂ŁA—˜“_‚ðÅ‘åŒÀŠˆ—p‚µ‚Ü‚µ‚傤B
  • “Á‚Ƀ}[ƒJ[ƒCƒ“ƒ^[ƒtƒF[ƒX‚ÍPHP‚Å‚àŠ®‘S‚È”\—Í‚ð”­Šö‚·‚é‚̂ŁA‚à‚Á‚Æ‚Ý‚ñ‚ÈŽg‚¦‚΂¢‚¢‚ÆŽv‚¢‚Ü‚·B

ŽQl•¶Œ£

interface‚Æ‚¢‚¦‚ÎJava‚Å‚·‚̂ŁAEffective Java‚ ‚½‚è‚ð“ǂނƃ}ƒXƒ^[‚µ‚½Š´‚¶‚É‚È‚ê‚é‚ÆŽv‚¢‚Ü‚·B‚½‚¾Aâ”Å‚É‚È‚Á‚¿‚á‚Á‚½‚ñ‚Å‚·‚æ‚Ë‚¦cB PHP‚̉ðà–{‚É‚±‚ÌŽè‚Ì“à—e‚ª‘‚¢‚Ä‚ ‚邱‚Æ‚Í‹H‚È‹C‚ª‚µ‚Ü‚·B‘¼‚É‚¢‚¢–{‚È‚¢‚Å‚µ‚傤‚©‚ˁB

keyword: interface ƒfƒUƒCƒ“ƒpƒ^[ƒ“ OOP PHP

PHP‚̍ŐV‹LŽ–