Обработка ошибок с помощью 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?
asked Dec 5, 2013 at 4:59
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♦user229044
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.
answered Dec 5, 2013 at 5:01
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";
?>
answered Dec 5, 2013 at 5:03
There are two cases of using a variable globally:
- 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;
. - 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.
answered Dec 5, 2013 at 5:09
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";
?>
answered Dec 5, 2013 at 5:14
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.
answered Dec 5, 2013 at 5:03
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.
answered Dec 5, 2013 at 5:04
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
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 минут функция начинает возвращать неверные результаты. Что случилось? Ведь на вход вы передаёте ей всё тот же набор параметров? Гм, кто-то поменял значение глобальной переменной… Кто это мог быть? Да кто угодно — ведь глобальная переменная доступна всем..
Лучший рецепт при проектировании подпрограмм: сделать так, чтобы результат вашей функции зависел бы только от аргументов. Это идеал, к которому нужно стремиться.
Не используйте глобальные переменные в проекте без необходимости, пользуйтесь всеми возможностями локальной области видимости, передачи параметров в аргументы функции и код будет легче писать, поддерживать и тестировать.
Знаете какой наилучший префикс для глобальных переменных?
Ответ: //