关于php中的魔术方法
魔术方法是以"__"开头的、具有特殊作用的一些方法,可以看做php的语法糖。语法糖定义,还有语法盐,语法糖精,维基百科上都有。
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
__construct()方法用于创建对象时对对象的属性进行赋值。可以进行一些初始化操作,比如连接数据库。__destruct方法是析构函数
对于私有属性是无法直接通过$student->name这种方法获得或设置的,但是可以添加__get和__set方法,这样就可以在类外部调用了。__get($name) __set($name,$value)。参数中的$name应该是不可以写成别的。这两种方法归为PHP的重载,PHP中的重载指动态的创建类的属性和方法,与JAVA中的不同。有了这两个方法,即使这个属性不存在也不会报错,从这里发现这个思路与语法盐是背离的。需要理解的是,这两个方法是隐式调用的。
__call和__callStatic方法 __call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。__call($funcname, $arguments),__callStatic($funcname, $arguments),感觉用法很灵活,具体可以看。
里面学到了几个方法,get_called_class()获取静态调用方法调用的类。list()用数组为一系列变量赋值。in_array()方法判断一个值是否在数组中。同时静态的方法通过类名::方法名来调用而不是->,内部使用self::或者parent::对于书中提到实现将strlen(trim($str))调用变成$str->trim()->strlen()的调用方式,我自己写了一下代码,感觉自己吊吊哒。代码如下``
class myString {
public $str;
public function __construct($str){
$this->str=$str;
}
public function __call($fun,$args){
switch($fun){
case 'trim':
$this->str=trim($this->str);
return $this;
case 'strlen':
return strlen($this->str);
break;
}
}
}
$a=new myString(' xiaoming ');
echo $a->trim()->strlen();
__toString()魔术方法其实和java里面的toString是类似的,可以再echo的时候自动调用