Maison >développement back-end >tutoriel php >php 戏法方法
php 魔术方法
__construct()__set()__get()
__isset()__unset()
__autoload()
__call()
__clone()
__invoke()
__sleep()
__wakeup()
__construct()
构造方法: 在PHP中的构造方法要求不能进行构造方法的重载,即构造 方法只有一个.
?
function __construct($name="宋", $sex="", $age=1) { //构造方法在对象诞生时为成员属性赋初值 $this->name=$name; $this->sex=$sex; $this->age=$age;}
?说明:
?
? ? 1. 在一个类中,它只可能有一个构造方法.
? ? 2. 所默认的构造方法是public的,如果使用private的话,则会构成单例模式.
?
一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。
//__get()方法用来获取私有属性private function __get($property_name){ if(isset($this->$property_name)) { return($this->$property_name); }else { return(NULL); } }//__set()方法用来设置私有属性private function __set($property_name,$value){ $this->$property_name=$value;}
<?phpclass Person{ //下面是人的成员属性, 都是封装的私有成员 private $name; //人的名子 private $sex; //人的性别 private $age; //人的年龄 //__get()方法用来获取私有属性 private function __get($property_name) { echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; if (isset($this->$property_name)) { return ($this->$property_name); } else { return (NULL); } } //__set()方法用来设置私有属性 private function __set($property_name,$value) { echo"在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; $this->$property_name=$value; }}$p1=new Person();//直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值$p1->name="张三";$p1->sex="男";$p1->age=20;//直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值echo"姓名:".$p1->name."<br>";echo"性别:".$p1->sex."<br>";echo"年龄:".$p1->age."<br>";?>?程序执行结果:
private function __isset($nm){ echo"当在类外部使用isset()函数测定私有成员$nm时,自动调用<br>"; return isset($this->$nm);}
private function __unset($nm){ echo"当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm);}
<?phpclass Person{ //下面是人的成员属性 private $name; //人的名子 private $sex; //人的性别 private $age; //人的年龄 //__get()方法用来获取私有属性 private function __get($property_name) { if (isset($this->$property_name)) { return ($this->$property_name); } else { return (NULL); } } //__set()方法用来设置私有属性 private function __set($property_name, $value) { $this->$property_name = $value; } //__isset()方法 private function __isset($nm) { echo "isset()函数测定私有成员时,自动调用<br>"; return isset($this->$nm); } //__unset()方法 private function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm); }}$p1 = new Person();$p1->name = "this is a person name";echo var_dump(isset($p1->name)) . "<br>";echo $p1->name . "<br>";unset($p1->name);echo $p1->name;?>?输出结果为:
<?phpinclude_once "cls/clsA.php";include_once "cls/clsB.php";$obj_A = new clsA();$obj_B = new clsB();?>?处理加载步骤为:?
<?php $obj_A = new clsA(); $obj_B = new clsB(); function __autoload($className){ include_once "cls/$className.php"; } ?>?处理加载步骤为(使用autoload函数):?
<?php// PHP5 Used __autoload function $obj_A = new clsA(); // in "cls" directory! $obj_B = new clsB(); // in "cls/cls" directory! function __autoload($className){ if (strtolowwer($className) == "clsb") { require_once "cls/cls/$className.php"; } else { include_once "cls/$className.php"; }}?>
<?phpclass TestClass{ public $foo; public function __construct($foo) { $this->foo = $foo; } //定义一个__toString方法,返加一个成员属性$foo public function __toString() { return $this->foo; }}$class = new TestClass('Hello');//直接输出对象Cheap Sunglassesecho $class;?>
__call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求这里的未定义的方法包括没有权限访问的方法
?
<?php//当试图调用类中一个不存在或者不可用的方法时,//会执行该类中的__call()__call()必须接受两个参数,//第一个参数存放方法名称,//第二个参数存放不存在的方法的参数(此参数会放在与该参数同名的数组中)class callclass{ function __call($method_name, $p) { echo "使用__call尝试调用一个不存在/不可用的成员方法<br>"; echo $method_name; echo "<pre class="brush:php;toolbar:false">"; print_r($p); echo ""; }}$obj = new callclass();$obj->method(1, 2, "Hello", "HP");?>?输出:
?
method
Array
(
? ? [0] => 1
? ? [1] => 2
? ? [2] => Hello
? ? [3] => HP
)
?
?