第58回PHP勉強会@東京 - events.php.gr.jp
久々のPHP勉強会だったのでPhakeについて発表をしてきました。とても久々のPHP勉強会でしたが、懇親会で色々お話もできて楽しかったです。
訂正
Phake::mock()の第2引数以降がうんたら書いてますけど、第2引数以降がコンストラクタの引数になるのはパーシャルモックのときだけでした。
id:sotarokのPHP 5.4の話のときにもいってたんですけど、「ゲッターセッター用意するの面倒だからAccessorってトレイトつくったよ!」「おれも!」みたいなことがあったりして、考えることはまったく同じですね。僕が作ってたときのソースさらしておきます。__call()をトレイトで実装しちゃうと、__call()が衝突しちゃうので一応メソッドわけてます。MagicCallMixerトレイトとか作ったけど消しちゃったらしい。
<?php
namespace Fivestar;
trait Accessor
{
public function __call($method, $args)
{
return $this->callMagicAccessor($method, $args);
}
public function magicCallAccessor($method, $args)
{
$processMethod = strtolower($method);
if ('set' === ($verb = substr($processMethod, 0, 3))
|| 'get' === ($verb = substr($processMethod, 0, 3))
|| 'is' === ($verb = substr($processMethod, 0, 2))
) {
$camelName = lcfirst(substr($method, strlen($verb)));
$underscoreName = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $camelName));
$property = null;
if (property_exists($this, $camelName)) {
$property = $camelName;
} elseif (property_exists($this, $underscoreName)) {
$property = $underscoreName;
}
if (null !== $property) {
if ('set' === $verb) {
$this->{$property} = array_shift($args);
return;
} elseif ('get' === $verb || 'is' === $verb) {
return $this->{$property};
}
}
}
throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s', get_class($this), $method));
}
}
最後に、会場を提供していただいたVOYAGE GROUPさん、ありがとうございました。
