以图明志

PHP服务器脚本

PHP内核探索:魔术函数与延迟绑定

在某些特定的场景才会被触发
PHP中有一些特殊的函数和方法,这些函数和方法相比普通方法的特殊之处在于:用户代码通常不会主动调用, 而是在特定的时机会被PHP自动调用。在PHP中通常以"__"打头的方法都作为魔术方法, 所以通常不要定义以"__"开头的函数或方法。 例如:__autoload()函数, 通常我们不会手动调用这个函数。

PHP服务器脚本

PHP内核探索:继承,多态与抽象类

继承是一种关联类的层次模型
继承是一种关联类的层次模型,它可以建立类之间的关系,并实现代码重用,方便系统扩展。 继承提供了一种明确表述共性的方法,是一个新类从现有的类中派生的过程。 继承产生的新类继承了原始类的特性,新类称为原始类的派生类(或子类), 而原始类称为新类的基类(或父类)。派生类可以从基类那里继承方法和变量。

PHP服务器脚本

PHP内核探索:访问控制

封装隐藏了对象内部的细节和实现
面向对象的三大特性(封装、继承、多态),其中封装是一个非常重要的特性。封装隐藏了对象内部的细节和实现, 使对象能够集中而完整的描述并对应一个具体的事物, 只提供对外的访问接口,这样可以在不改变接口的前提下改变实现细节,而且能使对象自我完备。 除此之外,封装还可以增强安全性和简化编程。 在面向对象的语言中一般是通过访问控制来实现封装的特性。

PHP服务器脚本

PHP内核探索:类的定义

定义好这个类的zend_class_entry
定义类的第一步,便是先定义好这个类的zend_class_entry,这一步操作是在MINIT阶段完成的。某个类的zend_class_entry会经常用到,所以我们一般会把它保存在一个变量里,供扩展中其它地方的程序使用。我们可以用zend_declare_property*系列函数还完成这项操作,为某个类定义属性一般会需要三个信息:……

PHP服务器脚本

PHP内核探索:类的原型zend_class_entry

实现类与对象的关键结构类型
zend_class_entry是内核中定义的一个结构体,是内核实现PHP语言中类与对象的一个非常基础、关键的结构类型。他就相当于我们定义的类的原型。如果我们想获得一个名字为myclass的类该怎么做呢?首先我们定义一个zend_class_entry变量,并为它设置名字,最后注册到runtime中去。

PHP服务器脚本

PHP内核探索:类的成员方法

成员方法从本质上来讲也是一种函数
成员方法从本质上来讲也是一种函数,所以其存储结构也和常规函数一样,存储在zend_function结构体中。 对于一个类的多个成员方法,它是以HashTable的数据结构存储了多个zend_function结构体。 和前面的成员变量一样,在类声明时成员方法也通过调用zend_initialize_class_data方法,初始化了整个方法列表所在的HashTable。

PHP服务器脚本

PHP内核探索:类的成员变量

成员变量是定义在类里面
类的成员变量在PHP中本质上是一个变量,只是这些变量都归属于某个类,并且给这些变量是有访问控制的。 类的成员变量也称为成员属性,它是现实世界实体属性的抽象,是可以用来描述对象状态的数据。类的成员方法在PHP中本质上是一个函数,只是这个函数以类的方法存在,它可能是一个类方法也可能是一个实例方法, 并且在这些方法上都加上了类的访问控制。

PHP服务器脚本

PHP内核探索:类的结构和实现

面向对象编程都是围绕类和对象进行的
面向对象编程中我们的编程都是围绕类和对象进行的。那在PHP内部类是怎么实现的呢? 它的内存布局以及存储是怎么样的呢?继承、封装和多态又是怎么实现的呢?首先我们看看类是什么。类是用户定义的一种抽象数据类型,它是现实世界中某些具有共性事物的抽象。 有时我们也可以理解其为对象的类别。

PHP服务器脚本

PHP内核探索:面向对象开篇

面向对象是一种编程范式
面向对象是一种编程范式,它将对象作为程序的基本单元,将程序和数据封装起来, 以此来提高程序的重用性、灵活性和可扩展性。目前很多语言都支持面向对象编程,既然对象对象是一种范式,其实这就和具体的编程语言没有直接关系, 只不过很多语言将这个范式作为语言的基本元素,使用C语言也能够进行面向对象编程。

PHP服务器脚本

PHP内核探索:匿名函数及闭包

PHP直到5.3才开始真正支持匿名函数
匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数, C++的新标准C++0x也开始支持了。匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数, 最常见应用是作为回调函数。

PHP服务器脚本

PHP内核探索:引用与函数执行

以引用的形式传递参数
一个函数的执行结果要返回给调用者,除了使用return功能,还有一种办法,那就是以引用的形式传递参数,然后在内部修改这个参数的值。前一种方法往往只能返回一个值,如果我们的函数执行结果具有多种数据,便需要把这些数据打包到一个数组、类等复合类型的变量中才能得以实现;但后一种方法相比而言就简单一些了。

PHP服务器脚本

PHP内核探索:函数调用与执行

调用zend_execute来执行zend_op_array
前面对函数的内部表示以及参数的传递,返回值都有了介绍,那函数是怎么被调用的呢?内置函数和用户定义函数在调用时会有什么不一样呢? 下面将介绍函数调用和执行的过程。函数被调用需要一些基本的信息,比如函数的名称,参数以及函数的定义(也就是最终函数是怎么执行的), 从我们开发者的角度来看……

PHP服务器脚本

PHP内核探索:形参return value

每个zif函数声明里加了一个zval*类型的形参
PHP语言中函数的返回值是通过return来完成了,那我们在扩展中编写的PHP函数如何把返回值回馈给用户端的函数调用者呢?看好,这里指的是回馈给,而不是单单的return~你也许会认为扩展中定义的函数应该直接通过return关键字来返回一个值,比如由你自己来生成一个zval并返回。

PHP服务器脚本

PHP内核探索:函数返回值

PHP的函数都有返回值
在编程语言中,一个函数或一个方法一般都有返回值,但也存在不返回值的情况,此时,这些函数仅仅仅是处理一些事务, 没有返回,或者说没有明确的返回值,在pascal语言中它有一个专有的关键字 procedure 。 在PHP中,函数都有返回值,分两种情况,使用return语句明确的返回和没有return语句返回NULL。

PHP服务器脚本

PHP内核探索:zend_parse_parameters函数

获取函数调用者传递过来的参数
最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表这参数的个数。

PHP服务器脚本

PHP内核探索:函数的参数

取参数的个数与解析参数列表
前面介绍了函数的定义,函数的定义只是一个将函数名注册到函数列表的过程,在了解了函数的定义后,我们来看看函数的参数。 这一小节将包括用户自定义函数的参数和内部函数的参数两部分。我们对于参数的类型提示做了分析,这里我们在这一小节的基础上,进行一些更详细的说明。
2 / 6 首页 < Prev 1 2 3 4 5 Next > 尾页 页码: