PHP функция не сохраняет переменную - PullRequest
2 голосов
/ 01 мая 2011

У меня есть эта php-функция, которую я создал, которая в основном является оператором switch.Для каждого случая переменная $ team_image сохраняется в другое значение.Это выглядит примерно так:

function teamImage($team)
{
    switch($team)
    {
        case "Baltimore Orioles":

            $team_image = "orioles";

        case "New York Yankees":

            $team_image = "yankees";

        case "Toronto Blue Jays":

            $team_image = "bluejays";

Вы поняли идею.Однако, когда я вызываю функцию и пытаюсь использовать переменную $ team_image в других частях моего кода, она не работает, потому что, очевидно, переменная все еще не определена.есть мысли?

Спасибо,

Лэнс

Ответы [ 7 ]

3 голосов
/ 01 мая 2011

Поскольку вы устанавливаете $team_image только внутри функции teamImage, она будет существовать только с этой функцией " scope ".(Как правило, переменные и т. Д. Всегда будут существовать в максимально узкой области видимости, что хорошо с точки зрения инкапсуляции. (Инкапсуляция является ключевым преимуществом объектно-ориентированного программирования и т. Д., К которому вы можете обратитьсячтобы узнать, как вы узнаете больше.)

Таким образом, вы должны вернуть значение $team_image из функции teamImage и установить его следующим образом:

function teamImage($team) {

    $team_image = NULL;

    switch($team) {
       ...
    }    

    return $team_image;
}

$team_image = teamImage($team);

Альтернатива будетопределить переменную $team_image в функции teamImage как глобальную, добавив строку global $team_image; в начале функции, но это не считается хорошей практикой.

Кроме того, вам следуетbreak; каждый блок кода дела в вашем операторе переключения, иначе вы просто в конечном итоге установите $team_image со значением, назначенным в вашем последнем случае. (Т. Е. Если вы не разбиваете каждое утверждение, поток кода продолжится вдалее.) Подробнее см. на странице руководства PHP .

1 голос
/ 01 мая 2011

Несколько фактов:

  • Вы забыли break;
  • $team_image локальная область действия
  • Вы действительно не хотите использовать default?

Ответ:

Вы должны использовать return в вашей функции, , если вы еще не использовали , в противном случае проблема может быть в $team_image scope .

Пример:

Изменено:

Код:

function teamImage($team)
{
    $team_image = '';
    switch($team)
    {
        case "Baltimore Orioles":    
            $team_image = "orioles";
        break;

        case "New York Yankees":    
            $team_image = "yankees";
        break;

        case "Toronto Blue Jays":    
            $team_image = "bluejays";
        break;
    }
    return $team_image;
 }

Использование:

$team = 'new York Yankees';
$teamImage = teamImage($team); // yankees
1 голос
/ 01 мая 2011

Это потому, что переменная $ team_image находится в области действия функции. Либо объявите $ team_image глобальным в начале функции:

function teamImage($team)
{ 
  global $team_image;
  ...

или лучше, верните $ team_image в конце вашей функции и назначьте его другой переменной, где вам это нужно:

function teamImage($team) {
   ...
   return $team_image
}

...

$image = teamImage($team_name);
0 голосов
/ 01 мая 2011

Прежде всего, вам нужно использовать break в вашем коммутаторе, чтобы предотвратить провал :

http://codepad.org/CVzLAUr0

<?php

function teamImage($team)
{
    switch($team)
    {
        case "Baltimore Orioles":
            $team_image = "orioles";
            break;
        case "New York Yankees":
            $team_image = "yankees";
            break;
        case "Toronto Blue Jays":
            $team_image = "bluejays";
            break;
        default:
            $team_image = "none";
    }
    return $team_image;
}

echo teamImage('Baltimore Orioles');

?>

Во-вторых, если вы хотите использовать переменную, измененную в глобальной области, вам нужно использовать ключевое слово global внутри функции или использовать массив $GLOBALS:

http://codepad.org/nkT5FxrH

<?php

$team_image = '';

function teamImage($team)
{
    global $team_image;
    switch($team)
    {
        case "Baltimore Orioles":
            $team_image = "orioles";
            break;
        case "New York Yankees":
            $team_image = "yankees";
            break;
        case "Toronto Blue Jays":
            $team_image = "bluejays";
            break;
        default:
            $team_image = "none";
    }
    return $team_image;
}

teamImage('Baltimore Orioles');

echo $team_image;

?>
0 голосов
/ 01 мая 2011
However, when I call on the function and try to use the $team_image variable in other parts of my code

вам нужно вернуть $team_image в конце функции

, чтобы он выглядел следующим образом

function getTeamImage($team)
{
 switch($team)
{
 case "a":
    $team_image = "asdas";
    break;
  #end so on
}

return $team_image;
}

#And than you can use in your other code:

$team_image = getTeamImage($team);
0 голосов
/ 01 мая 2011

Эта проблема связана с переменной scope .Функции PHP имеют свою собственную таблицу символов, и когда вы присваиваете переменную $team_image в своей функции, вы действительно назначаете локальную переменную.Эта переменная выходит из области видимости в конце функции, что означает, что она больше не существует.

Лучший способ исправить это, вероятно, будет вернуть значение изфункцию и присвойте переменной $team_image, используя вызов функции.

function teamImage($team)
{
    switch($team)
    {
        case "Baltimore Orioles":

            return "orioles";

        case "New York Yankees":

            return "yankees";

        case "Toronto Blue Jays":

            return "bluejays";
    }
}

$team_image = teamImage($team);

Теперь переменная $team_image находится в области, в которой вы вызываете функцию.

Если вы хотитепеременную, которая будет видна во всех областях, вместо этого вы можете использовать $GLOBALS['team_image'], но глобальные переменные часто считаются плохой практикой.(Вы можете найти много источников в Интернете, которые объяснят почему.)

0 голосов
/ 01 мая 2011

вам нужно просмотреть документацию по области переменных. область видимости переменных

...