1997年中PHP的发展也已经有了一些变化,他已经从Rasmus的宠物项目变成了更加有组织的团体项目。语法分析引擎也由Zeev Suraski 和 Andi Gutmans进行了重新改写,这个引擎构成了PHP3的基础。PHP/FI中的大部分通用代码都经过改写后引入了PHP3中。
目录结构上,PHP 越来越工程化。
- serverapi: 抽离出了 PHPSAPIs。
- win32:支持了 Windows
- VarTree 被替换成了大名鼎鼎的 HashTable,到现在直接变成了恶臭的 PHP 八股文必考内容。
- convertor 将 PHP/FI 的代码转换为 PHP3 代码的工具,其核心原理是 yacc 和 lex。
- DL:扩展,在 php3 中开始支持扩展啦!
变量
hashtable 出现了,代替了原来的 VarTree
typedef struct hashtable {
uint nTableSize;
uint nHashSizeIndex;
uint nNumOfElements;
uint nNextFreeElement;
uint(*pHashFunction) (char *arKey, uint nKeyLength);
Bucket *pInternalPointer; /* Used for element traversal */
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets;
void (*pDestructor) (void *pData);
unsigned char persistent;
} HashTable;
在 PHP 中 HashTable 中非常重要,在 PHP/FI 中函数被保存在一个链表中,但是链表的时间复杂度是 O(N),在 PHP3 中,由于出现了 HashTable,其查询时间复杂度是 O(1),这样用 HashTable 代替链表存储函数也就成了必然。
PHPAPI int _php3_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag)