PHP很有趣
首先
這篇文章是作為YYPHP Advent Calendar的最終日來寫的。
不管是以前一直使用PHP的人,還是將來打算使用PHP的人,我希望這可以再次讓大家意識到PHP是一門有趣的語言,並成為使用PHP的動機之一。
我隨意地寫了一些我自己覺得有趣的實作,其中有些是實用的、有些是黑魔術的。
請謹守使用原則並正確使用。
方法链
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}";
魔法方法
我们可以使用特殊的魔术方法来管理Getter、Setter和Method。
在下面的示例中,我们使用$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 $___;
总结
你有没有对PHP稍微感兴趣?PHP除了其他有很多有趣的实现,所以如果你在年末年始有时间的话,请务必去研究一下。