2011-12-27 3 views
0

У меня есть массив с примерно 300 индексами, и каждый индекс имеет около 8 «подиндексов» (?). Таким образом, это большой массив (ish). Я работаю над преобразованием моего кода в стиль oop, и один из моих классов (цветов) понадобится, чтобы этот массив передавался как аргумент. Поэтому мой вопрос прост ... если я создам 100 цветовых классов и передаю каждый массив, я не создаю 100 отдельных массивов, чтобы исправить только 100 указателей?PHP передающий массив классу

$colors['Apricot'] = array(250,180,160,3341,328,826,194,3332,0); 
$colors['Apricot, Light'] = array(255,230,225,3824,8,833,2605,-1,1); 

$x=new color(); 
$y=new color(); 
$z=new color(); 

$x->doSomething($colors); 
$y->doSomething($colors); 
$z->doSomething($colors); 

Тебе остается только одна копия массива, а не три?

Спасибо, Тодд

+0

Имя класса, а также его конструктор должно начинаться с прописной буквы ... просто говоря ... –

+0

[Pass by Ссылка] (http://www.php.net/manual/en/language.references.pass.php) Примечание. Нет признака ссылки на вызов функции - только для определения функций. Определений функций достаточно, чтобы правильно передать аргумент по ссылке. Начиная с PHP 5.3.0 вы получите предупреждение о том, что «call-time pass-by-reference» устарело, когда вы используете & in foo (&$a);. – Poe

ответ

4

Правда. Но теоретически массив скопирован как значение. Это просто, что внутри PHP он не будет , дублированный в памяти ... если только один из ваших объектов не начнет изменять этот переданный массив.

В этом случае вы могли бы передать явную ссылку & или даже преобразовать ее в объект ArrayObject. (Опять же: практически не нужно, если вы не планируете редактировать массив.)

+0

Уверены ли вы в этом? Звучит очень разумно из соображений экономии памяти точка зрения на движок PHP, но тем не менее, мне любопытно, как вы это знаете? У вас есть какая-либо ссылка на эту информацию? –

+0

Невозможно найти действительно информативный дубликат прямо сейчас. Мы должны вызвать NikiC, он знает такие вещи Но у нас были некоторые предыдущие обсуждения, подобные этому, и он также упоминается (хотя и супермерно) где-то в руководстве. Частное поведение PHP обычно называется «копировать при записи» и может иметь какое-то отношение к этому счетчику ссылок. – mario

+0

О, вот один http://stackoverflow.com/a/7407746/345031 – mario

1

Да, вы создаете 100 копий, так как скалярные и массив аргументов по умолчанию передаются по значению, а не по ссылке, чтобы методы класса в PHP.

Для того, чтобы метод, чтобы принять в качестве аргумента по ссылке вы должны изменить подпись метода, предваряя амперсанд в имени параметра, например, так:

public function doSomething(&$argument) 
{ 
} 

редактировать:
Более точный отчет о внутренних разработках см. В разделе mario's answer.

Смежные вопросы