 
			
				23.02.2012, 18:55
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 22.02.2012 
					
					
					
						Сообщений: 163
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 А есть известные причины по которым не сделали такую функцию, а для нахождения папок сделали? 
 
и второй вопрос что такое stdClass   почему он не  хочет отдавать данные вот так obj['prop']? 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Mахmaxmaximus, 23.02.2012 в 19:05.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				23.02.2012, 23:10
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.04.2008 
					
					
					
						Сообщений: 6,246
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Mахmaxmaximus
			
		
	 | 
 
	| 
		и второй вопрос что такое stdClass   почему он не  хочет отдавать данные вот так obj['prop']?
	 | 
 
	
 
 stdClass - это просто абстрактный класс, в котором ничего нету. 
Используется там, где нужно работать просто с объектом без определенного класса 
Например json_decode по-умолчанию(без второго параметра) возвращает объект stdClass 
Естественно, что экземпляр этого класса не будет отдавать данные как массив. Нужно использовать номральный синтаксис обращения к свойствам объекта.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				23.02.2012, 23:36
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 22.02.2012 
					
					
					
						Сообщений: 163
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Gvozd, 
 ясн, а обьект и массив  в PHP одно и то же? То есть это один и тот же класс Array? 
 
п.с. как проверить существует ли свойство у $_GET? 
 
property_exists($_GET, 'getCategories') 
 
варнингует  
Warning: First parameter must either be an object or the name of an existing class 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Mахmaxmaximus, 24.02.2012 в 00:07.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.02.2012, 00:20
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.04.2008 
					
					
					
						Сообщений: 6,246
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Mахmaxmaximus
			
		
	 | 
 
	| 
		ясн, а обьект и массив  в PHP одно и то же? То есть это один и тот же класс Array?
	 | 
 
	
 
 Нет. 
Массивы не являются объектами. 
У них нету ни свойств ни методов, а есть только ключи и соответсвующие им элементы. 
Причем ключи могут быть как целочисленные, так и строковые. 
В последнем случае - получаем ассоциативный массив, но он не становится от этого объектом. 
Получать досту к элементу предполагается таким синтаксисом: $array[0], $array['text_key']
 
А объекты - они уже имеют свойства, методы и прочая. 
Доступ к свойствам и методам осуществляется через -> (или :: для статических) 
Экземпляры некоторых классов (реализующих интерфейс ArrayAccess, и при необходимости несколько сопутсвующих)  могут использоватся как массивы. 
Но это уже будут объекты, а не массивы. 
Но это уже из разряда тех кун-гфу: не все знают, и еще меньше используют  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.02.2012, 00:45
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Особый гость 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.04.2010 
					
					
					
						Сообщений: 4,260
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Некоторые мысли на эту тему: 
К примеру  array_keys(); имеет следующий прототип:
 
array array_keys ( array $input [, mixed $search_value [, bool $strict = false ]] )
 
Как мы видим  array_keys() имеет тип array.
 
А вызывается он так array_keys(), а не так array.array_keys() вероятно потому что в заголовочном файле  array прописано примерно такая строчка: 
 
using namespace array;
 
Что создает видимость считать, что   array_keys() это отдельная от объекта  array функция. 
А обращение к элементам массива типа  $array[0], это ничто иное как перегруженный оператор  [], который имеет реальный член класса типа  array::get();
Если честно не понятно почему разработчики php так усердно скрывают реальные типы объектов.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось monolithed, 24.02.2012 в 00:58.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.02.2012, 00:49
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 22.02.2012 
					
					
					
						Сообщений: 163
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 monolithed, 
видимо чтобы не путали массивы с обьектами? нет? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.02.2012, 00:51
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.04.2008 
					
					
					
						Сообщений: 6,246
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 monolithed, 
 Мне кажется что вы взяли все свои предположения с потолка. 
Или вы реально читали исходные коды, и все описанное вами видели там? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.02.2012, 00:55
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Особый гость 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.04.2010 
					
					
					
						Сообщений: 4,260
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Mахmaxmaximus
			
		
	 | 
 
	| 
		видимо чтобы не путали массивы с обьектами? нет?
	 | 
 
	
 
 Фактически изнутри у array и есть объект, но они решили сделать его отдельным типом данных, что вполне разумно. К примеру в  Python list (аналог массива) имеет тип  Тип))
 
	
 
	| 
		
			Сообщение от Gvozd
			
		
	 | 
 
	| 
		Мне кажется что вы взяли все свои предположения с потолка.
	 | 
 
	
 
 Ну да это только предположения, но предположить внутренне архитектуру частично возможно, учитывая то что он написан на С++
 UPD:
	
 
	| 
		
			Сообщение от Gvozd
			
		
	 | 
 
	| 
		Или вы реально читали исходные коды, и все описанное вами видели там?
	 | 
 
	
 
 Посмотрел исходники (какие-то они странные, не смог найти даже парсер) написан он на С, так что все немного по другому)  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось monolithed, 24.02.2012 в 01:19.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.02.2012, 01:19
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.02.2012, 01:30
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Особый гость 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.04.2010 
					
					
					
						Сообщений: 4,260
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Gvozd
			
		
	 | 
 
	| 
		Если что, то в исходниках PHP не используются классы и уж тем более неймспейсы - он написан на C
	 | 
 
	
 
 Есть у меня несколько книг по PHP, в какой-то из них было сказано, что PHP на С++ написан, проверять не стал.  
Сейчас скачал исходники действительно на С, только разобраться пока не получилось.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |