一、__construct、__destruct
1.构造方法__construct,实例化(new)(初始化)的时候会自动执行__construct 此时要用public修饰,挺常用的
2.构造函数private访问控制只能类内部使用,常用在单例模式,例如
<?php
class Computer {
public $a = 2;
private function __construct(){
$this->a=4;
}
/**
* @return Computer
*/
public static function createInstance() {
return new Computer();
}
}
$obj = Computer::createInstance();
3.析构方法__destruct,当对象被销毁的时候,自动调用析构函数,与构造方法相反,一个初始一个结束。
注意:等程序执行完之后才会执行__destruct,除非提前有让实例销毁,相对构造函数,析构函数用的较少,例如:
<?php
class Memcache{
public function __construct(){
echo 1;
}
public function __destruct(){
echo 2;
}
}
//提前销毁实例(未被使用),得结果 134
$test = new Memcache();
$test = null;
echo 4;
//得结果 143
$test = new Memcache();
echo 4;
二、__get、__set、__isset、__unset 属性重载
这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)。
这两个方法是为在类和他们的父类中没有声明的属性而设计的。可以通过这种方式定义动态属性存储进数组
- __get( $property ) 当调用一个未定义的属性时__get会被调用;
- __set( $property, $value ) 给一个未定义的属性赋值时调用;
<?php
class test{
public function __set($name, $value)
{
$this->$name = $value;
}
public function __get($name)
{
return $this->$name;
}
}
$obj = new test();
$obj->abc = 1;
var_dump($obj->abc);
与__get方法和__set方法相同,这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)
- __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法;
- __unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法;
<?php
class test{
private $abc ='';
public function __isset($name){
return isset($this->$name) ? true : false ;
}
public function __unset($name){
unset($this->$name);
}
}
$obj = new test();
var_dump(isset($obj->abc));//true
var_dump(isset($obj->a));//false
unset($obj->abc);
var_dump(isset($obj->abc));//false
三、__call __callStatic 方法的重载
- __call( $method, $arg_array ) 当调用一个未定义(包括没有权限访问)的方法是调用此方法,避免抛出错误;
- __callStatic() 是为了处理静态方法调用,它的工作方式类似于 __call() 魔术方法,注意这里的修饰必须公有且静态。
<?php
class test{
public function __call($name, $arguments){
echo 1;
}
public static function __callStatic($name, $arguments){
echo 2;
}
}
$obj = new test();
$obj->abc();
test::a();
四、__invoke、__toString 、__clone
__invoke ,把对象当做一个方法调用的时候自动调用,__invoke 方法会被自动调用。PHP5.3.0以上版本有效,__invote里面逻辑自定义,很多开源框架会这样写,可以注意下;
<?php
class test{
public function __invoke($a,$b){
echo $a+$b;
}
}
$obj = new test();
$obj(1,2);//3
__toString ,会把对象转换成string的时候自动调用
<?php
class test{
public function __toString()
{
return '1';//这里必须返回字符串,其他类型都不行
}
}
$obj = new test();
echo($obj);
__clone,对象拷贝,浅拷贝: 省内存,只拷贝对象;深拷贝:拷贝存储点
例如:
<?php
class A{
public $age = 0;
}
$a = new A();
$b=clone $a;
$c = $a;
echo $a->age.'<br>';//a改变前 0
$a->age=1;
echo $a->age.'<br>';//改变后 1
echo $b->age.'<br>';//深拷贝 0 事后原型做什么改变都与我无瓜
echo $c->age;//浅拷贝 1 我只是拷贝了对象,值什么的跟着原型一起动
PHP5中的对象赋值是使用的引用赋值,使用clone方法复制一个对象时,对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。
<?php
class A{
public $age = 1;
public function __clone(){
$this->age = 2;
}
}
$a = new A();
$b=clone $a;
$c = $a;
echo $a->age.'<br>'; //a改变前 0
$a->age=1;
echo $a->age.'<br>'; //改变后 1
echo $b->age.'<br>'; //深拷贝 走__clone 得2 事后原型做什么改变都与我无瓜
echo $c->age; //浅拷贝 1 我只是拷贝了对象,值什么的跟着原型一起动