PHP глобальная переменная равна нулю внутри функции, но не равна нулю вне ее - PullRequest
0 голосов
/ 08 апреля 2020

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

Вот мой код:

function getComments($id)
{
    global $conn;
    $COMPONENT_NAME = "view_company_comments";
    include_once "validateUser.php";

Только для контекста, если COMPONENT_NAME не будет присутствовать в каком-то определенном списке, выполнение скрипта прекратится с использованием функции d ie ().

Теперь внутри "validateUser. php":

(объяснил все в комментариях)

   <?php

   if (!isset($COMPONENT_NAME)) {
        die(json_encode(["error" => "validating user: component was not set."]));
    } else {

        include_once "permissions.php";
        $validateUser_allowedActions = permissionsInitActions();

        //So far in, var_dump($COMPONENT_NAME) works properly here, and I get the component name succesfully. 
        //But watch next:

        //"permissionsAllowed()" is a function from "permissions.php", 
        //this function returns "false" here, expected result is "true"

        if (!permissionsAllowed($validateUser_allowedActions)) {
            die(json_encode(["error" => $COMPONENT_NAME . ": Unvalidated user privillege."]));
        }
    }

А внутри "разрешения. php":

function permissionsAllowed($actions)
{
    global $COMPONENT_NAME, $conn;

    //Here, var_dump($COMPONENT_NAME) results to "null", which is weird
    //because in "validateUser.php" it is a correct string value.

    $sql = "SELECT id FROM permission_actions WHERE `name` = '$COMPONENT_NAME'";
    $result = mysqli_query($conn, $sql);
    $actionID = mysqli_fetch_assoc($result)["id"];
    var_dump($COMPONENT_NAME);

    if (in_array($actionID, $actions)) {
        return true;
    }
    return false;
}

Что здесь происходит? Чего мне не хватает?

Спасибо за любую помощь.

1 Ответ

1 голос
/ 08 апреля 2020

$COMPONENT_NAME не является глобальной переменной в getComments. Хотя вы объявили его global в permissionsAllowed, оно не объявлено global в getComments и, следовательно, $COMPONENT_NAME в getComments является локальным для этой области и, следовательно, не отображается через global $COMPONENT_NAME в permissionsAllowed .

Рассмотрим следующий код ( demo ):

$b = 5;

function f1 () {
    global $a;
    $a = 4;
    $b = 3;
    $c = 2;
    f2();
}

function f2 () {
    global $a, $b, $c;
    var_dump($a);
    var_dump($b);
    var_dump($c);
}

f1();

Вывод:

int(4)
int(5)
NULL

$a не объявлен вверху уровень, но объявлен global в f1 и f2 - изменения, внесенные в него в f1, можно увидеть в f2.
$b объявлен на верхнем уровне, но только global в f2. $b в f1 является локальным для этой области, и изменения в нем не влияют на $b в f2.
$c не объявлено на верхнем уровне и составляет только global в f2. Опять же, $c в f1 является локальным для этой области, и изменения в нем не влияют на $c в f2, поэтому значение global $c, указанное в f2, не имеет значения (null ) поскольку он нигде не установлен.

...