18
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

YYPHPAdvent Calendar 2018

Day 25

PHPって面白い

Last updated at Posted at 2018-12-26

はじめに

この記事は、YYPHP アドベントカレンダーの最終日として書きました。
PHPをこれまで使っていた方も、これから使う方も、なんか面白そうな言語だなっていうのを再認識し、PHPという言語を使うモチベーションの1つになればいいなと思います。
自分的に面白いなっていう感じの実装をつらつらと書いてみましたので、実用的なものも黒魔術的なものもあります。
用法容量を守り正しく使ってください。

メソッドチェーン

PHPでもメソッドチェーン使える。すごい。
そしてついでに戻り値を変数でとるようにしてみました。

adder.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 で管理したり、メソッドを実装したりしていますが、こんな感じでちょっと面白いトリッキーな実装ができそうですよね。

trick.php
<?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');

リファレンスを返すメソッド

参照渡しといえば変数を渡すという認識が強いと思いますが、以下のようにリファレンスを返すメソッドも作れます。
実際にこの実装されてるとちょっと事故りそうで怖いですね。

ref.php
<?php
class RefVal{
	var $val = 'original';

    public function &ref(){
		return $this->val;
	}
}
$ref = new RefVal;
$val = &$ref->ref();
$val = 'modified';
echo $ref->val;

アンダースコア

PHPはクラス名・メソッド名・変数名にアンダースコアを使えます。
こんな書き方もできるんですが、ちょっとカオスですよね。

underline.php
<?
class _{
    public static function __(){ return "__"; }
    public static function ___(){ return "___"; }
}
function _(){ return "_"; }

$_ = _();
$__ = _::__();
$___ = _::___();

echo $_;
echo $__;
echo $___;

まとめ

どれか1つでも PHPチョットオモシロイ ってなれました?
PHPにはその他にも面白い実装がたくさんありますので、年末年始に時間がある方は是非調べてみてください。

18
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?