PHP вручную выделение памяти и размер класса / объекта - PullRequest
2 голосов
/ 15 октября 2011

Поскольку PHP не предоставляет реальных массивов, я хочу создать класс массива самостоятельно.Однако желательно, чтобы я не хотел создавать какой-то класс-оболочку для массива PHP, но я действительно хочу создать настоящий массив, как в C / C ++.Однако, если я не хочу использовать сборку в массиве PHP, мне нужно каким-то образом распределить память вручную и определить размер объекта / класса.Поэтому мне нужна версия PHP функций c sizeof и malloc.К сожалению, я не смог найти их в PHP.Существуют ли функции, которые делают то же самое, или вы знаете какой-либо другой способ сделать это?

Редактировать: я думаю, что мой вопрос недостаточно ясен: в PHP массив - это действительно карта порядка.В некоторых ситуациях это может немного усложнить ситуацию: например, если у вас есть массив с индексами 0,1,2 и 3, вы не можете передать, что вы получите эти элементы в таком порядке в цикле foreach:это зависит от порядка, в котором вы определили элементы в массиве.Поскольку эти мелочи меня раздражают, я хочу создать «реальный» класс массивов, основанный на массивах, подобных тем, которые есть в c / c ++.Это означает, что массивы должны иметь фиксированный размер, и мне нужно выделять память вручную при инициализации массива.Например, когда создается массив из 10 целых чисел, класс массива должен выделять блок памяти размером 10 * sizeof (integer).Конечно, я мог бы использовать сборку в PHP 'array' для хранения этих 10 целых чисел, но я только что создал класс-оболочку для сборки в типе массива.Поэтому желательно, чтобы я мог выделять эту память сам, чтобы лучше управлять ею, чем при сборке в типе массива.Однако я не смог найти функцию, которая дает мне размер класса / объекта, и я мог найти функцию, которая могла бы выделять память вручную, как это делает malloc в c.Итак, мой вопрос: есть ли функции для этого?А если нет, есть ли у вас другие эффективные способы достижения моей цели?

Ответы [ 2 ]

8 голосов
/ 15 октября 2011

PHP уже имеет класс Array с SplFixedArray, который ведет себя так, как вы хотите:

$array = new SplFixedArray(3);
$array[1] = 'foo';
$array[0] = 'bar';
$array[2] = 'baz';
foreach ($array as $k => $v) {
    echo "$k => $v\n";
}
$array[] = 'fails';

дает

0 => bar
1 => foo
2 => baz

и наконец

Неустранимая ошибка: необработанное исключение «RuntimeException» с сообщением «Индекс недействителен или находится вне диапазона»

В SPL есть несколько дополнительных структур данных. Обзор см.

Если вы хотите узнать, как SplFixedArray реализован в PHP, взгляните на

Если вы хотите что-то другое, вам, вероятно, придется реализовать это на уровне C языка, например вам нужно написать собственное расширение.

0 голосов
/ 15 октября 2011

Не уверен

Возможно, вам не хватает памяти, поскольку размер вашего массива (теоретически) ограничен только объемом памяти, выделенным для сценария.
Положить ini_set('memory_limit', '1024M'); в начале вашего скрипта установите лимит памяти в 1 ГБ. Возможно, вам придется увеличить это значение еще выше для достижения наилучших результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...