php 魔术方法 介绍常用的11个

一、__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的属性(即没有权限访问的属性)。

这两个方法是为在类和他们的父类中没有声明的属性而设计的。可以通过这种方式定义动态属性存储进数组

  1. __get( $property )       当调用一个未定义的属性时__get会被调用;
  2. __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的属性(即没有权限访问的属性)

  1. __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法;
  2. __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  方法的重载

  1. __call( $method, $arg_array ) 当调用一个未定义(包括没有权限访问)的方法是调用此方法,避免抛出错误;
  2. __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 我只是拷贝了对象,值什么的跟着原型一起动

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值