参照渡しの挙動

PHPの参照渡しの挙動

<?php
function func( &$messages ){
    array_push( $messages, "message" );
}
$messages = array();
func( $messages );
var_dump( $messages );

これと、

<?php
function func( &$messages ){
    $messages = array();
    array_push( $messages, "message" );
}
func( $messages );
var_dump( $messages );

これは意図した挙動、

array(1) {
  [0]=>
  string(7) "message"
}

となるんだけど、

<?php
function func( &$messages ){
    array_push( $messages, "message" );
}
func( $messages = array() );
var_dump( $messages );

これは

array(0) {
}

こうなって、

<?php
function func( $row, &$messages = array() ){
    array_push( $messages, "message" );
}
func( $rows, $messages );
var_dump( $messages );

これは、

PHP Warning:  array_push(): First argument should be an array in phpfile on line 3
NULL

となるんですね。