php常见的几个魔术方法

来源:互联网 发布:机房网络管理 编辑:程序博客网 时间:2024/06/04 12:35

1,__get__set

(1)这两个方法是为在类和他们的父类中没有声明的属性而设计的,
__get( $property ) 当调用一个未定义的属性时访问此方法,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)

代码如下:

 

当我们执行以上箭头指的位置他走的是__get方法,因为它是私有的方法(也就是说未定的方法)走的是__get方法 所以他返回的值是1234

进而呢有的同学就会问那么我们打印它定义的方法回会是什么呢, 为了能更好的看清楚首先我们先给$C赋一个值为3因为$C是公有的下面我们一起看一下,

代码如下:


那么打印var_dump($s->c);的时候输出的是3,没有走__get方法

总结:也就是说除了public以外走的都是__get方法。

 

 

(2)__SET( $property ) 当调用一个未定义的属性时访问此方法,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)

代码如下:

 

当我们给一个未定义的属性赋值是候调用的事__set方法,输出结果为error, 因为$a 是受保护的(也就是说未定义)访问的是__get方法。

下面我们来打印一个公共的(也就是说定义的)我们看一下,

代码如下:

 

当我们给一个公有的赋值echo的结果为3因为我们赋值的是一个公有的(也就是定义了)

总结: 
1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用
2. 向一个难以访问的属性赋值的时候 __set() 方法被调用
3. 难以访问包括:(1)私有属性,(2)没有初始化的属性

2__inset__unset

(1)__isset()在对类中属性或者非类中属性使用isset()方法的时候如果没有或者非公有属性(也就是说除了public以外走的都是__inset方法)则自动执行__isset()的方法

代码如下:

 

返回的结果为true因为piblic是公共的所以不走__inset方法

进而呢我们打印一下其他的方法看一看

代码如下:

 

它的结果走__inset的方法也就是说除了public以外走的都是__inset方法

(2)__unset方法和以上的方法类似:

代码如下:

 

它输出的结果是:

查看源代码之后的看上图

 

大家可以看一下它输出的结果与其他的方法不一样因为他没有走__unset方法也就是说除了public以外走的都是__unset方法.

进而呢我们打印一下其他的方法

代码如下:

他打印出来的结果是:

 

因为他是受保护的也就是说走的是__unset方法

总结:

__isset()在对类中属性或者非类中属性使用isset()方法的时候如果没有或者非公有属性(没有的属性和出去public以外的方法,则自动执行__isset()的方法

__unset()在对类中属性或者非类中属性使用unset()方法的时候如果没有或者非公有属性(没有的属性和出去public以外的方法,则自动执行__unset()的方法

 

1.__Tostring()   用于定义输出对象引用时调用  常用于打印一些对象的信息 必须有返回值,属于友好提示性的魔术方法。

Demo:


实例化对象以后,$test是对象,对象不能输出,所以程序运行会报错。

 

当我们有了__toString()时,运行程序是不会报错,会给出一个友好的提示,或者说当我们输出实例化的对象时会运行__toString()方法,里面运行什么我们自己定义。

 

 

2.__call()方法 当调用类实例中不存在的函数时自动执行

 

Demo:

 

当我们调用类中没有的方法时,会报错如上图

 

当我们在类中定义了__call()方法时,我们再调用没有定义的方法时,会给出有好的提示,或者说当我们调用没有定义的方法时会自动调用__call()方法;

注意:__call$a,$b)里面必须有两个参数,而且$b是数组。

 

3.__clone()对象的复制 

 

 

 

clone方法其实就是复制类的;而且复制的一模一样;

注意:clone与__clone()不是同一个

当我们在类中定义了__clone()方法时,请看下面的效果

 

当我们再复制一个类是如果类中有__clone()方法时,会自动调用这个方法,我们可以在这个里面定义一些属性或者提示什么的。

 

 

4.__autoLoad() 自动加载使用的类文件  该函数是在引用的页面添加

 

这个方法与include差不多,但是运行上有不同

Demo:

 

注意:我们的输出结果是先输出b,然后在运行__autoload()方法

这就是这个方法与include的区别:当我们实例化时没有实例化的类时,我们才调用__autoload()方法;而include 直接就是把页面包含过来。

最后:不要问我为什么会自动调用,我也不知道为什么自动调用;这大概就是魔术方法的奥妙吧! 慢慢的体会吧!!!!祝你成功


0 0
原创粉丝点击