魔术方法之简单实例

此文章适用于小白阅读。简单的了解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
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值