що повертає функція php за замовчуванням?


76

Якщо я нічого не повертаю явно, що саме повертає функція php?

function foo() {}
  1. Що це за тип?

  2. Яке це значення?

  3. Як я можу перевірити це саме за допомогою ===?

  4. Чи змінилося це з php4 на php5?

  5. Чи існує різниця між function foo() {}іfunction foo() { return; }

(Я не запитую, як це протестувати if (foo() !=0) ...)


1
Дивіться php.net/manual/en/functions.returning-values.php для офіційної документації
Софівор

Відповіді:



38

Не повернення значення з функції PHP має таку ж семантику, що і функція, яка повертає null.

function foo() {}

$x=foo();

echo gettype($x)."\n";
echo isset($x)?"true\n":"false\n";
echo is_null($x)?"true\n":"false\n";

Це виведе

NULL
false
true

Ви отримуєте той самий результат, якщо foo замінено на

function foo() {return null;}

У цій поведінці не відбулося змін від php4 до php5 до php7 (я просто перевірив, щоб бути впевненим!)


+1, але я хотів би, щоб я міг +2, це більш повна відповідь (включає запитання №4 щодо зміни поведінки між версіями php)
Джонатан,

-2

Я виявив дивина при вказівці типів повернення функції. Коли ви це зробите, ви повинні чітко заявити про повернення чогось із своїх функцій.

<?php

function errorNoReturnDeclared($a = 10) : ?string {
    if($a == 10) {
        echo 'Hello World!';
    }
}

errorNoReturnDeclared(); //Fatal error

Помилка:

 Uncaught TypeError: Return value of errorNoReturnDeclared() must be of the type string or null, none returned in 

Тож якщо ви вирішили додати деякі специфікації типу повернення до старих функцій, обов’язково подумайте про це.


1
Вам здається дивним те, що вам потрібно щось повернути, коли ви прямо сказали PHP, що ВИРОБИТЕ рядок чи нуль?
emix

Ну, якщо функція повертає за замовчуванням значення null, то я не розумію, навіщо мені це робити, навіть якщо я оголошую тип повернення. Компілятор повинен цим займатися.
Патрік. ПН
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.