What about objects? class Foo { public $foo; }
function test($o) { $o->foo->foo->foo = 2; } $bar = new Foo; $bar->foo = new Foo; $bar->foo->foo = new Foo; test( $bar ); --- Also... is it better to pass an object as a parameter rather than many values? function withValues($anInteger, $aBool, $aString) { var_dump($anInteger, $aBool, $aString); } function withObject(ParamOject $o) { var_dump( $o->theInteger(), $o->theBool(), $o->theString() ); } Martin Scotta On Wed, Jan 19, 2011 at 5:03 AM, Hannes Landeholm <landeh...@gmail.com>wrote: > Using references does not speed up PHP. It does that already > internally, if I'm not mistaken. The point of my post was that > assigning values to tree arrays are in general faster than a full > array copy. > > Hannes > > On 19 January 2011 08:36, Ben Schmidt <mail_ben_schm...@yahoo.com.au> > wrote: > > Yep. PHP does clock up memory very quickly for big arrays, objects with > lots > > of members and/or lots of small objects with large overheads. There are a > > LOT of zvals and zobjects and things around the place, and their overhead > > isn't all that small. > > > > Of course, if you go to the trouble to construct arrays using references, > > you can avoid some of that, because a copy-on-write will just copy the > > reference. It does mean you're passing references, though. > > > > $bar['baz'] = 1; > > $poink['narf'] = 1; > > $a['foo']['bar'] =& $bar; > > $a['foo']['poink'] =& $poink; > > > > Then if you test($a), $bar and $poink will be changed, since they are > > 'passed by reference'--no copying needs to be done. It's almost as if $b > > were passed by reference, but setting $b['blip'] wouldn't show up in $a, > > because $a itself would be copied in that case, including the references, > > which would continue to refer to $bar and $poink. So a much quicker copy, > > but obviously not the same level of isolation that you might expect or > > desire. Unless you did some jiggerypokery like $b_bar=$b['bar']; > > $b['bar']=$b_bar; which would break the reference and make a copy of just > > that part of the array. But this is a pretty nasty caller-callee > > co-operative kind of thing. Just a thought to throw into the mix, though. > > > > Disclaimer: I'm somewhat out of my depth here. But I'm sure someone will > > jump on me if I'm wrong. > > > > Ben. > > > > > > > > On 19/01/11 6:09 PM, Larry Garfield wrote: > >> > >> That's what I was afraid of. So it does copy the entire array. Crap. > :-) > >> > >> Am I correct that each level in the array represents its own ZVal, with > >> the > >> additional memory overhead a ZVal has (however many bytes that is)? > >> > >> That is, the array below would have $a, foo, bar, baz, bob, narf, poink, > >> poink/narf = 8 ZVals? (That seems logical to me because each its its > own > >> variable that just happens to be an array, but I want to be sure.) > >> > >> --Larry Garfield > >> > >> On Wednesday, January 19, 2011 1:01:44 am Ben Schmidt wrote: > >>> > >>> It does the whole of $b. It has to, because when you change 'baz', a > >>> reference in 'bar' needs to change to point to the newly copied 'baz', > so > >>> 'bar' is written...and likewise 'foo' is written. > >>> > >>> Ben. > >>> > >>> On 19/01/11 5:45 PM, Larry Garfield wrote: > >>>> > >>>> Hi folks. I have a question about the PHP runtime that I hope is > >>>> appropriate for this list. (If not, please thwap me gently; I bruise > >>>> easily.) > >>>> > >>>> I know PHP does copy-on-write. However, how "deeply" does it copy > when > >>>> dealing with nested arrays? > >>>> > >>>> This is probably easiest to explain with an example... > >>>> > >>>> $a['foo']['bar']['baz'] = 1; > >>>> $a['foo']['bar']['bob'] = 1; > >>>> $a['foo']['bar']['narf'] = 1; > >>>> $a['foo']['poink']['narf'] = 1; > >>>> > >>>> function test($b) { > >>>> > >>>> // Assume each of the following lines in isolation... > >>>> > >>>> // Does this copy just the one variable baz, or the full array? > >>>> $b['foo']['bar']['baz'] = 2; > >>>> > >>>> // Does this copy $b, or just $b['foo']['poink']? > >>>> $b['foo']['poink']['stuff'] = 3; > >>>> > >>>> return $b; > >>>> > >>>> } > >>>> > >>>> // I know this is wasteful; I'm trying to figure out just how > wasteful. > >>>> $a = test($a); > >>>> > >>>> test() in this case should take $b by reference, but I'm trying to > >>>> determine how much of a difference it is. (In practice my use case > has > >>>> a vastly larger array, so any inefficiencies are multiplied.) > >>>> > >>>> --Larry Garfield > >> > > > > -- > > PHP Internals - PHP Runtime Development Mailing List > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >