Когда вызывается функция PHP и что-то возвращается, останавливается ли выполнение кода ниже? - PullRequest
3 голосов
/ 19 января 2010

Я сейчас изучаю PHP-код другого пользователя, чтобы лучше понять и изучить. В приведенном ниже коде это часть пользовательского класса. Когда я кодирую, используя блоки if / else, я форматирую их следующим образом ...

if(!$this->isLoggedIn()){
    //do stuff
}

Но в приведенном ниже коде это больше похоже на

if (! $this->isLoggedIn())
    return false;

Также в приведенной ниже функции вы можете видеть, что есть пара значений, которые могут быть RETURN . Так что мой вопрос здесь, когда вызывается RETURN , не запускается ли после этого какой-либо код? Как это заканчивается сценарий для этой функции там?

В этом случае, если это выполняется ...

if (! $this->isLoggedIn())
        return false;

Продолжает ли он запускать код ниже этого?


Вот функция

<?PHP
private function logout($redir=true)
{
    if (! $this->isLoggedIn())
        return false;

    $this->obj->session->sess_destroy();

    if ($this->isCookieLoggedIn())
    {
        setcookie('user','', time()-36000, '/');
        setcookie('pass','', time()-36000, '/');
    }
    if (! $redir)
        return;

    header('location: '.$this->homePageUrl);
    die;
}
?>

Ответы [ 4 ]

11 голосов
/ 19 января 2010

Да.

Когда PHP видит команду возврата, он прекращает выполнение и возвращает ее тому, кто ее вызвал. Это включает include s, выполнение функций, выполнение методов и т. Д.

В дальнейшем «Test» никогда не будет повторяться:

$test = "test";
return;
echo $test;

Если вы находитесь во включенном файле, return остановит его выполнение, а файл, включивший его , завершит выполнение .

Один из вариантов использования аналогичен описанному вами:

public function echoString($string)
{
    if(!is_string($string))
    {
        return;
    }
    echo $string;
}
1 голос
/ 19 января 2010

Как примечание ...

Несмотря на то, что ключевое слово return может использоваться таким образом, многие считают использование его таким же образом, как оно используется в вашем примере функции, как очень плохую практику. Это может испортить «поток» кода, делая его менее читабельным. (Аналогично использованию оператора goto, хотя и не так уж и плохо.)

Я бы сказал, что код, который вы разместили, был бы лучше структурирован так:

<?php
function logout($redir=true)
{
    if ($this->isLoggedIn()) 
    {
        $this->obj->session->sess_destroy();

        if ($this->isCookieLoggedIn()) {
            setcookie('user','', time()-36000, '/');
            setcookie('pass','', time()-36000, '/');
        }

        if ($redir) {
            header('location: '.$this->homePageUrl);
            die;
        }
    }
}
?>

Нигде в этой версии код не "вырывается" из блока рано. Нет никаких сомнений в том, должны ли выполняться следующие строки или нет.

1 голос
/ 19 января 2010

Начните с прочтения руководства:

http://us2.php.net/return

0 голосов
/ 19 января 2010

Я думаю, что мы должны различать return, используемый внутри функции, и return, используемый в глобальном масштабе.

Как сказано в Справочнике по функциям PHP , script выполнение останавливается только во втором случае.

@ jason, вы, похоже, спрашивали о его использовании в функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...