Некоторые мысли на эту тему:
К примеру
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 так усердно скрывают реальные типы объектов.