Php глобальная переменная с ошибками

Обработка ошибок с помощью trigger_error() и set_error_handler()

PHP предоставляет прекрасную возможность контролировать возникающие ошибки. Здесь мы поговорим о том, как обработать ошибку — сообщить (или не сообщить) о происшествии пользователю, в случае необходимости — сообщить администратору с помощью электронной почты, записать информацию о происшествии в log-файл.

Итак, для начала давайте определимся, что такое ошибки в PHP.

PHP поддерживает следующие уровни ошибок:

E_ERROR
E_WARNING
E_PARSE
E_NOTICE
E_CORE_ERROR
E_CORE_WARNING
E_COMPILE_ERROR
E_COMPILE_WARNING
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
E_ALL
E_STRICT

На самом деле — это просто константы, которые используются для определения уровня обработки ошибок, построения бит-маски. Константы имеют «говорящие» имена. Глядя на константу — мы можем сказать, что ошибка уровня E_PARSE возникает в случае синтаксической ошибки, E_NOTICE — это напоминание программисту о нарушении «хорошего стиля» программирования на PHP.

Несколько примеров:

Когда соединение с базой данных MySQL (или другой) завершается неудачей — интерпретатор PHP сообщает об ошибке уровня E_WARNING

Warning: mysql_connect(): Access denied for user: 'VVingless@localhost' (Using password: YES)
 In /home/mysite/index.php (line 83)

Замечание: Для того чтобы интерпретатор PHP сообщал об ошибках — PHP должен быть настроен соответствующим образом: флаг display_errors должен быть включен — 1, директива error_reporting должна указывать на то, что необходимо отображать ошибки уровня E_WARNING (желательно конечно и другие). Если значения этих директив не удовлетворяют вашим требованиям — вы можете попробовать установить их самостоятельно, положив в папку со скриптом файл .htaccess (точка в начале имени обязательна) примерно такого содержания:

php_flag display_errors on
php_value error_reporting «E_ALL & ~E_NOTICE»

Это означает, что сообщения об ошибках будут показываться, причем всех уровней, кроме E_NOTICE
Когда программист допускает синтаксическую ошибку — интерпретатор PHP сообщает об ошибке уровня E_PARSE

