ããããªãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®PHPã³ãŒããç ç©¶ããããšããããªããäºéã¢ã³ããŒã¹ã³ã¢ã§å§ãŸãã¡ãœããã«åºããããããããŸããã ãããã¯ãã€ã³ã¹ã¿ã³ã¹ã䜿çšããããŸããŸãªæäœäžã«ãªããžã§ã¯ãã®åäœã決å®ã§ããéåžžã«éæ³ã®ã¡ãœããã§ãã
ããªãäžè¬çãªæ¹æ³ãããããããã§ã«ãããã®ããã€ãã«åºãããããšæããŸãããæèœãªPHPããã°ã©ããŒã¯èšèªã®ãã¹ãŠã®æ©èœã«èªä¿¡ãæã€å¿
èŠããããšæããŸãã
ããã¯ãéæ³ã®æ¹æ³ã®äžçã«ãããäžçš®ã®åºçºç¹ãšèããããšãã§ãããšæããŸãã
ã¯ããã«
ç§ããã®è³æãèªåã§å匷ãããšããç§ã¯ããªãæããªããŸãã¯äžè¬ã«åœ¹ã«ç«ããªãäŸã瀺ãããã¹ãŠã®çš®é¡ã®æç§æžãšèšäºã䜿çšããŸããã äœããçè§£ããããã«ã¯ãå®éã®ã¿ã¹ã¯ã®ã³ã³ããã¹ãã§ããã詊ãå¿
èŠããããšæããŸãã ããããå§ããŸãã
Tweeter Apiã䜿çšããŠãã¹ãŠã®ãã€ãŒããååŸããããšæ³åããŠãã ããã çŸåšã®ãŠãŒã¶ãŒã®ãã¹ãŠã®ãã€ãŒãã®JSONãååŸããç¹å®ã®æäœãèš±å¯ããã¡ãœããã䜿çšããŠãåãã€ãŒãããªããžã§ã¯ãã«å€æããŸãã
以äžã«ãåºæ¬ã®Tweetã¯ã©ã¹ã玹ä»ããŸããã
class Tweet { }
ãªããžã§ã¯ããäœæããã®ã§ãã¡ãœããèªäœã®åŠç¿ãéå§ã§ããŸãã ïŒæ³šç¿»èš³è
-äžéšã®èšèšã¯ãåã¡ãœããã®åœ¹å²ãšæ©èœã匷調ããããã«çç¥ãããå ŽåããããŸãïŒ
ã³ã³ã¹ãã©ã¯ã¿ãŒãšãã¹ãã©ã¯ã¿ãŒ
ããããæãäžè¬çãªéæ³ã®ã¡ãœããã®1ã€ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒïŒ__constructïŒïŒïŒã§ãã ããªããç§ã®ããã°ã§Cribbbã¢ããªã±ãŒã·ã§ã³ãååã«è¿œã£ãŠããã°ããã®æ¹æ³ãããç¥ã£ãŠããã§ãããã
__constructïŒïŒã¡ãœããã¯ããªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããããšèªåçã«åŒã³åºãããŸãã ãã®äžã§ããªããžã§ã¯ãã®åæããããã£ãèšå®ããããäŸåé¢ä¿ãèšå®ãããã§ããŸãã
䜿çšäŸïŒ
public function __construct($id, $text) { $this->id = $id; $this->text = $text; } $tweet = new Tweet(123, 'Hello world');
Tweetã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åãããšãã«ã__ constructïŒïŒã¡ãœããã«æž¡ããã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããŸãã äžèšã®äŸããããã®ã¡ãœãããåŒã³åºãããåŒã³åºãã¹ãã§ã¯ãªãããšãããããŸãããã®ã¡ãœããã¯èªåçã«åŒã³åºãããŸãã
æéãçµã€ã«ã€ããŠãã¯ã©ã¹ãç¶æ¿ããŠæ¡åŒµããå¿
èŠããããŸãã 芪ã¯ã©ã¹ã«ã¯ãç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ãã__constructïŒïŒã¡ãœãããããå ŽåããããŸãããã®ããã芪ã¯ã©ã¹ã®æ©èœã倱ããªãããã«ããã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãå¿
èŠããããŸãã
class Entity { protected $meta; public function __construct(array $meta) { $this->meta = $meta; } } class Tweet extends Entity { protected $id; protected $text; public function __construct($id, $text, array $meta) { $this->id = $id; $this->text = $text; parent::__construct($meta); } }
ãªããžã§ã¯ããåé€ããããšãããšã__ destructïŒïŒã¡ãœãããåŒã³åºãããŸãã ç¹°ãè¿ããŸãããã³ã³ã¹ãã©ã¯ã¿ãšã®é¡æšã«ãããããã¯åŒã³åºãå¿
èŠã®ãããã®ã§ã¯ãããŸãããPHPããã¹ãŠãåŠçããããã§ãã ãã®ã¡ãœããã䜿çšãããšãããŒã¿ããŒã¹æ¥ç¶ãªã©ããªããžã§ã¯ãã§äœ¿çšãããã¹ãŠãã¯ãªã¢ã§ããŸãã
public function __destruct() { $this->connection->destroy(); }
æ£çŽã«èšããšãäžèšã®__destructïŒïŒã¡ãœããã®ã»ãšãã©ãããªãããé ããŸããã PHPã¯ãå®éã«ããã»ã¹ãååã«é·ãéååšããèšèªã®1ã€ã§ã¯ãªãããããã¹ãã©ã¯ã¿ãå¿
èŠã«ãªãå¯èœæ§ããããã®ã¯ãªããšæããŸãã PHPèªäœã®ãªã¯ãšã¹ãã©ã€ããµã€ã¯ã«ã¯éåžžã«å°ããããããã®æ¹æ³ã¯è¯ããšãããããé¢åã§ãã
ã²ãã¿ãŒãšã»ãã¿ãŒ
PHPã§ãªããžã§ã¯ããæäœããå Žåãæ¬¡ã®ããã«ãªããžã§ã¯ãã®ããããã£ãåç
§ãããã§ãããã
$tweet = new Tweet(123, 'hello world'); echo $tweet->text;
ãã ããtextããããã£ã«ä¿è·ãããã¢ã¯ã»ã¹ä¿®é£Ÿåãèšå®ãããŠããå Žåããã®ãããªåŒã³åºãã¯ãšã©ãŒãåŒãèµ·ãããŸãã
__getïŒïŒããžãã¯ã¡ãœããã¯ãéãããªãã¯ããããã£ãžã®åŒã³åºãããã£ããããŸãã
public function __get($property) { if (property_exists($this, $property)) { return $this->$property; } }
__getïŒïŒã¡ãœããã¯ãã¢ã¯ã»ã¹ããããããã£ã®ååãåŒæ°ãšããŠåãåããŸãã äžèšã®äŸã§ã¯ããªããžã§ã¯ãå
ã®ããããã£ã®ååšãæåã«ãã§ãã¯ãããååšããå Žåã¯ãã®å€ãè¿ãããŸãã
äžèšã®äŸã®ããã«ããã®ã¡ãœãããçŽæ¥åŒã³åºãã¹ãã§ã¯ãããŸãããPHPã¯ãéãããªãã¯ã¯ã©ã¹ããããã£ã«ã¢ã¯ã»ã¹ããããšãããã³ã«ãã®ã¡ãœãããåŒã³åºããŸãã
éã®ç¶æ³-ãããªãã¯ã§ã¯ãªãããããã£ã®å€ãèšå®ããããšãããšããšã©ãŒãçºçããŸãã ãŸããPHPã«ã¯ãéãããªãã¯ãã£ãŒã«ãã«å€ãèšå®ããããšãããšãã«åŒã³åºãããã¡ãœããããããŸãã ãã®ã¡ãœããã¯ãåŒæ°ãšããŠ2ã€ã®ãã©ã¡ãŒã¿ãŒãåãåããŸããå€ãæžã蟌ãããããã£ãšå€èªäœã§ãã
ãã®ã¡ãœããã䜿çšããå Žåãã¯ã©ã¹ã¯æ¬¡ã®ãããªããããã£ãååŸããŸãã
public function __set($property, $value) { if (property_exists($this, $property)) { $this->$property = $value; } } $tweet->text = 'Setting up my twttr'; echo $tweet->text;
äžèšã®äŸã§ã¯ããããªãã¯ã¢ã¯ã»ã¹ä¿®é£Ÿåãæããªãããããã£ã®å€ãååŸãŸãã¯èšå®ããæ¹æ³ã瀺ããŸããã ãã ãããããã®éæ³ã®æ¹æ³ã§äœæ¥ããããšãåžžã«æè¯ã®ã¢ã€ãã¢ãšã¯éããŸããã ãã®å Žåãç¹å®ã®APIã圢æããã¹ãã¬ãŒãžãŸãã¯åŠçã¡ãœããã倿ŽããŠãã³ãŒããç Žæããªããããããããã£ãååŸããã³æžã蟌ãããã®å€ãã®ã¡ãœãããçšæããããšããå§ãããŸãã
ãã ãã__ getïŒïŒããã³__setïŒïŒã¡ãœãããçºçããããšããããŸãããããã¯ãããããäžè¬ã«ã²ãã¿ãŒããã³ã»ãã¿ãŒãšåŒã°ããŠããŸãã å€ã倿Žããããããžãã¹ããžãã¯ãå°ã远å ãããããå Žåã¯ãããã¯éåžžã«è¯ããœãªã¥ãŒã·ã§ã³ã§ãã
ååšãã§ãã¯
PHPã«ç²ŸéããŠããå ŽåãissetïŒïŒé¢æ°ã®ååšãç¥ã£ãŠããå¯èœæ§ãé«ããããã¯éåžžãé
åãæäœãããšãã«äœ¿çšãããŸãã ããããã£ããªããžã§ã¯ãã«èšå®ãããŠãããã©ãããçè§£ããããã«ããã®é¢æ°ã䜿çšããããšãã§ããŸãã ããžãã¯__issetïŒïŒã¡ãœãããå®çŸ©ããŠããããªãã¯ããããã£ã ãã§ãªãä»ã®ããããã£ããã§ãã¯ã§ããããã«ããããšãã§ããŸãã
public function __isset($property) { return isset($this->$property); } isset($tweet->text);
äžèšã®ããã«ã__ issetïŒïŒã¡ãœããã¯é¢æ°åŒã³åºãã远跡ããŠååšã確èªããåŒæ°ãšããŠããããã£ã®ååãåãåããŸãã æ¬¡ã«ããã®ã¡ãœããã§issetïŒïŒé¢æ°ã䜿çšããŠååšã確èªã§ããŸãã
å¯å€ã¯ãªãŒãã³ã°
issetïŒïŒé¢æ°ãšã®é¡æšã«ãããé
åãæäœããå Žåã¯éåžžunsetïŒïŒé¢æ°ã䜿çšãããŸãã ç¹°ãè¿ããŸãããunsetïŒïŒé¢æ°ã䜿çšããŠãéãããªãã¯ããããã£ã®å€ãã¯ãªã¢ã§ããŸãã ãã®ã¡ãœãããéãããªãã¯ããããã£ã«é©çšããã«ã¯ã__ unsetïŒïŒã¡ãœãããå¿
èŠã§ãããã®ã¡ãœããã¯ãéãããªãã¯ã¯ã©ã¹ããããã£ãã¯ãªã¢ãã詊ã¿ã远跡ããŸãã
public function __unset($property) { unset($this->$property); }
æååã«ãã£ã¹ã
__toStringïŒïŒã¡ãœããã䜿çšãããšããªããžã§ã¯ããæåååã«ãã£ã¹ãããããšãããšãã«ãã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã決å®ã§ããŸãã
äŸïŒ
public function __toString() { return $this->text; } $tweet = new Tweet(1, 'hello world'); echo $tweet;
ããšãã°ããšã³ãŒã䜿çšããå Žåãªã©ããªããžã§ã¯ããæååãšããŠåç
§ããããšãããšã__ toStringïŒïŒã¡ãœããã§å®çŸ©ãããšããã«ãªããžã§ã¯ããè¿ãããŸãã
ãã®å Žåã®è¯ãäŸã¯ãLaravelãã¬ãŒã ã¯ãŒã¯ã®Eloquent Modelsã§ãã ãªããžã§ã¯ããæååã«ãã£ã¹ãããããšãããšãjsonãè¿ãããŸãã Laravelããããã©ã®ããã«è¡ãããç¥ãããå Žåã¯ã
ãœãŒã¹ã³ãŒããåç
§ããããšããå§ãã
ãŸã ã
ç¡ç ãšèŠé
ã·ãªã¢ã«å颿°ïŒserializeïŒïŒïŒã¯ããªããžã§ã¯ããæ ŒçŽããããªãäžè¬çãªæ¹æ³ã§ãã ããšãã°ããªããžã§ã¯ããããŒã¿ããŒã¹ã«ä¿åããå Žåã¯ãæåã«ãªããžã§ã¯ããã·ãªã¢ã«åããŠããä¿åããå床å¿
èŠã«ãªã£ããšãã«ååŸããŠéã·ãªã¢ã«åããå¿
èŠããããŸãïŒéã·ãªã¢ã«åïŒïŒïŒã
__sleepïŒïŒã¡ãœããã䜿çšãããšãä¿åããããããã£ã決å®ã§ããŸãã ããšãã°ãæ¥ç¶ãå€éšãªãœãŒã¹ãä¿æããããªãå Žåã
ãªããžã§ã¯ããäœæãããšãããã®ä¿åã®ã¡ã«ããºã ãæ±ºå®ããããšæ³åããŠãã ããã
$tweet = new Tweet(123, 'Hello world', new PDO ('mysql:host=localhost;dbname=twttr', 'root'));
ãªããžã§ã¯ããä¿åããæºåããããšããå°æ¥çã«ã¯ç¡æå³ã«ãªãã®ã§ãããŒã¿ããŒã¹ãžã®æ¥ç¶ãä¿åããå¿
èŠã¯ãããŸããã
ãããã£ãŠã__sleepïŒïŒã¡ãœããã§ã¯ãä¿åããå¿
èŠãããããããã£ã®é
åãå®çŸ©ããŸãã
public function __sleep() { return array('id', 'text'); }
ãããŠããªããžã§ã¯ããç®èŠããããæãæ¥ãããã·ãªã¢ã©ã€ãºäžã«ä¿åããªãã£ããã¹ãŠã®ãã®ãå¿
èŠã«ãªããããããŸããã ç¹å®ã®äŸã§ã¯ãããŒã¿ããŒã¹ãžã®æ¥ç¶ã確ç«ããå¿
èŠããããŸãã ããã¯ãããžãã¯__wakeupïŒïŒã¡ãœããã䜿çšããŠå®è¡ã§ããŸãã
public function __wakeup() { $this->storage->connect(); }
ã¡ãœããåŒã³åºã
__callïŒïŒããžãã¯ã¡ãœããã¯ãéãããªãã¯ã¡ãœãããåŒã³åºããã¹ãŠã®è©Šè¡ãã€ã³ã¿ãŒã»ããããŸãã ããšãã°ã倿ŽããããŒã¿ã®é
åãããå ŽåããããŸãã
class Tweet { protected $id; protected $text; protected $meta; public function __construct($id, $text, array $meta) { $this->id = $id; $this->text = $text; $this->meta = $meta; } protected function retweet() { $this->meta['retweets']++; } protected function favourite() { $this->meta['favourites']++; } public function __get($property) { var_dump($this->$property); } public function __call($method, $parameters) { if (in_array($method, array('retweet', 'favourite'))) { return call_user_func_array(array($this, $method), $parameters); } } } $tweet = new Tweet(123, 'hello world', array('retweets' => 23, 'favourites' => 17)); $tweet->retweet(); $tweet->meta;
å¥ã®å
žåçãªäŸã¯ããªããžã§ã¯ãã§ã®å¥ã®ãããªãã¯APIã®äœ¿çšã§ãã
class Location { protected $latitude; protected $longitude; public function __construct($latitude, $longitude) { $this->latitude = $latitude; $this->longitude = $longitude; } public function getLocation() { return array( 'latitude' => $this->latitude, 'longitude' => $this->longitude, ); } } class Tweet { protected $id; protected $text; protected $location; public function __construct($id, $text, Location $location) { $this->id = $id; $this->text = $text; $this->location = $location; } public function __call($method, $parameters) { if(method_exists($this->location, $method)) { return call_user_func_array(array($this->location, $method), $parameters); } } } $location = new Location('37.7821120598956', '-122.400612831116'); $tweet = new Tweet(123, 'Hello world', $location); var_dump($tweet->getLocation());
äžèšã®äŸã§ã¯ãTweetã¯ã©ã¹ã®ãªããžã§ã¯ãã§getLocationã¡ãœãããåŒã³åºãããšãã§ããŸãããå®éã«ã¯Locationã¯ã©ã¹ã«å§ä»»ããŸãã
éçã¡ãœãããåŒã³åºãããšããŠããå Žåã¯ã__ callStaticïŒïŒããžãã¯ã¡ãœããã䜿çšã§ããŸãã èŠããŠããã¹ãäž»ãªããšã¯ãéçã¡ãœãããåŒã³åºããšãã«ã®ã¿æ©èœããããšã§ãã
ã¯ããŒãã³ã°
PHPã§ãªããžã§ã¯ãã®ã³ããŒãäœæãããšãå®éã«ã¯ãæ°ãããªããžã§ã¯ãã倿°ã«æžã蟌ãŸããã®ã§ã¯ãªããå
ã®ãªããžã§ã¯ããåç
§ããèå¥åãæžã蟌ãŸããŸãã ã€ãŸããåç
§å
ãªããžã§ã¯ãã®å€æŽã¯å
ã®ãªããžã§ã¯ãã®å€æŽã䌎ããŸããããªããžã§ã¯ããåé€ããŠãä»ã®ãªããžã§ã¯ãã®ååšã«ã¯åœ±é¿ããŸããã
$sheep1 = new stdClass; $sheep2 = $sheep1; $sheep2->name = "Polly"; $sheep1->name = "Dolly"; echo $sheep1->name;
$a = new StdClass; $b = $a; $a = null; var_dump($b);
ãªããžã§ã¯ãã®ã³ããŒãäœæããã«ã¯ãcloneããŒã¯ãŒãã䜿çšããå¿
èŠããããŸãã
$sheep1 = new stdClass; $sheep2 = clone $sheep1; $sheep2->name = "Polly"; $sheep1->name = "Dolly"; echo $sheep1->name;
ãã ããè€æ°ã®é¢é£ãªããžã§ã¯ããããå Žåããããã«å«ãŸããäŸåé¢ä¿ãã³ããŒãããŸãã
class Notification { protected $read = false; public function markAsRead() { $this->read = true; } public function isRead() { return $this->read == true; } } class Tweet { protected $id; protected $text; protected $notification; public function __construct($id, $text, Notification $notification) { $this->id = $id; $this->text = $text; $this->notification = $notification; } public function __call($method, $parameters) { if(method_exists($this->notification, $method)) { return call_user_func_array(array($this->notification, $method), $parameters); } } } $tweet1 = new Tweet(123, 'Hello world', new Notification); $tweet2 = clone $tweet1; $tweet1->markAsRead(); var_dump($tweet1->isRead());
ãã®åé¡ã解決ããããã«ã__cloneïŒïŒã¡ãœãããå®çŸ©ããŠæ£ããåäœã決å®ã§ããŸãã
class Tweet { protected $id; protected $text; protected $notification; public function __construct($id, $text, Notification $notification) { $this->id = $id; $this->text = $text; $this->notification = $notification; } public function __call($method, $parameters) { if(method_exists($this->notification, $method)) { return call_user_func_array(array($this->notification, $method), $parameters); } } public function __clone() { $this->notification = clone $this->notification; } } $tweet1 = new Tweet(123, 'Hello world', new Notification); $tweet2 = clone $tweet1; $tweet1->markAsRead(); var_dump($tweet1->isRead());
ãªããžã§ã¯ãã颿°ãšããŠåŒã³åºã
éæ³ã®ã¡ãœãã__invokeïŒïŒã䜿çšãããšããªããžã§ã¯ãã«é¢æ°ãšããŠã¢ã¯ã»ã¹ããããšãããšãã«ããªããžã§ã¯ãã®ããžãã¯ãå€å¥ã§ããŸãã
class User { protected $name; protected $timeline = array(); public function __construct($name) { $this->name = $name; } public function addTweet(Tweet $tweet) { $this->timeline[] = $tweet; } } class Tweet { protected $id; protected $text; protected $read; public function __construct($id, $text) { $this->id = $id; $this->text = $text; $this->read = false; } public function __invoke($user) { $user->addTweet($this); return $user; } } $users = array(new User('Ev'), new User('Jack'), new User('Biz')); $tweet = new Tweet(123, 'Hello world'); $users = array_map($tweet, $users); var_dump($users);
ãã®äŸã§ã¯ã$ tweetãªããžã§ã¯ããã³ãŒã«ããã¯é¢æ°ãšããŠ$ usersé
åã®ãã¹ãŠã®å€ã«é©çšããŸãã ãã®äŸã§ã¯ãåãŠãŒã¶ãŒã«ãã€ãŒãã远å ããŸãã ç§ã¯åæããŸãããã®äŸã¯å°ã人工çã§ããããã®æ¹æ³ã®ã¢ããªã±ãŒã·ã§ã³ã¯æ¬åœã«èŠã€ãããšç¢ºä¿¡ããŠããŸãã
ãããã«
ã芧ã®ãšãããPHPã¯ããžãã¯ã¡ãœããã䜿çšããŠããªããžã§ã¯ãã®ã¡ãœãããŸãã¯ããããã£ã§ç¹å®ã®ã¢ã¯ã·ã§ã³ã«å¿çããŸãã ãããã®åã¡ãœããã¯èªåçã«åäœããäœããã¹ããã倿ããã ãã§ãæ®ãã¯PHPãåŠçããŸãã
ããªãé·ãéãç§ã¯éæ³ã®æ¹æ³ã®æ¬åœã®æå³ãçè§£ããŠããŸããã§ããã ãªããžã§ã¯ãã䜿ã£ãŠé¢çœãããšãããããã ãã«å¿
èŠã ãšæããŸããã ãããŠæçµçã«åœŒãã®æ¬åœã®ç®çãçè§£ãããšããç§ã¯ããæ·±å»ãªã¢ããªã±ãŒã·ã§ã³ã®ãã¬ãŒã ã¯ãŒã¯ã§ãã匷åãªãªããžã§ã¯ããæžãããšãã§ããŸããã
ãã®ã¬ã€ãã«ç€ºãããŠããåäŸã§ãæ¥åžžã®ã¿ã¹ã¯ã§éæ³ã®ææ³ãã©ã®ããã«åœ¹ç«ã€ãã瀺ãããšãã§ãããšæããŸãã ãããŠãç§ãããªããããã€ãã®è³æã説æãããšãããã®å®éçãªå¿çšã説æããªããšãããããæ¬åœã«è¿·æã§ããããšã«åæããæåã§ã¯ãããŸããã
æçš¿è
ïŒPhilip Brown
ãªãªãžãã«ïŒ
culttt.com/2014/04/16/php-magic-methodsããããšãïŒ
werdender ã
HighQualityPSç³ãèš³ãããŸããããç§ã¯ããã€ãã®å Žæã§ã®ç¿»èš³ãããªãäžåšçšã§ããããšãç¥ã£ãŠããŸãã ããªãããããããè¯ãèãããæ¹æ³ãç¥ã£ãŠãããªã-ç§ã«æžããŠãç§ã¯ãããä¿®æ£ããããšããŸãã