Тип подсказки
PHP 5 вводит Type Hinting. Теперь функции могут заставить объекты быть объектами (путем указания имени класса в прототипе функции) или массивов (начиная с PHP 5.1). Однако, если NULL используется как значение параметра по умолчанию, он будет разрешен в качестве аргумента для любого последующего вызова.
Следующая выдержка из вышесказанного:
если NULL используется как значение параметра по умолчанию, он будет разрешен в качестве аргумента для любого последующего вызова.
  Означает ли это следующее: 
  если параметры по умолчанию использовать с типом, он может иметь только значение NULL в качестве значения по умолчанию. 
  т.е. код в коде1 неверен и приводит к: 
  Неустранимая ошибка: значение по умолчанию для параметров с подсказкой типа класса может быть только NULL 
function setName ( string $name = "happ") { ... } 
Если код в коде2 прав:
  function setName ( string $name = NULL) { ... } 
Почему это ограничение назначено в php?
Вы не можете вводить строки, вы можете вводить только объекты и массивы типа type, поэтому это неверно:
 function setName ( string $name = "happ") { 
(Причина, по которой вы не получаете ошибку времени компиляции, заключается в том, что PHP интерпретирует «string» как имя класса.)
Формулировка в документах означает, что если вы это сделаете:
 function foo(Foo $arg) { 
Тогда аргумент, переданный foo (), должен быть экземпляром объекта Foo. Но если вы это сделаете:
 function foo(Foo $arg = null) { 
Тогда аргумент, переданный foo (), может быть либо экземпляром объекта Foo, либо null. Также обратите внимание, что если вы выполните следующее:
 function foo(array $foo = array(1, 2, 3)) 
Тогда вы не можете вызвать foo (null). Если вы хотите эту функциональность, вы можете сделать что-то вроде этого:
 function foo(array $foo = null) { if ($foo === null) { $foo = array(1, 2, 3); } 
Изменить: Начиная с PHP 5.4, вы также можете набирать текст:
 function foo(callable $callback) { call_user_func($callback); } 
Это вопрос времени времени компиляции и времени выполнения. При компиляции допускаются только буквенные значения (строки, числа, логические и NULL). В настоящее время PHP-процессор не может знать обо всех возможных классах, поэтому вы не можете создать экземпляр объекта в аргументах функции.
То, что я ожидаю от выдержки, состоит в том, что, в то время как обычная передача NULL в тип намеченной функции вызовет исключение / ошибку. Если вы установите значение по умолчанию как NULL, то это исключение не будет выбрано, если NULL передан. Я не проверял это, просто то, что я ожидал бы.
Вы не можете вводить строки, вы можете вводить только объекты и массивы.
В самом деле?
Итак, проверьте это: https://gist.github.com/qeremy/cd5de6397dd732751fec
  @ThinkingMonkey;  Вы можете использовать его таким образом в любое время, если хотите, но вы можете передавать только NULL в качестве значения по умолчанию. 
 function foo(int $x, float $y) { print $x * $y; } foo(3, 1.5); foo(3, 1); // boom! class User { public function theName(string $name) { print $name; } } $u = new User(); $u->theName('kerem'); 
попробуй это
 function setName ($name = "happ") { ... }