Показать сообщение отдельно
  #39 (permalink)  
Старый 24.02.2012, 01:19
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от monolithed
Ну да это только предположения, но предположить внутренне архитектуру частично возможно.
Если что, то в исходниках PHP не используются классы и уж тем более неймспейсы - он написан на C

Насколько я понял исходники, в качестве массивов используются структуры типа HashTable, а объекты тип ArrayObject просто содержат в себе экземпляр HashTable, который и подсовывают при использовании их как массивов
Функции высокого уровня, типа array_key_exists() внутри работают именно в процедурном стиле, и более низкоуровневые функции также до последнего принимают одним из параметров HashTable, вплоть до zend_hash_exists, который уже просто пробегается циклом по представленному HashTable

Вот кстати сам HashTable
Код:
typedef struct _hashtable {
	uint nTableSize;
	uint nTableMask;
	uint nNumOfElements;
	ulong nNextFreeElement;
	Bucket *pInternalPointer;	/* Used for element traversal */
	Bucket *pListHead;
	Bucket *pListTail;
	Bucket **arBuckets;
	dtor_func_t pDestructor;
	zend_bool persistent;
	unsigned char nApplyCount;
	zend_bool bApplyProtection;
#if ZEND_DEBUG
	int inconsistent;
#endif
} HashTable;
Набор указателей, и прочей служебной информации.
Весь код обслуживающий его вынесен в отдельные функции, которые принимают массив одним из параметров.
Таким образом array_key_exists() является самостоятельной функцией, принимающей массив одним из аргументов, но не более

Последний раз редактировалось Gvozd, 24.02.2012 в 01:27.
Ответить с цитированием