php 类的重载,PHP中重载详解

PHP中的重载和别的面向对象(C#、Java)语言不同,如:在C#中的重载表示,具有相同的方法名,但是形参列表不同(即形参的个数、类型、排列方式中的一个不同)函数,会在调用时根据形参列表来决定该调用那个方法。

而在PHP中重载是针对当前对象不可访问成员(没有定义或者定义了但访问不到)的处理:<?php

Class Student{

private $_age;

}

$o1=new Student();

$o1->_name="Li";

var_dump($o1);

echo "
";

$o1->_age=24;

var_dump($o1);

?>

0b383bb2155664a21634cd2047f22448.png

从这个结果我们可以看出:当访问不存在的成员$_name时,会把成员当做共有属性放入对象中。而涉及到访问权限问题时,会报错。

对于这种情况,php中有一些属性重载的魔术方法:

属性重载

1.__set($name,$value):当调用的某个属性不可访问(并不存在/访问受限)时,系统会自动调用该对应类中的__set()函数。$name表示调用的属性名,$value 代表操作时传入的值。

如果属性不存在:<?php

Class Student{

private $_age;

function __set($name,$value){

}

}

$o1=new Student();

$o1->_name="Li";

var_dump($o1);

10601d08313c4e060c6d4ff438a5cf80.png

这里当我们将上面的例子做一些改变:在Student类中添加一个__set()方法,当执行$o1->_name="Li";这条代码时,会自动调用__set()方法。由于里面没有任何代码,无法实现像默认情况一样的赋值,因此显示的$o1对象中只有一个私有属性$_age;

也可以在__set()方法中写上该代码:function __set($name,$value){

$this->$name=$value;

}

此时的结果为

b4a6e3dacc208a934c7edeb528944ad1.png

如果属性存在,但是其无法访问:<?php

header("Content-Type:text/html;charset=utf-8");

Class Student{

private $_age;

function __set($name,$value){

//进入该函数表示$name 这个属性不可访问。

if(property_exists($this,$name)){

//property_exists()函数判断当前对象($this)中是否存在$name属性。

trigger_error("属性不可访问!",E_USER_ERROR);

}else{

}

}

}

$o1=new Student();

$o1->_age=2;

var_dump($o1);

aa6dd00d0504c12864080d16474b16a5.png

2.__get():当访问不可访问成员的时候会触发:<?php

header("Content-Type:text/html;charset=utf-8");

Class Student{

private $_age=23;

function __get($name){

//进入该函数表示$name 这个属性不可访问。

return $this->$name;

}

}

$o1=new Student();

echo $o1->_age;

echo "
";

var_dump($o1);

4764a16ca6b4712dcb726564495b5c43.png

3.__unset():当删除某个变量时会触发该函数。

其具体的应用场景:我们都知道unset()函数,即删除某一个变量,这也可以用到对象中,例如我们上面的例子中,如果$_age为public,那么可以用unset($o1->_age);但是,这里的$_age 是一个private属性,此时用unset()肯定无法访问。<?php

header("Content-Type:text/html;charset=utf-8");

Class Student{

private $_age=23;

}

$o1=new Student();

unset($o1->_age);

1382e86caed71ea7c627fc6fe3a8b6e9.png

这就需要__unset()魔术方法,在类中实现属性的删除:<?php

header("Content-Type:text/html;charset=utf-8");

Class Student{

private $_age=23;

function __get($name){

return $this->$name;//正常应该有判断语句,这里省略了。

}

function __unset($name){

unset($this->$name);

}

}

$o1=new Student();

echo $o1->_age;

unset($o1->_age);

echo $o1->_age;

dc15f5a1c2c57b343a63dd1dd0220ae6.png

其具体的应用和上面的__set()、__get()类似,即当你unset(变量名);时,会自动调用__unset()方法,方法体可以自己定义。

4.__isset():主要是用来判断是否存在属性,跟__unset()用法一样。当外部想要判断是有属性的时候,用isset()函数无法访问私有变量,此时可以使用__isset()方法定义。

重载方法

方法重载和属性重载的条件一样:当调用不存在或者无法访问的方法时,会调用__call()、Static__callStatic()方法。

在系统默认的情况下调用本不存在的方法:<?php

header("Content-Type:text/html;charset=utf-8");

Class Student{

public static $a=1;

private $_age=23;

}

$o1=new Student();

$o1->getName();//当调用本不存在的方法时。

c65f6e41414c022ba758394360839fbf.png

系统会出现一个严重错误。

__call():使用对象调用时使用的魔术方法<?php

header("Content-Type:text/html;charset=utf-8");

Class Student{

public static $a=1;

private $_age=23;

function __call($name,$arr){

//$name表示传入的方法名,$arr表示传入的方法列表(是一个数组)。

trigger_error("不存在该函数",E_USER_NOTICE);//直接报错

//也可以在此重写函数。

}

}

$o1=new Student();

$o1->getName();//当调用本不存在的方法时。

658386461f16de02eec0ebdcfb5a9d3f.png

Static__callStatic():使用类调用方法,即调用一个本不存在的静态方法时,可以使用该魔术方法。

相关推荐:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值