Dan*_*ugg 5 php spl php-extension
我一直在阅读有关PHP从SPL常用的接口,如Iterator,Countable和ArrayAccess.但是,我不确切地知道它们是如何工作的.
他们的实现是否修改了PHP的核心功能,例如重载[]数组运算符?
我还读过有关Operator扩展的内容,它提供了以与低级语言相同的方式重载其他运算符的能力.由于Operator扩展明确地修改了PHP核心,我想知道ArrayAccess幕后是否采取相同的行动?
我是一个修补匠,因此我发现很难在不知道引擎盖的情况下使用它.
Art*_*cto 11
PHP和PHP扩展构建在Zend引擎之上.他们将Zend Engine功能暴露给用户自己(PHP脚本)并添加他们自己的功能,这些功能要么暴露给用户区域,要么暴露给其他PHP扩展.
Zend引擎为对象模型提供了一种访问对象维度(公开的功能ArrayAccess)的方法,以及用于迭代对象(一致性Iterator)的一般迭代机制.该对象模型由许多处理程序组成,PHP和任何扩展可以替换一种对象(zend对象处理程序).在它的对象模型中,Zend引擎实现了一种标准类型的对象("zend对象"); 每个对象都遵循zend_object数据结构,每个类 - 这是一个低级对象接口不知道的概念,除了提供检索它的方法 - 由一个zend_class_entry结构).
ArrayAccess实际上不是SPL接口; 它在Zend Engine本身中定义.zend对象的read_dimension/ write_dimension/ has_dimension低级处理程序以这样的方式实现:它们检查对象是否实现了这样的接口,并且如果是这种情况则调用相应的方法(参见这里).
Iterator也不是SPL界面; 它也在Zend引擎中定义.在这种情况下,对此接口的支持是在稍高的级别完成的.低级对象处理程序对对象迭代一无所知; 这是Zend Objects的一个属性.该zend_class_entry结构在这里有两个相关成员:iterator_funcs领域和get_iterator领域.这些定义了迭代器操作和状态以及如何创建新的迭代器.对于Iterator特别是,当一个类通过运行时注册的,它检查是否实现该接口,如果确实如此,在相关领域zend_class_entry为类变量被设置为弥补本地迭代接口PHP方法本地方法.如果编写一个PHP扩展,可以选择编写本机迭代器(本机实现迭代方法),或者像在用户区中一样,实现Iterator和编写PHP方法(在本例中为本机PHP方法).几个操作,如界面描述.
该Countable接口是唯一一个实际上是SPL接口的接口; Zend Engine对此一无所知.它的功能源于这样一个事实,即count函数的实现检查它的存在,并count在接口存在时调用该方法.
操作员分机在更低级别的设置下运行.在运行时,直接写入Zend Engine的内存并替换PHP代码编译的操作码的处理程序(现在,例如,ZEND_ASSIGN_ADD有一个新的本机实现,这遵循用户可以选择的某些PHP函数/方法).