设为首页 收藏本站
查看: 376|回复: 0

[经验分享] PHP程序员必须掌握的PHP面向对象的特有的特性

[复制链接]

尚未签到

发表于 2017-4-3 10:30:11 | 显示全部楼层 |阅读模式
  PHP程序员必须掌握的PHP面向对象的特有的特性,这些都是其它编程语言所没有的:
  伪重载
  重载,就是指有同名函数。当然,重载是有条件的。通常条件是:参数类型不同。(这一点PHP是做不到的,因为PHP是弱类型语言)第二类条件则是,参数个数不同。
PHP4的类中不允许有同名成员函数。也就是说不可以重载。
当然,我们可以对参数个数不同的全放入同一函数中。以默认值方式设置后面的参数。根据后面参数是否传入,分别处理。
但也可以通过以下方式,实现伪重载。
为什么使用此方法?(修改次数与修改的位置数。)
function otest1 ($a) { echo( '一个参数' ); }
function otest2 ( $a, $b) { echo( '二个参数' ); }
function otest3 ( $a ,$b,$c) { echo( '三个啦' ); }
function otest () {
$args = func_get_args();
$num = func_num_args();
call_user_func_array( 'otest'.$num, $args ); }
otest(1,2);
  动态继承
  虽然PHP对设计模式支持不够,但是,作为动态语言,PHP可以实现动态继承。而动态继承即是指子类动态选择父类。这与设计模式中的类工厂,工厂方法或抽象工厂要实现的目标是一致的。
下例即是动态继承的实现方法实例。
  $databaseSystem = "mysql";
class mysql{
   function show()   {
       print("bar");
   }
}
eval('class intermediate extends ' . $databaseSystem . ' {}');
class ActiveRecord extends intermediate{
   function ActiveRecord()   {
       print("foo");
   }
}
$instance = new ActiveRecord;
$instance->show();
  与对象相关的函数
  get_class_methods — 返回由类的方法名组成的数组
get_class_vars — 返回由类的默认属性组成的数组,利用这两个函数,可以方便地为程序生成文档。
get_class — 返回对象的类名,不管是在父类中还是子类中,返回的都是当前创建的子类的类名。
get_object_vars — 返回由对象属性组成的关联数组。ORM映射时,常用此将对象转为数组。
get_parent_class — 返回对象或类的父类名
property_exists — 检查对象或类是否具有该属性,强制属性声明时,就是用的此函数。
method_exists — 检查类的方法是否存在,利用这一方法可以预留函数让用户扩展。但这一方法不太安全。即如果是非经过验证的操作,将会导致安全问题。所以,较烦琐的方法则是可以将预留的方法定义出来,让用户在扩展类扩展。
  对象比较
  在 PHP 中,对象比较的规则十分简单:如果两个对象的类相同,且它们有相同的属性和值,则这两个对象相等。类似的规则还适用与用全等符(===)对两个对象的比较。
这就是说,不管对象名,只要是类相同(与变量的类型相同一样),属性与值也相同(与数组比较类似),则这两个对象相等
  属性(字段或称为成员变量)运行时动态添加
  php对象中的属性不必显式声明,所以,可以动态添加。并且,默认情况下,不存在的属性均是Public的。所以,你大可以直接$obj->newPropertyName=$value。
  方法(或称为成员函数)运行时动态添加
  php5.3以前,无闭包支持,所以,只能用runkit扩展进行动态添加,而php5.3可以用闭包方式进行动态添加。
  魔术函数
  魔术函数是PHP对象特有的。这些函数为PHP对象提供了强大的功能。比如:
__get, __set 实现了对属性的访问控制。当需要有效性控制时,你不需要写对应的get属性名,set属性名这样的函数,只要将代码写到这两个魔术函数中即可。
__call 当方法不存在时,会调用此函数。这就给扩展提供了方便。所以,你大可以在类外面写一个函数,__call中用代码调用类外面的这个函数。从而实现了与调用类的方法相同的接口。
__isset __unset 如果你要自定义检查对象中的属性是否初始化,或释放这个属性,可以这两个方法中添加代码。
__toString  对象的toString是固有的,如果你要重载,可以在这个函数中添加代码。
  软编码
  php对软编码有良好的支持,特别是面向对象,类的名称,方法,属性均可以使用变量来调用。比如:
  $obj=new $className()
  $obj->$propertyName=true;
  $result=$obj->$mothodName();
  属性遍历
  php帮助文档中说,要遍历属性,需要实现Iterator这个接口。实际上,这里所说的是用数据模式访问。不实现这个接口一样可以遍历。请看下面的代码,如果运行一下,你就更能明白其中的奥妙了。
  class test{
 public
  $name,
  $age,
  $gender,
  $education,
  $hometown; 
 function __construct(){} 
}
$obj=new test();
$person=array( 
  'name'=>'Jhon',
  'age'=>25,
  'gender'=>'male',
  'education'=>'master',
  'hometown'=>'New York'
  );
foreach($obj as $key => $value){
  echo $key,'<br>';
  $obj->$key=$person[$key];
}
var_dump($obj);
  可以看出,最大的区别,是结果仍是对象式访问,只能用($obj->$key)而不是数组模式访问。
  另外需要注意的是,只能遍历公有对象,私有的,保护的是无法遍历的。
   ————————————————————————————————————————————————
  重要声明:本博客所发内容均为本人原创。但有时为了防止一些小人网站盗版式的转载(无作者名,同时无原链接地址)所以,现在发贴常使用多次补充法。一次绝不发完。
  凡是网上同标题,但只有部分内容者,均是盗版。比如,电脑编程网,目前就有此文的盗版转载。
  此文本网站为首发原创,百度文库以及其它所有网站,均是侵权抄袭,特此声明!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359463-1-1.html 上篇帖子: (原)今天决定学习PHP,用PHP来做自己的网站 下篇帖子: PHP获取当前相对于域名的目录,PHP获取当前目录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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