Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 23.02.2012, 18:55
Профессор
Посмотреть профиль Найти все сообщения от Mахmaxmaximus
 
Регистрация: 22.02.2012
Сообщений: 163

А есть известные причины по которым не сделали такую функцию, а для нахождения папок сделали?

и второй вопрос что такое stdClass почему он не хочет отдавать данные вот так obj['prop']?

Последний раз редактировалось Mахmaxmaximus, 23.02.2012 в 19:05.
Ответить с цитированием
  #32 (permalink)  
Старый 23.02.2012, 23:10
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Mахmaxmaximus
и второй вопрос что такое stdClass почему он не хочет отдавать данные вот так obj['prop']?
stdClass - это просто абстрактный класс, в котором ничего нету.
Используется там, где нужно работать просто с объектом без определенного класса
Например json_decode по-умолчанию(без второго параметра) возвращает объект stdClass
Естественно, что экземпляр этого класса не будет отдавать данные как массив. Нужно использовать номральный синтаксис обращения к свойствам объекта.
Ответить с цитированием
  #33 (permalink)  
Старый 23.02.2012, 23:36
Профессор
Посмотреть профиль Найти все сообщения от Mахmaxmaximus
 
Регистрация: 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.
Ответить с цитированием
  #34 (permalink)  
Старый 24.02.2012, 00:20
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Mахmaxmaximus
ясн, а обьект и массив в PHP одно и то же? То есть это один и тот же класс Array?
Нет.
Массивы не являются объектами.
У них нету ни свойств ни методов, а есть только ключи и соответсвующие им элементы.
Причем ключи могут быть как целочисленные, так и строковые.
В последнем случае - получаем ассоциативный массив, но он не становится от этого объектом.
Получать досту к элементу предполагается таким синтаксисом: $array[0], $array['text_key']

А объекты - они уже имеют свойства, методы и прочая.
Доступ к свойствам и методам осуществляется через -> (или :: для статических)
Экземпляры некоторых классов (реализующих интерфейс ArrayAccess, и при необходимости несколько сопутсвующих) могут использоватся как массивы.
Но это уже будут объекты, а не массивы.
Но это уже из разряда тех кун-гфу: не все знают, и еще меньше используют
Ответить с цитированием
  #35 (permalink)  
Старый 24.02.2012, 00:45
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
  #36 (permalink)  
Старый 24.02.2012, 00:49
Профессор
Посмотреть профиль Найти все сообщения от Mахmaxmaximus
 
Регистрация: 22.02.2012
Сообщений: 163

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

monolithed,
Мне кажется что вы взяли все свои предположения с потолка.
Или вы реально читали исходные коды, и все описанное вами видели там?
Ответить с цитированием
  #38 (permalink)  
Старый 24.02.2012, 00:55
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от Mахmaxmaximus
видимо чтобы не путали массивы с обьектами? нет?
Фактически изнутри у array и есть объект, но они решили сделать его отдельным типом данных, что вполне разумно. К примеру в Python list (аналог массива) имеет тип Тип))

Сообщение от Gvozd
Мне кажется что вы взяли все свои предположения с потолка.
Ну да это только предположения, но предположить внутренне архитектуру частично возможно, учитывая то что он написан на С++

UPD:
Сообщение от Gvozd
Или вы реально читали исходные коды, и все описанное вами видели там?
Посмотрел исходники (какие-то они странные, не смог найти даже парсер) написан он на С, так что все немного по другому)

Последний раз редактировалось monolithed, 24.02.2012 в 01:19.
Ответить с цитированием
  #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.
Ответить с цитированием
  #40 (permalink)  
Старый 24.02.2012, 01:30
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос про PHP Questioner Серверные языки и технологии 1 14.02.2011 22:43
Вопрос по работе функций в PHP bayah Серверные языки и технологии 2 12.02.2011 17:42
ООП PHP вопрос mycoding Серверные языки и технологии 9 03.06.2010 02:57
Небольшой вопрос по jQuery deepslam jQuery 10 30.01.2010 00:19
javascript и php (Вопрос) Гауляйтер Общие вопросы Javascript 3 06.05.2009 09:23