CHAPTER 13 – PASSING OBJECTS TO FUNCTIONS
As previously mentioned, one of the larger changes in PHP 5 is that if you pass objects to a function, they are no longer copied. Although this is usually what you want, it might be that you actually relied on your object being cop- ied. If that's the case, your script will no longer work correctly. Look at this example: <?php class str { var $string; function str($string) { $this->string = $string; } } function display_quoted($string) { $string->string = addslashes($string->string); echo $string->string; } $s = new str("Montreal's Finest Bagelsn"); display_quoted($s); echo $s->string; ?> Because in PHP 4, passing the $s object to the function creates a copy of the object, the output in PHP 4 is Montreal's Finest Bagels Montreal's Finest Bagels In PHP 5, the object's handle is passed and the object is actually modi- fied. Thus, PHP 5 produces different output: Montreal's Finest Bagels Montreal's Finest Bagels If you want to modify only a copy in PHP 5, one solution is to copy (clone) the object yourself when you pass it to the function. Do this by using the clone operator: display_quoted(clone $s); Another solution is to disable the new behavior by setting the php.ini option zend.ze1_compatibility_mode to 1. Or, you can set this option inside your script itself, but you need to set it before passing the object to a function.
Tip: If your script that relies on the pass-by-copy behavior needs to work with both PHP 4 and PHP 5, using the clone operator won't work, because this operator does not exist in PHP 4. The clone operation will throw an E_ERROR error when run in PHP 4. In this case, it's better to use the compatibility mode setting.