《PHP初体验(一)》要点:
本文介绍了PHP初体验(一),希望对您有用。如果有疑问,可以联系我们。
提笔写初体验总不知道从何说起,直接聊PHP中的函数、PHP网络技术、数据库操作、PHP模板等感觉又不是初体验.最后还是决定从PHP的面向对象、PHP的魔术办法、PHP的反射、PHP中的异常和错误这4个方面简单介绍一下.
PHP面向工具的“形”与“本”
这里我们就不给面向对象下定义了,不外我们还是要说一下类和对象的.类是对象的抽象组织,对象是类的具体存在.接下来我们就拿PHP为例,来探讨一下对象的“形”与“本”的问题.
在PHP中,每个类的定义都是以关键字class开头,后面是类名和一对花括号,括号中包含类成员和办法的定义.如下是一个简单类的定义:
当把类对象序列化输出时,可以看出类对象在存储时类似于数组的形式.那么类对象与数组从本色上又有什么区别与联系呢?接下来从对象“本”来分析一下PHP对对象的底层实现.如下是PHP源码中对变量的定义:
通过上面的代码我们也对PHP如何存储对象有了初步的认识,那对象与数组又是什么关系呢?通过PHP的源码可得,zvalue_object结构中有一个HashTable的类型,它便是存储数组的.PHP对象的结构体中不仅有HashTable(用于存储类对象特有的属性),而且还有对象所属类的入口等,如下是PHP对象的组成:
其中PHP源码中zend_class_entry结构体中存储的就是类的指针,该结构体中包含类常量、静态属性、标准办法、魔术办法、自定义办法等.而属性数组存储的是类对象的属性.接下来我们还是以如上的Person类为例,谈一谈对象与数组:
PHP中的魔术办法
可能细心的你在对象组成的那张图中看到了魔术办法,但是上一节中并没有对zend_class_entry中的内容做任何介绍.那么什么又是魔术办法呢?魔术办法就是以两个下划线“__”开头、具有一些特殊作用的办法.其实如上的Person类中,我们不经意间就使用了魔术办法__construct(),这个魔术办法就是构造办法.用于在创建类对象时对属性进行赋值.接下来我们将介绍几个常见的魔术办法让大家对魔术办法有个初步了解.
__sleep():该魔术办法是在执行serialize()办法完成前被调用,该办法可以用来关闭对象可能具有的任何数据库连接、加密需要序列化对象属性的值、指定仅序列化对象的某些属性等等.
__wakeup():该魔术办法是在执行unserialize()办法完成前被调用,该办法可以用来建立对象可能的数据库连接、解密序列化对象属性的值等等.
3.__construct():类的构造办法,类对象在创建时会首先调用该办法,因此该办法中可以做一些类对象创建前的初始化工作.
4.__destruct():类的析构办法,当类对象在销毁时会调用该办法.
5.__get()和__set()方法,这两个方法主要是实现了可以在类的外部通过对象直接拜访类的私有属性,还可以增加类中没有定义的属性,如给$person对象增加marriage属性,只需$person->marriage="married"即可.
6.__call()和__callStatic():当类对象调用的办法不存在而且类中定义了__call()办法时,则会自动调用类的__call(),当类调用静态办法不存在而且类中定义了办法__callStatic()时,则会自动调用__callStatic()办法.
7.__toString()办法,该办法主要用于格式化打印一个对象,该办法的设计原型来源于Java.只有类中实现了__toString()办法才可以通过echo直接打印该对象.
关于PHP的魔术办法我们就简单介绍到这里,由上我们可以看出从构造办法上,PHP相比于还稍有欠缺,但PHP中有__set()和__get(),使得动态增加对象的属性字段变得更加方便,而对于Java来说要实现类似的效果,就不得不借助反射API或直接修改编译后字节码的方式实现了.Java中有反射机制,那么PHP中呢?接下来让我们来看一看PHP中的反射实现.
更多干货请存眷:
优待业500万阳光待业基金:
http://www.ujiuye.com/zt/jyfc/?wt.bd=fq37300
优待业官网:http://www.ujiuye.com/?wt.bd=fq37300
维易PHP培训学院每天发布《PHP初体验(一)》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7168.html