时间:2021-07-01 10:21:17 帮助过:21人阅读
__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()”。
上一节中,我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加://__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;}
"; if (isset($this->$property_name)) { return ($this->$property_name); } else { return (NULL); } } //__set()方法用来设置私有属性 private function __set($property_name,$value) { echo"在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值?程序执行结果:在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
"; $this->$property_name=$value; }}$p1=new Person();//直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值$p1->name="张三";$p1->sex="男";$p1->age=20;//直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值echo"姓名:".$p1->name."
";echo"性别:".$p1->sex."
";echo"年龄:".$p1->age."
";?>
private function __isset($nm){ echo"当在类外部使用isset()函数测定私有成员$nm时,自动调用?__unset()方法:看这个方法之前呢,我们也先来看一下“unset()”这个函数,“unset()”这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。那么如果在一个对象外部去删除对象内部的成员属性用“unset()”函数可不可以呢,也是分两种情况,如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果对象的成员属性是私有的,我使用这个函数就没有权限去删除,但同样如果你在一个对象里面加上“__unset()”这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了“__unset()”这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,自动调用“__unset()”函数来帮我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。在对象里面加上下面的代码就可以了:
"; return isset($this->$nm);}
private function __unset($nm){ echo"当在类外部使用unset()函数来删除私有成员时自动调用的?我们来看一个完整的实例:
"; unset($this->$nm);}
$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()函数测定私有成员时,自动调用?输出结果为:isset()函数测定私有成员时,自动调用bool(true)this is a person name当在类外部使用unset()函数来删除私有成员时自动调用的isset()函数测定私有成员时,自动调用
"; return isset($this->$nm); } //__unset()方法 private function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的
"; unset($this->$nm); }}$p1 = new Person();$p1->name = "this is a person name";echo var_dump(isset($p1->name)) . "
";echo $p1->name . "
";unset($p1->name);echo $p1->name;?>
foo = $foo; } //定义一个__toString方法,返加一个成员属性$foo public function __toString() { return $this->foo; }}$class = new TestClass('Hello');//直接输出对象Cheap Sunglassesecho $class;?>?上例输出:Hello
__call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求这里的未定义的方法包括没有权限访问的方法
?
"; echo $method_name; echo "?输出:"; print_r($p); echo ""; }}$obj = new callclass();$obj->method(1, 2, "Hello", "HP");?>
?
使用__call尝试调用一个不存在/不可用的成员方法method
Array
(
? ? [0] => 1
? ? [1] => 2
? ? [2] => Hello
? ? [3] => HP
)
?
?