此文章适用于小白阅读。简单的了解php中的魔术方法的概念以及使用
<?php
/**
魔术方法
在PHP的面向对象中,某些情况下,会自动调用的方法
PHP中,都是以 __ 双下划线开头的
__construct() 构造方法
__destruct() 析构方法
__clone() 克隆方法 当对象被克隆时候
写框架时非常实用的几个魔术方法
__call() 当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。返回方法名字和属性
__callstatic()
__get() 读取未定义的变量(无权访问或者不存在)的值时,__get() 会被调用
__set() 在给(无权操作或者不存在的变量)未定义的变量赋值时,__set() 会被调用。且自动传两个参数,属性和属性值
__isset() 判断不可访问的属性(无权访问或者不存在)时,会执行__isset(),
__unset() 销毁不可访问的属性(无权访问或者不存在)是,会执行__unset()
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),
__sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone() 等
方法在PHP中被称为"魔术方法"(Magic methods)。 你在命名自己的类方法时不能使用这些方法名,
除非你希望使用"魔术"功能。
****/
/*
class Human{
public $age = 28;
public function __clone(){
echo 'kelongkaiqi';
}
}
$lisi = new Human();
$zhangsan = clone $lisi; //kelongkaiqi
*/
class Human{
private $money = 2258;
protected $age = 28;
public $name = 'xiaoming';
public function __get($p){
echo 'you want to '.$p.',haha';
}
public function __set($a, $b){
echo 'you want set '.$a.' and values '.$b.'<br />';
// public function __unset($m) {
// echo 'you want to unset'.$m;
// }
}
}
$lisi = new Human();
echo $lisi->name.'<br />'; //xiaoming
//echo $lisi->age; //权限error ,如果没有__get()
echo $lisi->age.'<br />'; //you want to age,haha
echo $lisi->money.'<br />'; //you want to money,haha
echo $lisi->friend.'<br />'; //you want to friend,haha
echo '<hr />';
$lisi->aaa = 111;
$lisi->bbb = 222;
//print_r($lisi).'<br />'; //如果没有__set(),显示$lisi中已经有了aaa和bbb的属性了
/**
其实对象就是属性集,在js中尤为明显
但是太随便了,会导致对象属性过多,不好管理
**/
$lisi->ccc = 333;
print_r($lisi);
/*
you want set ccc and values 333
Human Object
(
[money:Human:private] => 2258
[age:protected] => 28
[name] => xiaoming
)
*/
echo '<hr />';
$lisi->name = 'laowang';//可以操作public,没有操作__set(),而是直接修改了
$lisi->money = 00000; //因为无权操作money,则调用了__set() you want setmoneyand values0
print_r($lisi);//xiaoming 已经通过__set()函数修改成laowang了,只能修改public,不能修改public和protected
//unset($lisi->money);
echo "<hr />";
class Dog{
public function __unset($p){
echo 'you want to unset'.$p;
}
public function __call($method, $argu){
echo 'you want to use '.$method.'<br />';
echo "and,this shuxing is";
print_r($argu);
}
public function __callstatic($method, $argu){
echo 'you want to use the static method'.$method.'<br />';
echo "and,this shuxing is";
print_r($argu);
}
/**
为什么 __callstatic() 没有变色
1.PHP5.3才最新添加的,所以系统还没有记录,可以修改语法文件,或者更换最新的语法文件
**/
}
$hua = new Dog();
unset($hua->leg); //you want to unsetleg 因为leg没有定义,所以调用了__unset();
$hua->say(1,2,3); //you want to use say and,this shuxing isArray ( [0] => 1 [1] => 2 [2] => 3 )
//调用一个不存在的方法say,会传给__call(),并且把方法名字和属性一同显示
Dog::cay('ku','daku','tongku');//you want to use the static methodcay and,this shuxing isArray ( [0] => ku [1] => daku [2] => tongku )
//调用一个不存在的静态方法
echo "<hr />";
class TianQi{
public function bj(){
echo 'beijing tianqiyubao';
}
public function __call($method, $args){
echo $method.'tianqiyubao';
}
}
$method = $_GET['method'];
$t = new TianQi();
if ($method) {
$t->$method(); //在地址栏输入?methd=bj 输出beijing tianqiyubao
//输入?method=tianjing 会调用__call()方法 输出tianjingtianqiyubao
}