立即注册 找回密码

QQ登录

只需一步,快速开始

第一站长论坛

搜索
1框架
查看: 157|回复: 0

PHP面向对象程序设计重载(overloading)操作详解

[复制链接]
发表于 2019-6-27 18:12 | 显示全部楼层 |阅读模式
本文实例讲述了PHP面向对象程序设计重载(overloading)操纵。分享给大家供大家参考,具体如下:
重载
PHP中的”重载”与其它绝大多数面向对象语言不同,只是他们都是用的相同的名词而已。传统的”重载”是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。 PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。当调用当前环境下未定义不可见的类属性或方法时,重载方法会被调用。是通过魔术方法(magic methods)来实现的。
一般来说,把类中的成员属性都定义为private的,这更符合现实的逻辑,能够更好的对类中成员起到保护作用。但是,对成员属性的读取和赋值操纵黑白常频繁的,而如果在类中为每个私有属性都定义可以在对象的外部获取和赋值的公有方法,又黑白常非常烦恼的。因此在PHP5.1.0以后的版本中,预定义了两个方法“__get()”和“__set()”,用来完成对所用私有属性都能获取和赋值操纵,以及用来检查私有属性是否存在的方法“__isset()”和用来删除对象中私有属性方法“__unset()”。
通俗一点来说,重载在php中的寄义是指,当一个对象或类使用其未定义或不可见的属性和方法时,其中的一些“处理机制”。
属性重载
对一个对象不存在的属性进行使用时,这个类中预先设定好的应对办法(处理机制)。
属性,本质就是变量,其只有4个操纵:
取值:
当对一个对象不存在(未定义或不可见)的属性进行“取值”时,就会自动调用方法:__GET()方法不区分大小写。
赋值:
当对一个对象不存在(未定义或不可见)的属性进行“赋值”时,就会自动调用方法:__SET()
判断(isset):
当对一个对象不存在(未定义或不可见)的属性进行isset()判断时,就会自动调用方法:isset()
销毁(unset):
当对一个对象不存在的(未定义或不可见)属性进行unset()判断时,就会自动调用方法:unset()
以上4个方法,被称为魔术方法。
魔术方法
__GET($属性名):
在对一个对象不存在的属性进行“取值”的时候,会自动调用的方法,其中该方法可以带一个形参,表现要对之取值而又不存在的属性名(字符串),可以使用该方法对意外情况进行某种特殊的处理。
比方:
  1. [/code]php的重载,使用__get()方法对上面的出错作“优雅处理”。
  2. [code]
复制代码
这里举一个对所用私有属性获取的操纵的例子。
例子:
  1. [/code]运行结果为:
  2. [indent]name=yeoman, sex=男, age=23
  3. [/indent][color=#339966][b]__SET($属性名, 值):[/b][/color]
  4. 当对一个对象不存在的属性进行“赋值”时,就会自动调用这个内部的魔术方法;其有2个形参,分别代表要对不存在的属性进行赋值的“属性名”和“属性值”。
  5. 这个方法,结合_GET方法,往往可以使我们定义的类,有一种可扩展的特性。即:类或对象的属性,可以更为方便自由。
  6. 例子:
  7. [code]
复制代码
运行结果为:
输出这些“不存在的属性”的值:
a1->p1:1
a1->p2:2
a1->ac:avc
__ISSET($属性名):
当对一个对象不存在的属性进行isset()判断时,就会自动调用内部方法:isset();
用法:
  1. $v1 = isset($对象->不存在的属性);  //此时会调用这个对象所属类中的魔术方法:isset()
复制代码
例子:
  1. [/code]运行结果:
  2. [indent]输出这些“不存在的属性”的值
  3. a1->p1:1
  4. a1->p2:2
  5. a1->ac:avc
  6. boolean true
  7. boolean false
  8. [/indent][color=#339966][b]__UNSET($属性名)[/b][/color]
  9. 当对一个对象不存在的属性进行unset()销毁时,就会自动调用内部方法:unset();
  10. [code]
复制代码
运行结果为:
a1->p1:1
a1->p1:该属性不存在!
下面的例子中,声明一个Person类,并将所有的成员属性设置成private的。在类中添加自定义的“__isset()”和“__unset()”两个方法。在类外部使用“isset()”和“unset()”函数时,会自动调用这两个方法。代码如下:
  1. [/code]运行结果:
  2. [indent]boolean false
  3. boolean true
  4. boolean true
  5. boolean false
  6. 名字:yeoman,性别:,年龄:
  7. [/indent][color=#0000ff][b]方法重载[/b][/color]
  8. 当对一个对象不存在的实例方法进行“调用”时,会自动调用类中的__call()这个魔术方法;
  9. 当对一个类不存在的静态方法进行“调用”时,会自动调用类中的__callstatic()这个魔术方法。
  10. 例子:直接调用不存在的方法
  11. [code]
复制代码
会报错,报错内容为:
Fatal error: Uncaught Error: Call to undefined method A::f1()
对上面报错作“优雅处理”:
[code][/code]运行结果为:
f1()方法不存在!
当对一个类不存在的静态方法进行“调用”时,会自动调用类中的__callstatic()这个魔术方法。和上面的处理类似。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操纵技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操纵入门教程》及《php常见数据库操纵技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。

免责声明:如果侵犯了您的权益,请联系我们,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|第一站长论坛 ( 闽ICP备16019670号 )

GMT+8, 2019-7-24 01:26 , Processed in 0.056110 second(s), 22 queries .

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc & Style Design

本站提供网上自由讨论使用,所有言论内容来自互联网并不代表本站立场,本站不负任何责任.
如发现有侵权行为,请与我们联系. 我们将立刻从网站上删除,并向所有持版权者致最深歉意.
联系QQ:2837195923

快速回复 返回顶部 返回列表