Parse error: parse error, unexpected ‘(‘, expecting T_STRING in /home/mysite/index.php on line 150

Но самые интересные для нас уровни ошибок — E_USER_ERROR и E_USER_WARNING. Как становится понятно из названия — это уровни ошибок, которые может устанавливать пользователь. Для этого существует функция trigger_error() — с её помощью, Вы можете сообщать пользователю о происшествии так, как это делает PHP.

Как известно из руководства по PHP — функция trigger_error() принимает два параметра.

void trigger_error ( string error_msg [, int error_type])

Первый параметр — текстовое сообщение об ошибке, например «файл не найден». Второй параметр — определяет уровень ошибки. Функция trigger_error() работает только с семейством ошибок E_USER — это значит, что вы можете установить ошибку уровня E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE и не можете установить ошибку уровня E_WARNING. Второй параметр является не обязательным, и по умолчанию принимает значение E_USER_NOTICE.

Давайте попробуем:

Допустим, наши данные для ленты новостей хранятся в файле news.txt, и если файл не найден — необходимо сообщить об ошибке. Текст программы будет выглядеть примерно так:

if (!file_exists(‘/home/mysite/news.txt’)) {
trigger_error(‘News file not found’);
}

В результате интерпретатор PHP сообщит об ошибке уровня E_USER_NOTICE

Notice: News file not found in /home/mysite/index.php on line 47
Но что нам это даёт? Для начала то, что если в php.ini или файле .htaccess были установлены директивы

php_value log_errors «1»
php_value log_errors_max_len «1024»
php_value error_log «/home/mysite/my.log»
То в файл /home/mysite/my.log автоматически будет добавлена запись о происшествии.

[23-Mar-2004 13:52:03] PHP Notice: News file not found in /home/mysite/index.php on line 47
Далее, с помощью функции set_error_handler() мы можем установить свой собственный обработчик ошибок возникающих во время выполнения PHP скрипта.

Как известно из мануала — в PHP 4 функция принимает один единственный строковый параметр — имя функции, которая будет выполняться каждый раз, когда происходит ошибка. PHP 5 даёт возможность установить ещё один параметр — тип ошибок которые будут обрабатываться с помощью нашего обработчика. Функция возвращает строку — имя функции обработчика, который был установлен до этого момента.

string set_error_handler ( callback error_handler [, int error_types])

устанавливаем так

set_error_handler («my_error_handler»);
Пользовательская функция, которая будет обрабатывать ошибки, может принимать следующие входные параметры:

— код уровня ошибки
— строковая интерпретация ошибки
— имя файла, в котором произошла ошибка
— строка, в которой произошла ошибка

Следует так же заметить, что эта функция не может обрабатывать ошибки уровней E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING

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

Итак, объявляем нашу функцию

function my_error_handler($code, $msg, $file, $line) {
}

Замечание: каждый более-менее объемный скрипт обычно разделяется на несколько файлов для удобства работы с ним. Как организовывать модульность программы — тема отдельно разговора. Сейчас же, я хочу лишь посоветовать выделять общие настройки в отдельный файл, который будет подключаться в начале программы с помощью инструкции include, либо с помощью директивы auto_prepend_file. В этот файл можно поместит и наш обработчик. Установка обработчика ошибок должна осуществится как можно ближе к началу программы, желательно в самом начале.
Для того чтобы убедится что это действительно работает — создадим новый PHP файл, и попробуем запустить его

Содержимое файла myerrortest.php

<?php

function my_error_handler($code, $msg, $file, $line) {

echo "Произошла ошибка $msg ($code)<br>n";
echo "$file ($line)";
}

set_error_handler('my_error_handler');

if (!file_exists('/home/mysite/news.txt')) {
trigger_error('News file not found');
}

?>

Результат обработки данного файла будет таким:

Произошла ошибка News file not found (1024)
/home/mysite/myerrortest.php (12)
Теперь у нас есть функция, которая получает данные обо всех происходящих ошибках. Подумаем, как мы можем это использовать.

Будем обрабатывать ошибки уровней
E_ERROR
E_WARNING
E_NOTICE
E_USER_ERROR
E_USER_NOTICE

Первые три ошибки в хорошей законченной программе не должны происходить вообще, поэтому о них мы будем только сообщать пользователю выводом текста ошибки на экран. Так можно работать, пока скрипт в состоянии разработки, затем сообщения о них можно либо отключить, либо записывать в log-файл.

Что касается остальных двух — как Вы уже догадались — они могу там пригодиться. Мы сами будем вызывать ошибки этих уровней в случае необходимости. Допустим — ошибки уровня E_USER_ERROR — будем вызывать в случае, когда сообщение об ошибке должно попасть в log-файл и быть отправлено на e-mail администратору (например — ошибка при выполнении SQL запроса, или отсутствии парв доступа к необходимому файлу). Ошибки уровня E_USER_NOTICE будут вызываться при возникновении «лёгких» ошибок (например — пользователь некорректно заполнил форму, или запросил из базы несуществующую запись).

Теперь наша функция обработки ошибок будет выглядеть примерно так:

// Немного предварительных настроек

// устанавливаем режим отображения ошибок
// отображать все ошибки, кроме E_NOTICE
error_reporting  (E_ALL & ~E_NOTICE);

// эта константа отвечает за
// включение/выключение режима отладки
// во время отладки - сообщения не отсылаются
// по почте, а просто печатаются на экран
define('DEBUG', 0);

// это глобальная переменная, в которой
// будет храниться сообщение, которое
// должен видеть пользователь
$MSG = '';

// e-mail разработчика, куда отправлять ошибки
define('ADM_EMAIL','admin@example.com');

// log-файл
define('LOGFILE','/home/mysite/mylog.log');

// разница во времени с сервером (в секундах)
define('TIMEOFFSET', 0);

// сама функция

function my_error_handler($code, $msg, $file, $line)
{
// глобальная переменная, в которую будет
// записываться сообщение об ошибке.
global $MSG;

// пропускаем ошибки уровня E_NOTICE
// и игнорируем ошибки, если режим сообщения об ошибках отключен
if ( ($code == E_NOTICE) or (error_reporting() == 0) ) {
return;
}

// если мы вызвали ошибку уровня E_USER_NOTICE - просто
// записать текст ошибки в глобальную переменную $MSG
// и прекратить выполнение функции

if ($code == E_USER_NOTICE) {
$MSG = $msg;
Return;
}

// если ошибка уровня E_ERROR - печатаем текст ошибки
// и завершаем выполнение скрипта

if ($code == E_ERROR) {
die ('<br><b>ERROR:</b> '.$msg.'<br>In '.$file.' (line '.$line.')<br>');
}

// если ошибка уровня E_WARNING - печатаем текст ошибки
// и прекращаем выполнение функции

if ($code == E_WARNING) {
echo '<br><b>WARNING:</b> '.$msg.'<br>In '.$file.' (line '.$line.')<br>';
Return;
}

// если ошибка уровня E_USER_ERROR

if ($code == E_USER_ERROR) {

// записываем в переменную $MSG текст, о том что произошла ошибка,
// причины сообщать не будем, только сообщим что подробности
// отправлены на e-mail кому следует.

$MSG = 'Критическая Ошибка: действие выполнено небыло. <br>
Сообщение об ошибке было отправлено разработчику.';

// подробности записываем в переменную $text

$text = $msg.'<br>'.'Файл: '.$file.' ('.$line.')';

// Если константа DEBUG установлена в 1 - печатаем информацию об
// ошибке на экран, если нет - отправляем текст ошибки почтой
// функция error_mail() и пишем в log - функция error_writelog()

if (DEBUG == 1) {
error_print($text);
} else {
error_mail($text);
error_writelog($text);
}

Return;
}
}


// устанавливаем обработчик
set_error_handler('my_error_handler');

Теперь описываем служебные функции 


// ф-я печатает ошибку на экран
function error_print($text)
{
echo $text.'<p>';
}

// ф-я отправляет ошибку почтой
function error_mail($text)
{
$text = str_replace("<br>", "n", $text);

$info = 'Время: '.get_datetime()."nRemote IP:".get_ip()."n";

mail(ADM_EMAIL, "Error reporting", $info.$text);
}

// ф-я пишет ошибку в лог
function error_writelog($text)
{
$text = str_replace("<br>", "t", $text);
if (@$fh = fopen(LOGFILE, "a+")) {
fputs($fh, get_datetime()."t".get_ip()."t".$text."n");
fclose($fh);
}
}


// получаем время, с учётом разницы во времени
function get_time()
{
return(date("H:i", time () + TIMEOFFSET));
}

// получаем дату, с учётом разницы во времени
function get_date()
{
return(date("Y-m-d", time () + TIMEOFFSET));
}

// получаем  дату и время, с учётом разницы во времени
function get_datetime()
{
return get_date().' '.get_time();
}

// получаем IP
function get_ip()
{
return($_SERVER['REMOTE_ADDR']);
}
И наконец пример использования 

// ф-я записывает новость в файл
function write_news($title, $text)
{
$news_file = '/home/mysite/news.txt';

// проверяем наличие заголовка - ошибка не критическая
if (!trim($title)) {

// для того чтобы определить что функция завершилась
// неудачей - необходимо вернуть false. Функция
// trigger_error() - возвращает true, мы будем
// возвращать её инвертированный результат

return !trigger_error('Необходимо указать заголовок новости');
}

// проверяем наличие текста новости - ошибка не критическая
if (!trim($text)) {
return !trigger_error('Необходимо указать текст новости');
}

// проверяем наличие файла в который будем писать
// если файл не найден - возникает критическая ошибка

if (!file_exists($news_file)) {
return !trigger_error('Файл базы новостей не найден!', E_USER_ERROR);
}

// ...тут предварительная обработка данных...

// записываем новость
$fh = fopen($news_file, "a+");
fputs($fh, $title."t".$text."n");
fclose($fh);

// если всё нормально - функция возвращает true
return true;
}

// пытаемся записать новость
// эти данные могут приходить из web-формы

$res = write_news("Моя новость", "Текст моей новости");

if ($res === false) {

// если вернулся false - печатаем ошибку
echo $MSG;

} else {

// если всё в порядке - можно сообщить об этом
// а лучше отфорвардить пользователя куда-нибудь.
echo 'Новость была добавлена';
}

Для того чтобы пример заработал — просто скопируйте в PHP-файл три предыдущих блока кода. Не забудьте установить права доступа на log-файл 777 для того чтобы скрипт мог с ним работать, прописать правильные пути и указать свой e-mail. Вы можете включить режим отладки установкой переменной DEBUG в 1.

Это довольно простой пример, тему можно развивать.

Today, I have started to learn PHP. And, I have created my first PHP file to test different variables. You can see my file as follows.

<?php
    $x = 5; // Global scope

    function myTest()
    {
        $y = 10; // Local scope
        echo "<p>Test variables inside the function:<p>";
        echo "Variable x is: $x";
        echo "<br>";
        echo "Variable y is: $y";
    }

    myTest();

    echo "<p>Test variables outside the function:<p>";
    echo "Variable x is: $x";
    echo "<br>";
    echo "Variable y is: $y";
?>

I have found the following errors when I have run this file in the browser.

Notice: Undefined variable: x in /opt/lampp/htdocs/anand/php/index.php on line 19

Notice: Undefined variable: y in /opt/lampp/htdocs/anand/php/index.php on line 29

How can I fix the issue regarding it?

Community's user avatar

asked Dec 5, 2013 at 4:59

Anand Mistry's user avatar

1

The first error ($x is undefined) is because globals are not imported into functions by default (as opposed to «super globals», which are).

You need to tell your function you’re referencing the global variable $x:

function myTest()
{
  global $x; // $x refers to the global variable

  $y=10; // local scope
  echo "<p>Test variables inside the function:<p>";
  echo "Variable x is: $x";
  echo "<br>";
  echo "Variable y is: $y";
}

Otherwise, PHP cannot tell whether you are shadowing the global variable with a local variable of the same name.

The second error ($y is undefined), is because local scope is just that, local. The whole point of it is that $y doesn’t «leak» out of the function. Of course you cannot access $y later in your code, outside the function in which it is defined. If you could, it would be no different than a global.

answered Dec 5, 2013 at 5:01

user229044's user avatar

user229044user229044

232k40 gold badges328 silver badges336 bronze badges

<?php
    $a = 1; /* Global scope */

    function test()
    {
        echo $a; /* Reference to local scope variable */
    }

    test();
?>

You are getting the first error because the variable $a can’t access the global variable’s value unless you explicitly declare global $a inside the function.

Example #1 Using a global

<?php
    $a = 1;
    $b = 2;

    function Sum()
    {
        global $a, $b; // If you want to access a global variable,
                       // you have to use the 'global' keyword

        $b = $a + $b;
    }

    Sum();
    echo $b;
?>

And the last error you are getting because $y is defined inside the function mytest() so its scope will be limited to that function only.

For a detailed explanation, read Variable scope.

Peter Mortensen's user avatar

answered Dec 5, 2013 at 5:01

R R's user avatar

R RR R

3,0012 gold badges24 silver badges42 bronze badges

Set $x as a global, like

global $x;

Or try this:

<?php
    $x = 5; // Global scope

    function myTest($x)
    {
        $y=10; // Local scope
        echo "<p>Test variables inside the function:<p>";
        echo "Variable x is: $x";
        echo "<br>";
        echo "Variable y is: $y";
    }

    myTest($x);

    echo "<p>Test variables outside the function:<p>";
    echo "Variable x is: $x";
    echo "<br>";
    echo "Variable y is: $y";
?>

Peter Mortensen's user avatar

answered Dec 5, 2013 at 5:03

himanshu bhardiya's user avatar

There are two cases of using a variable globally:

  1. Using a single copy of that variable and modify it from anywhere i.e. modification from within a function or outside i.e. in the global scope. In that case you need a declaration in the allowed set of function in the form global $x;.
  2. In case you need local variables for individual functions with the same identifier used for the global variable (i.e. variables outside all functions); in that case you have two variables with the same name i.e. one local and one global for that function. Then you need to use a superglobal variable $GLOBALS i.e. an array of all the global variables. I personally prefer this approach to make efficient code;

The following are the code for the two.

Code 1 (using global declaration)

<?php
    $x = 5; // Global scope

    function myTest()
    {
        $y = 10; // Local scope
        global $x;

        echo "<p>Test variables inside the function:<p>";
        echo "Variable x in global scope is: $x";
        echo "<br>";
        echo "Variable y is: $y";
    }

    myTest();

    echo "<p>Test variables outside the function:<p>";
    echo "Variable x is: $x";
    echo "<br>";
    echo "Variable y is: $y";
?>

Code 2 (using the $GLOBALS[] array)

<?php
    $x = 5; // Global scope

    function myTest()
    {
        $y = 10; // Local scope
        $x = 23;

        echo "<p>Test variables inside the function:<p>";
        echo "Variable x in global scope is: " . $GLOBALS['x'];
        echo "<br>Variable x in local scope is: $x";
        echo "<br>";
        echo "Variable y is: $y";
    }

    myTest();

    echo "<p>Test variables outside the function:<p>";
    echo "Variable x is: $x";
    echo "<br>";
    echo "Variable y is: $y";
?>

For REFERENCE.

Peter Mortensen's user avatar

answered Dec 5, 2013 at 5:09

Rajesh Paul's user avatar

Rajesh PaulRajesh Paul

6,7336 gold badges40 silver badges56 bronze badges

The code is behaving as expected, but if you want to use both the variables across the script use this:

<?php
    $x = 5; // Global scope

    function myTest(){
        global $x;
        global $y;
        $y = 10;

        echo "<p>Test variables inside the function:<p>";
        echo "Variable x is: $x";
        echo "<br>";
        echo "Variable y is: $y";
    }
    myTest();

    echo "<p>Test variables outside the function:<p>";
    echo "Variable x is: $x";
    echo "<br>";
    echo "Variable y is: $y";
?>

Peter Mortensen's user avatar

answered Dec 5, 2013 at 5:14

Vipin Kumar Soni's user avatar

In PHP, global variables must be declared global inside a function if they are going to be used in that function.

function myTest()
{
    $y = 10; // Local scope
    global $x;
    .....
}

By declaring $x global within the function, it will refer to the global version of the variable.

Peter Mortensen's user avatar

answered Dec 5, 2013 at 5:03

Linga's user avatar

LingaLinga

10.3k10 gold badges52 silver badges104 bronze badges

You have to learn the scope of a variable in PHP. See Variable scope.

In your code, $x is a global one, so in order to access that variable inside the function use global $x; at the beginning of the function, that is,

function myTest()
{
    global $x;
    $y = 10; // Local scope

    echo "<p>Test variables inside the function:<p>";
    echo "Variable x is: $x";
    echo "<br>";
    echo "Variable y is: $y";
}

For $y, either you skip that output by checking isset($y) or else assign a default value at the global scope.

Peter Mortensen's user avatar

answered Dec 5, 2013 at 5:04

gvgvgvijayan's user avatar

gvgvgvijayangvgvgvijayan

1,83118 silver badges34 bronze badges

put $x outside the»» in code like echo» Variable $x is:».$x;

answered Sep 4, 2021 at 10:08

PRAKHAR MISHRA's user avatar

7 ответов

Первая ошибка ($x — undefined) заключается в том, что по умолчанию глобальные переменные не импортируются в функции (в отличие от «суперглабильных» ).

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

function myTest()
{
  global $x; // $x refers to the global variable

  $y=10; // local scope
  echo "<p>Test variables inside the function:<p>";
  echo "Variable x is: $x";
  echo "<br>";
  echo "Variable y is: $y";
}

В противном случае PHP не может определить, скрываете ли вы глобальную переменную с локальной переменной с тем же именем.

Вторая ошибка ($y равна undefined), потому что локальная область — это просто локальная. Все дело в том, что $y не «течет» из функции. Конечно, вы не можете получить доступ к $y позже в своем коде, вне функции, в которой он определен. Если бы вы могли, это ничем не отличалось бы от глобального.

meagar
05 дек. 2013, в 05:03

Поделиться

установить $x как глобальное, например

global $x;

или попробуйте это

<?php
$x=5; // global scope

function myTest($x)
{
$y=10; // local scope 
echo "<p>Test variables inside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
}

myTest($x);

echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x"; 
echo "<br>";
echo "Variable y is: $y";
?>

himanshu bhardiya
05 дек. 2013, в 06:49

Поделиться

Есть 2 случая использования переменной глобально:

  • Использование единственной копии этой переменной и ее изменение из любого места, то есть модификация из функции или снаружи, то есть в глобальной области. В этом случае вам нужно объявление в разрешенном наборе функций в форме global $x;.
  • Если вам нужны локальные переменные для отдельных функций с одинаковым идентификатором, используемым для глобальной переменной (то есть переменными вне всех функций); в этом случае у вас есть две переменные с тем же именем, то есть одна локальная и одна глобальная для этой функции. Затем вам нужно использовать переменную суперглобальная $GLOBALS, т.е. Массив всех глобальных переменных. Я лично предпочитаю этот подход для создания эффективного кода;

Ниже приведен код для двух

code1 (с использованием глобальной декларации)

<?php
$x=5; // global scope

function myTest()
{
$y=10; // local scope
global $x;
echo "<p>Test variables inside the function:<p>";
echo "Variable x in global scope is: $x";
echo "<br>";
echo "Variable y is: $y";
}

myTest();

echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>

code2 (используя массив $GLOBALS [])

<?php
$x=5; // global scope

function myTest()
{
$y=10; // local scope
$x=23;
echo "<p>Test variables inside the function:<p>";
echo "Variable x in global scope is: ".$GLOBALS['x'];
echo "<br>Variable x in local scope is: $x";
echo "<br>";
echo "Variable y is: $y";
}

myTest();

echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>

Для ССЫЛКА

Rajesh Paul
05 дек. 2013, в 06:28

Поделиться

Код работает как ожидалось, но если вы хотите использовать обе переменные в script, используйте этот

<?php
$x=5; // global scope

function myTest(){
    global $x;
    global $y;
    $y=10;
    echo "<p>Test variables inside the function:<p>";
    echo "Variable x is: $x";
    echo "<br>";
    echo "Variable y is: $y";
}
myTest();

echo "<p>Test variables outside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
?>

Vipin Soni
05 дек. 2013, в 06:23

Поделиться

<?php
$a = 1; /* global scope */ 

function test()
{ 
    echo $a; /* reference to local scope variable */ 
} 

test();
?>

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

Пример # 1 Использование глобальной

<?php
$a = 1;
$b = 2;

function Sum()
{
    global $a, $b; //if you want to access global variable if you have to use global keyword

    $b = $a + $b;
} 

Sum();
echo $b;
?>

И последняя ошибка, которую вы получаете, поскольку $y определена внутри функции mytest(), поэтому ее область действия будет ограничена только этой функцией.

Подробнее см. здесь http://php.net/manual/en/language.variables.scope.php

R R
05 дек. 2013, в 05:45

Поделиться

В PHP глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.

function myTest()
{
$y=10; // local scope
global $x;
.....
}

Объявив, что глобальная переменная $x внутри функции будет ссылаться на глобальную версию переменной

Lingasamy Sakthivel
05 дек. 2013, в 06:33

Поделиться

вам нужно изучить область действия переменной в php

http://php.net/manual/en/language.variables.scope.php

В вашем коде $x является глобальным, поэтому для доступа к этой переменной внутри функции используется
глобальный $x; в начале функции

function myTest()
{
    global $x;
    $y=10; // local scope
echo "<p>Test variables inside the function:<p>";
echo "Variable x is: $x";
echo "<br>";
echo "Variable y is: $y";
}

для $y либо вы пропустите этот вывод, проверив isset ($ y), либо назначьте значение по умолчанию в глобальной области

gvgvgvijayan
05 дек. 2013, в 05:07

Поделиться

Ещё вопросы

  • 1Линия между двумя перетаскиваемыми точками на холсте matplotlib pyqt5
  • 0получить указатель даты для отображения текущей даты по умолчанию
  • 0$ _GET удаляет некоторые символы (+) и ломает мой ключ шифрования
  • 1Springdata: mongodb находит запрос с необязательными «критериями»
  • 1Основы математики на Java
  • 1Angular2 Проверка ввода с помощью регулярных выражений
  • 0Angularjs отображать HTML в специальных символах
  • 0Cron Job PHP Foreach отправляет только одну электронную почту / запускает одну строку
  • 0кодировка символов для смешанных данных
  • 0Codeigniter возвращает false из моделей
  • 1Растровое изображение из смещения байтового массива
  • 1Декомпрессия ZLib
  • 1Как мой usercript может работать до запуска inline-javascript?
  • 0как связать область / модель с угловым интерфейсом $ modal.popup ()
  • 0MySQL UPDATE запрос не работает с PHP
  • 0Передача const char * в foo (char *)
  • 1Вставить фигуру SVG в подсказке d3tip
  • 0неразрешенный внешний символ public __thiscall только в режиме отладки
  • 1Java Lexical Analyzer
  • 0Странное поведение Angular 1.3 при копировании элемента в NG-повтор
  • 1Как заставить панды рассматривать каждую строку как столбец на основе определенной переменной даты? [Дубликат]
  • 1Как справиться с игровым потоком?
  • 1как создать делегата на целевой класс
  • 1Как сохранить несколько URL-адресов в виде файла на StartURL в Scrapy — Python?
  • 0Для цикла условие является переменной без сравнения
  • 0Создание zip-файла, содержащего файлы с кодовым именем UTF-8 в PHP, с использованием / usr / bin / zip
  • 0Как обновить набор указателей с ++?
  • 0Как использовать .bind (), чтобы связать значение этого?
  • 0Как я могу проверить функцию синхронизации в C ++
  • 0Конвертировать простые коды в HTML-стили
  • 0щелкните элемент, не затрагивая другие элементы с такой же структурой
  • 1Загрузка PDF с Dropbox на телефон с заданного URI в Base64 дает сломанный нечитаемый PDF
  • 1LINQ Выберите заявление. Анонимный метод возвращает исключение
  • 1Создайте ссылку на раскадровку в рабочем элементе TFS программно
  • 0Частицы AngularJS в Jade с использованием логических атрибутов
  • 0Причудливая шкатулка с URL
  • 1Обновить формат нескольких ячеек с помощью запроса API updateCells
  • 0Qt QML MenuBar и меню не отображаются
  • 1Откройте приложение Python CEF на дополнительном мониторе
  • 0COM-функция возвращает E_POINTER
  • 1org.hibernate.id.IdentifierGenerationException: при сохранении данных в сопоставлении один в один
  • 0Получить только строки, где встречаются все необходимые типы
  • 0Сортировка столбцов таблицы в AngularJS
  • 0Как сделать ссылку кликабельной или не кликабельной по тексту в текстовой области?
  • 1Избегайте добавления нулевых объектов POJO в анализируемый массив из ответа на модификацию
  • 0Как я могу читать не символы, такие как арабские слова в PHP
  • 0Как я могу сказать Visual Studio, чтобы связать библиотеку с моим проектом?
  • 0Изменить вкладку отзывов на тему ультимо
  • 1ImportError: нет модуля с именем pywinauto
  • 0C ++ лучший способ хранить массивы или векторы объектов на диске для простой базы данных

Перейду сразу к делу, функция должна обратиться к переменной $markup, и прочесть её значение:

function do_the_price()
{
global $markup;
echo " наценка: ".$markup;
}
$markup = 1000;
do_the_price();

В онлайн-песочнице всё работает, у меня на сайте — нет. Пробовал и выводить $GLOBALS[‘markup’], тоже не работает, ни чтение ни изменение переменной.
Что может мешать функции обращаться к переменной?


  • Вопрос задан

    более трёх лет назад

  • 2032 просмотра

Пригласить эксперта

Все правильно делает, нефиг глобалами пользоваться.

А вообще, вероятно есть различие в различие в версиях PHP и/или конфигурации. Проверьте.

Какая версия PHP на сайте?
Попробуй так:

$markup = 1000;
function do_the_price()
{
    global $markup;
    echo " наценка: ".$markup;
}
do_the_price();

И последнее: не используй глобальные переменные.


  • Показать ещё
    Загружается…

08 июн. 2023, в 12:24

1500 руб./в час

12 июн. 2023, в 12:01

40000 руб./за проект

12 июн. 2023, в 11:16

5000 руб./за проект

Минуточку внимания

Здесь следует отметить, что представленный вами элемент кода следует рассматривать, как плохой стиль проектирования и программирования, поскольку он рассматривает подключаемый файл как моментально выполняемый набор операций.

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

Так в чем проблема-то?

Все предельно просто, вы делаете include внутри метода method, а значит переменные указанные в подключаемом файле инициализируются в области видимости метода method. Следовательно, переменная $lang не является глобальной, а ограничена видимостью метода, а вы обращаетесь к глобальной переменной, поэтому при использовании модификатора global она будет равна null.

Если делать include в глобальной области видимости, тогда переменная lang станет общедоступной (global) и ее использование станет возможным. Это легко проверить, достаточно в подключаемом файле перед началом определения какой-либо переменной написать global $переменная.

Пример:

include 'file1.php';

function include2() {
  include 'file2.php';
}
  • file1.php определен в глобальной области видимости.
  • file2.php определен в локальной области видимости функции include2.

Подход с глобальными переменными и таким include — это костыль, который принесет вам проблем в будущем. Функции должны быть определены явно, иметь уникальное имя и выполняться по требованию.

А почему подход с глобальными переменными плохой?

Дело в том, что глобальные переменные видимы отовсюду, глобально. Это удобно: ведь нет никаких ограничителей. С другой стороны, становится совершенно невозможно отследить, кто меняет данные. Неконтролируемые изменения — это первое, что обычно приходит в голову на вопрос о том, чем же плохи глобальные переменные.

Предположим, у вас есть функция, результат которой зависит от глобальной переменной. Вы вызываете её, вызываете — но через 10 минут функция начинает возвращать неверные результаты. Что случилось? Ведь на вход вы передаёте ей всё тот же набор параметров? Гм, кто-то поменял значение глобальной переменной… Кто это мог быть? Да кто угодно — ведь глобальная переменная доступна всем..

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

Не используйте глобальные переменные в проекте без необходимости, пользуйтесь всеми возможностями локальной области видимости, передачи параметров в аргументы функции и код будет легче писать, поддерживать и тестировать.


Знаете какой наилучший префикс для глобальных переменных?

Ответ: //

Понравилась статья? Поделить с друзьями:
  • Php выводить все ошибки и предупреждения
  • Php вывод ошибок только в файл
  • Php вывод ошибок ошибка 500
  • Php вывод ошибок в форме
  • Peugeot 407 как сбросить ошибки