はじめに
この記事は、YYPHP アドベントカレンダーの最終日として書きました。
PHPをこれまで使っていた方も、これから使う方も、なんか面白そうな言語だなっていうのを再認識し、PHPという言語を使うモチベーションの1つになればいいなと思います。
自分的に面白いなっていう感じの実装をつらつらと書いてみましたので、実用的なものも黒魔術的なものもあります。
用法容量を守り正しく使ってください。
メソッドチェーン
PHPでもメソッドチェーン使える。すごい。
そしてついでに戻り値を変数でとるようにしてみました。
<?php
class Adder{
private $sum = 0;
public static function instance(){
return new self;
}
public function add($value){
$this->sum += $value;
return $this;
}
public function result(&$result){
$result = $this->sum;
return $this;
}
}
Adder::instance()->add(1)->add(2)->result($val1)->add(3)->add(4)->result($val2);
echo "val1={$val1},val2={$val2}";
マジックメソッド
ゲッタ・セッタ・そしてメソッドまでも特殊なマジックメソッドで管理することができます。
以下ではインスタンス変数をすべて $properties
で管理したり、メソッドを実装したりしていますが、こんな感じでちょっと面白いトリッキーな実装ができそうですよね。
<?php
class TrickClass{
private $properties = [];
public function __call(string $name, array $args){
if($name == 'add' && count($args) == 2){
return $this->{$args[0]} + $this->{$args[1]};
}
trigger_error("メソッド[{$name}]は存在しないよ");
}
public function __get(string $name){
if(!isset($this->properties[$name])){
return null;
}
return $this->properties[$name];
}
public function __set(string $name, $val){
$this->properties[$name] = $val;
}
}
$hoge = new TrickClass;
$hoge->a = 2;
$hoge->b = 4;
echo $hoge->add('a', 'b');
リファレンスを返すメソッド
参照渡しといえば変数を渡すという認識が強いと思いますが、以下のようにリファレンスを返すメソッドも作れます。
実際にこの実装されてるとちょっと事故りそうで怖いですね。
<?php
class RefVal{
var $val = 'original';
public function &ref(){
return $this->val;
}
}
$ref = new RefVal;
$val = &$ref->ref();
$val = 'modified';
echo $ref->val;
アンダースコア
PHPはクラス名・メソッド名・変数名にアンダースコアを使えます。
こんな書き方もできるんですが、ちょっとカオスですよね。
<?
class _{
public static function __(){ return "__"; }
public static function ___(){ return "___"; }
}
function _(){ return "_"; }
$_ = _();
$__ = _::__();
$___ = _::___();
echo $_;
echo $__;
echo $___;
まとめ
どれか1つでも PHPチョットオモシロイ ってなれました?
PHPにはその他にも面白い実装がたくさんありますので、年末年始に時間がある方は是非調べてみてください。