Lester Caine wrote on 02/02/2015 09:19:
This is probably because I still don't understand objects, as I still
just consider them as arrays with a few more complex elements. I STILL
work on the basis that is I pass by reference, I can make modifications
to the data while if I don't I get a copy and have to pass the copy back
if I need the original changed. This used to be all very simple, so when
did it stop working? This may explain why I get into trouble with stuff
that has been working for years but after 'modernising' starts throwing
problems :(

Since PHP 5, and in most other languages, objects are passed with an extra level of indirection, almost but not quite the same as pass-by-reference. So there are actually three ways a variable can be passed (or assigned):

- scalar by value - an assignment to the variable changes only that variable
- scalar by reference, using & - both variable names point to the same variable, and assigning a value to one assigns it to both - object by value - an assignment to the variable still only changes that variable, BUT two variables can point at the same object can both modify its internal state. So if you have $current_user = getCurrentUserObject(); then saying $current_user = null; is changing its value, so would only change that variable, but $current_user->setPassword('1234'); is not, so the change would be visible from all variables pointing at that object.

Immutable parameters for scalars and arrays are simple: currently you can use a by-value parameter as a local variable in your function, but you might want to avoid the confusion of this: function foo( const $bar ) { $bar = 42; // ERROR } or foo( const array $bar ) { $bar[] = 42; // ERROR }

Immutable parameters for objects are complicated, because foo( const $bar ) { $bar->value = 42; } is not technically changing the *value* of that object, but it would be useful to have an enforcement that it wouldn't happen.

Hope that clarifies things a bit.
Regards,
--
Rowan Collins
[IMSoP]
||

Reply via email to