Php вывести имя переменной. PHP: Переменные


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


В PHP имя переменной всегда начинается со знака доллара ($), за которым обязательно должна следовать буква, после которой можно использовать буквы, цифры и знак подчёркивания. Имена чувствительны к регистру символов, т.е. переменные $value, $Value, $VALUE и $VaLuE - четыре РАЗНЫХ переменных, хотя их имя и читается одинаково.

Примеры синтаксически правильных имён переменных:

Пример некорректных имён:

Есть одно общее правило (для всех языков программирования), касающееся именования переменных. Правило очень простое: имена всегда должны быть осмысленными.

Пример плохо читаемого кода

Краткость, конечно, сетстра таланта, но жертвовать простотой восприятия кода ради его компактности - неразумно. Тем более, что длина имени никак не влияет на производительнось скрипта. Но не стоит и впадать в противоположную крайность - давать переменным слишком длинные имена. Если имя должно состоять из двух и более слов - части имени нужно выделять заглавными буквами или разделять подчёркиваниями. Например, имя $strusernameadndomain намного лучше воспринимается в виде $str_UserNameAndDomain .

Пример хорошо читаемого кода

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

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

Рассмотрим пример:

Передача переменных по значению

Для работы с переменными есть в PHP особые функции:

  • isset() - проверяет, была ли объявлена переменная и отличается ли её значение от NULL;
  • empty() - аналог isset()
  • unset() - встроенная функция языка, удаляющая значение переменной и удаляющая саму переменную из списка доступных переменных (уничтожающая переменную).

Область видимости переменных

Очень важная характеристика переменной - её область видимости (область действия), т.е. описание того, из каких мест программы (скрипта) можно прочитать или изменить её значение. Следует всегда помнить, что переменная, объявленная внутри блока программы, видна только в пределах этого блока, а для того, чтобы обратиться к переменной, объявленной снаружи блока, необходимо её особым образом объявить.

Блоками программы в данном случае являются "скрипт", "функция" или "класс". Например:

Вроде бы всё правильно, но - не работает. Почему? Потому что если явно не сказать, что переменная $name внутри функции - это в действительности глобальная переменная $name, то интерпретатор создать временную копию переменной с именем $name и пустым значением. А так как значение пустое (неопределённое), то и результат сложения строк будет неопределён (пуст).

Исправить положение очень легко, достаточно добавить всего одну строку (выделена жирным шрифтом):

global $name; // явно указываем, что надо // использовать глобальную переменную. $fullName = $name . $family; echo "Имя внутри функции: ".$fullName; } echo "Имя ДО вызова функции: ".$name; // результат: "Имя ДО вызова функции: Вася" tryChengeName(" Иванов"); // результат: "Имя внутри функции: Вася Иванов" echo "Имя ПОСЛЕ вызова функции: ".$name; // результат: "Имя ПОСЛЕ вызова функции: Вася Иванов" ?>

В данном примере переменная $name имеет область видимости, равную всему скрипту, а переменная $fullName, объявленная внутри функции, имеет область определения равную этой самой функции. Это значит, при выходе их функции переменная $fullName будет уничтожена, а все попытки прочитать её значение приведут к ошибке.

Примеры работы с классами мы рассмотрим в разделе "Классы и наследование".

Переменные переменные

Да-да, здесь нет ошибки, именно так (двумя словами) называются некоторые переменные в PHP. Смысл в том, что текстовая часть имени переменной (т.е. имя без знака доллара) может сама быть именем. Например:

Настоятельно не рекомендуется пользоваться подобными приёмами без острой необходимости. Код, напичканый такими трюками, очень сложно сопровождать. Особенно это важно при работе с данными, вводимыми пользователями. Главная причина сложностей - неявные зависимости. Например, что случится, если вместо имени "Вася" написать что-то вроде """""_;%//^q"" ? Правильно! Скрипт в большинстве случаев не сможет выполниться! Можно, конечно, добавить кучу проверок на наличие "неправильных" символов, но проще вообще не пользоваться такими трюками.

Константы

Константа - это некая неизменная величина. Константа объявляется одновременно с именем и значением. Для объявления константы служит функция define() , а для определения наличия константы (т.е. была она определена или нет) - функция defined() . Имя константы строится по тем же правилам, что и имена переменных.

Примеры констант:

Отдельный вид констант PHP - так называемые "магические константы". Это системные константы, значение которых определяет и устанавливает интерпретатор. Таких констант немного:

  • __LINE__ Содержит номер текущей строки в текущем файле.
  • __FILE__ Содержит полное имя текущего файла
  • __FUNCTION__ Содержит имя текущей функции.
  • __CLASS__ Содержит имя текущего класса.
  • __METHOD__ Содержит имя текущего метода текущего класса.

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

Переменные в PHP представлены знаком доллара с последующим именем переменной. Имя переменной чувствительно к регистру.

Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчеркивания и состоять из букв, цифр и символов подчеркивания в любом количестве. Это можно отобразить регулярным выражением: ^*$

Замечание : Под буквами здесь подразумеваются символы a-z, A-Z и байты от 128 до 255 (0x80-0xff ).

Замечание : $this - это специальная переменная, которой нельзя ничего присваивать.

Для информации о функциях работы с переменными обращайтесь к разделу функций работы с переменными .

$var = "Боб" ;
$Var = "Джо" ;
echo " $var , $Var " ; // выведет "Боб, Джо"

$ 4site = "еще нет" ; // неверно; начинается с цифры
$_4site = "еще нет" ; // верно; начинается с символа подчеркивания
$täyte = "mansikka" ; // верно; "ä" это (Расширенный) ASCII 228.
?>

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

PHP также предлагает иной способ присвоения значений переменным: присвоение по ссылке . Это означает, что новая переменная просто ссылается (иначе говоря, "становится псевдонимом" или "указывает") на оригинальную переменную. Изменения в новой переменной отражаются на оригинале, и наоборот.

$foo = "Боб" ; // Присваивает $foo значение "Боб"
$bar = & $foo ; // Ссылка на $foo через $bar.
$bar = "Меня зовут $bar " ; // Изменение $bar...
echo $bar ;
echo $foo ; // меняет и $foo.
?>

$foo = 25 ;
$bar = & $foo ; // Это верное присвоение.
$bar = &(24 * 7 ); // Неверно; ссылка на неименованное выражение.

Function test ()
{
return 25 ;
}

$bar = & test (); // Неверно.
?>

Хорошей практикой считается инициализировать переменные, хотя в PHP это и не является обязательным требованием. Неинициализированные переменные принимают значение по умолчанию в зависимости от их типа, который определяется из контекста их первого использования: булевы принимают значение FALSE , целые числа и числа с плавающей точкой - ноль, строки (например, при использовании в echo ) - пустую строку, а массивы становятся пустыми массивами.

Пример #1 Значения по умолчанию в неинициализированных переменных

// Неустановленная И не имеющая ссылок (то есть без контекста использования) переменная; выведет NULL
var_dump ($unset_var );

// Булевое применение; выведет "false" (Подробнее по этому синтаксису смотрите раздел о тернарном операторе)
echo($unset_bool ? "true\n" : "false\n" );

// Строковое использование; выведет "string(3) "abc""
$unset_str .= "abc" ;
var_dump ($unset_str );

// Целочисленное использование; выведет "int(25)"
$unset_int += 25 ; // 0 + 25 => 25
var_dump ($unset_int );

// Использование в качестве числа с плавающей точкой (float/double); выведет "float(1.25)"
$unset_float += 1.25 ;
var_dump ($unset_float );

// Использование в качестве массива; выведет array(1) { => string(3) "def" }
$unset_arr [ 3 ] = "def" ; // array() + array(3 => "def") => array(3 => "def")
var_dump ($unset_arr );

// Использование в качестве объекта; создает новый объект stdClass (см. http://www..classes.php)
// Выведет: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$unset_obj -> foo = "bar" ;
var_dump ($unset_obj );
?>

Полагаться на значения по умолчанию неинициализированных переменных довольно проблематично при включении файла в другой файл, использующий переменную с таким же именем. Это также большой риск в системе безопасности при включенной опции register_globals . В случае работы с неинициализированной переменной вызывается ошибка уровня E_NOTICE , за исключением случая добавления элементов в неинициализированный массив. Для обнаружения инициализации переменной может быть использована языковая конструкция isset() .

8 years ago

This page should include a note on variable lifecycle:

Before a variable is used, it has no existence. It is unset. It is possible to check if a variable doesn"t exist by using isset(). This returns true provided the variable exists and isn"t set to null. With the exception of null, the value a variable holds plays no part in determining whether a variable is set.

Setting an existing variable to null is a way of unsetting a variable. Another way is variables may be destroyed by using the unset() construct.

print isset($a ); // $a is not set. Prints false. (Or more accurately prints "".)
$b = 0 ; // isset($b) returns true (or more accurately "1")
$c = array(); // isset($c) returns true
$b = null ; // Now isset($b) returns false;
unset($c ); // Now isset($c) returns false;
?>

is_null() is an equivalent test to checking that isset() is false.

The first time that a variable is used in a scope, it"s automatically created. After this isset is true. At the point at which it is created it also receives a type according to the context.

$a_bool = true ; // a boolean
$a_str = "foo" ; // a string
?>

If it is used without having been given a value then it is uninitalized and it receives the default value for the type. The default values are the _empty_ values. E.g Booleans default to FALSE, integers and floats default to zero, strings to the empty string "", arrays to the empty array.

A variable can be tested for emptiness using empty();

$a = 0 ; //This isset, but is empty
?>

Unset variables are also empty.

empty($vessel ); // returns true. Also $vessel is unset.
?>

Everything above applies to array elements too.

$item = array();
//Now isset($item) returns true. But isset($item["unicorn"]) is false.
//empty($item) is true, and so is empty($item["unicorn"]

$item [ "unicorn" ] = "" ;
//Now isset($item["unicorn"]) is true. And empty($item) is false.
//But empty($item["unicorn"]) is still true;

$item [ "unicorn" ] = "Pink unicorn" ;
//isset($item["unicorn"]) is still true. And empty($item) is still false.
//But now empty($item["unicorn"]) is false;
?>

For arrays, this is important because accessing a non-existent array item can trigger errors; you may want to test arrays and array items for existence with isset before using them.

7 years ago

"Note: $this is a special variable that can"t be assigned."

While the PHP runtime generates an error if you directly assign $this in code, it doesn"t for $$name when name is "this".

$this = "text" ; // error

$name = "this" ;
$ $name = "text" ; // sets $this to "text"

?>

2 years ago

I highly recommend to use an editor that can list all variable names in a separate window.

The reason are typing errors in variable names.

$somename = "nobody" ;
// Now we want to use $somename somewhere
echo $somemane ;
?>
And wonder why it doesn"t print "nobody".
The reason is simple, we have a typing error in $somename and $somemane is a new variable.

In this example it might be easy to find. But if you use variables to calculate some things, you might hardly find it and ask yourself why your calculation is always wrong.
With an editor that list all variable names in a separate window such "double" variables but with wrong typing can be easily found.

BTW:
It would have been better, if the PHP language would require to use some sort of keyword to define a variable the first time.

Переменные в php - это некий информационный контейнер, который может содержать в себе различные типы данных (текст, цифры, массивы и так далее). В целом переменные позволяют создавать, хранить, изменять, а в дальнейшем оперативно обращаться к информации, заданной в них.

Как создать переменную в PHP

Вначале переменные содержат знак $ (доллар) - обозначение использования переменной, потом буквы латинского алфавита (от a до z и маленькие и большие), в конце могу содержать цифры . Также в названии допускается использование нижнего подчёркивания (не в конце).

Как можно называть переменные:

$var
$variable
$year1945
$_variable
Как нельзя называть переменные:

$1 - состоит только из цифры
$1var - нельзя начинать название переменной с цифры
$/var - из дополнительных символов допускается только нижнее подчёркивание _
$переменная - кириллица разрешена документацией php, но не рекомендуема
$var iable - нельзя использовать пробелы

Каждой переменной присваивается значение. Для присвоения значения используется знак = (равно). В течение обработки скрипта значение переменной может неоднократно меняться в зависимости от разных условий.

$city = "Москва"; // переменной $city присвоили строковое (в кавычках) значение Москва
$year = 1147; // а переменной $year присвоили числовое значение 1147
?>

$name = "Александр";
$Name = "Алексей";
echo "$name, $Name"; // выведет "Александр, Алексей"
?>

Вывод переменных PHP

Отдельно следует разобрать то, как отобразить переменные при помощи операторов вывода , работу которых мы разобрали в прошлом уроке Создание странцы PHP. Операторы вывода. . Ниже приведу ряд наглядных примеров с комментариями.

// Так задаём значения переменным
$name1 = "Алексей";
$name2 = "Александр";

// Выводим переменные
echo $name2; // Выведет: Александр
echo "name1 - это $name1"; // name1 - это Алексей

// При использовании одиночных кавычек выводится
// имя переменной, а не значение
echo "name1 - это $name1"; // выведет: name1 - это $name1

// можно вывести просто значения переменных
echo $name1; // Алексей
echo $name1,$name2; // АлексейАлександр
echo $name1." ".$name2; // Алексей Александр
echo "$name1, $name2"; // Алексей, Александр

Echo << Здесь используется синтаксис "here document" для вывода
нескольких строк с подстановкой переменных $variable.
END;

Операции с переменными PHP

Арифметические операции в PHP
В случае с числовыми значениями можно проводить арифметические операции: сложение, вычитание, умножение и так далее.

-$a (отрицание) Смена знака $a.
$a + $b (сложение) Сумма $a и $b.
$a - $b (вычитание) Разность $a и $b.
$a * $b (умножение) Произведение $a и $b.
$a / $b (деление) Частное от деления $a на $b.
$a % $b (деление по модулю) Целочисленный остаток от деления $a на $b.
Рассмотрим примеры

$a = 2; // заметьте, в случае с цифрами кавычки не ставятся
$b = 3; // заметьте, в случае с цифрами кавычки не ставятся

$result = $a + $b; // складываем переменные
echo $result; // выведет 5

$result = $b - $a; // складываем переменные
echo $result; // выведет 1

Операции инкремента и декремента в PHP
Данные операции пригодятся в основном при построении циклов, о которых поговорим чуть позже.
Префиксный - операторы, прописанные ПЕРЕД переменной (--$a ; ++$a ). Возвращают значение переменной до изменений.
Постфиксный - операторы, прописываемые после переменной ($a-- ; $a-- ). Возвращают значение переменной с изменениями.
Инкремент - увеличения значения.
Декремент - уменьшение значения.

++$a Префиксный инкремент. Увеличивает $a на единицу и возвращает значение $a.
$a++ Постфиксный инкремент. Возвращает значение $a, а затем увеличивает $a на единицу.
--$a Префиксный декремент. Уменьшает $a на единицу и возвращает значение $a.
$a-- Постфиксный декремент. Возвращает значение $a, а затем уменьшает $a на единицу.
echo "

Постфиксный инкремент

";
$a = 5;
echo "Должно быть 5: " . $a++ . "\n";

Echo "

Префиксный инкремент

";
$a = 5;
echo "Должно быть 6: " . ++$a . "\n";
echo "Должно быть 6: " . $a . "\n";

Echo "

Постфиксный декремент

";
$a = 5;
echo "Должно быть 5: " . $a-- . "\n";

Echo "

Префиксный декремент

";
$a = 5;
echo "Должно быть 4: " . --$a . "\n";
echo "Должно быть 4: " . $a . "\n";
?>

Операции присвоения в PHP
Базовый оператор выглядит как = . На первый взгляд может показаться, что это оператор равно. На самом деле это не так. В действительности, оператор присвоения означает, что левый операнд получает значение правого выражения, (т.е. устанавливается результирующим значением). Комбинированные операторы - это такие операторы, которые позволяют использовать предыдущие значения переменных для последующих операций (дописывать в строковую переменную (с текстом) или складывать числовые значения).

$a = ($b = 2) + 4; // результат: $a установлена значением 6, переменной $b присвоено 2.

$a = 2;
$a += 3; // устанавливает $a значением 5, аналогично записи: $a = $a + 3;
$b = "Привет ";
$b .= "Мир!"; // устанавливает $b строкой "Привет Мир!", как и $b = $b . "There!";

Существуют также операции сравнения и логические , но о них мы поговорим в следующих уроках. Постараюсь сразу не пугать Вас большим объёмом информации!)

1.3K

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

PHP глобальные переменные можно рассматривать как место в памяти компьютера, где должны храниться данные. При объявлении переменной ей присваивается имя, которое может использоваться, чтобы ссылаться на нее в других местах программного кода. К значению переменной можно получить доступ, также оно может быть изменено, а тип переменной можно поменять, ссылаясь на ее имя.

Присвоение имени и создание переменной в PHP

Все имена переменных PHP должны быть снабжены префиксом $ . Он информирует препроцессор языка, что он имеет дело с переменной. Первый символ имени должен быть буквой или символом подчеркивания (_) . Остальные символы могут быть только буквами, цифрами или символами подчеркивания. Все остальные символы считаются недействительными для использования в имени переменной.

Посмотрим на некоторые допустимые и недопустимые имена переменных PHP :

$_myName // допустимо. $myName // допустимо. $__myvar // допустимо. $myVar21 // допустимо. $_1Big // недопустимо, подчеркивание должно следовать после буквы. $1Big // недопустимо - должно начинаться с буквы или символа подчеркивания. $_er-t // недопустимо - содержит буквенно-цифровой символ (-).

Имена PHP переменных чувствительны к регистру. Это означает, что PHP считает переменную $ _myVariable отличной от переменной » $ _myvariable .

Присвоение значения переменной РНР

Переменные инициализируются значениями с помощью оператора присваивания PHP (=) . Чтобы присвоить значение переменной, ее имя помещается слева от выражения, за которым следует оператор присваивания. Значение, которое присваивается после PHP объявления переменных, помещается справа от оператора присваивания. Строка, как и во всех выражениях PHP кода , завершается точкой с запятой (;) .

Начнем с присвоения слова «Круг » переменной с именем myShape :

$myShape = "Круг";

Мы объявили переменную с именем myShape и присвоили ей строковое значение «Круг «. Аналогичным образом можно объявить переменную, содержащую численное значение:

$numberOfShapes = 6;

Мы создаем переменную numberOfShapes и присваиваем ей числовое значение 6 . После того, как PHP переменная была создана, присвоенное ей значение может быть изменено с помощью оператора присваивания:

Доступ к PHP значениям переменных

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

Это приведет к следующему выводу в браузере:

Номер фигуры 6.

Точно так же можно отобразить значение переменной myShape :

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

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

Круг это 6-я фигура.

К сожалению, PHP будет видеть th на конце имени переменной $ numberOfShapes как часть имени. Затем он попытается вывести значение переменной $ numberOfShapesth , которой не существует. Это приводит к тому, что значение этой переменной не отображается:

Круг это фигура.

Можно обойти эту проблему, поставив фигурные скобки ({ }) вокруг имени переменной, чтобы экранировать ее от других символов:

Что дает нам желаемый результат:

Круг это 6-я фигура.

Изменение типа РНР переменной

PHP типы переменных: целое, вещественное, логическое, массив, объект и строка. Для начала рассмотрим изменение типа переменной после ее создания.

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

Слабо типизированные языки, такие как PHP и JavaScript , позволяют изменять тип переменной в любой момент существования переменной путем присвоения ей значения другого типа. Например, можно создать переменную, присвоить ей целое значение, а позже поменять на string .

12 years ago

A little gotcha to watch out for:

If you turn off RegisterGlobals and related, then use get_defined_vars(), you may see something like the following:

Array
[ GLOBALS ] => Array
[ GLOBALS ] => Array
* RECURSION *
[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()
)

[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()

)
?>

Notice that $_SERVER isn"t there. It seems that php only loads the superglobal $_SERVER if it is used somewhere. You could do this:

print "

"
.
htmlspecialchars
(print_r
(get_defined_vars
(),
true
)) .
"
" ;
print "
"
.
htmlspecialchars
(print_r
($_SERVER
,
true
)) .
"
" ;
?>

And then $_SERVER will appear in both lists. I guess it"s not really a gotcha, because nothing bad will happen either way, but it"s an interesting curiosity nonetheless.

6 years ago

Since get_defined_vars() only gets the variables at the point you call the function, there is a simple way to get the variables defined within the current scope.

// The very top of your php script
$vars = get_defined_vars ();

// Now do your stuff
$foo = "foo" ;
$bar = "bar" ;

// Get all the variables defined in current scope
$vars = array_diff (get_defined_vars (), $vars );

echo "

"
;
print_r ($vars );
echo "
" ;
?>

15 years ago

Here is a function which generates a debug report for display or email
using get_defined_vars. Great for getting a detailed snapshot without
relying on user input.

function generateDebugReport ($method , $defined_vars , $email = "undefined" ){
// Function to create a debug report to display or email.
// Usage: generateDebugReport(method,get_defined_vars(),email);
// Where method is "browser" or "email".

// Create an ignore list for keys returned by "get_defined_vars".
// For example, HTTP_POST_VARS, HTTP_GET_VARS and others are
// redundant (same as _POST, _GET)
// Also include vars you want ignored for security reasons - i.e. PHPSESSID.
$ignorelist =array("HTTP_POST_VARS" , "HTTP_GET_VARS" ,
"HTTP_COOKIE_VARS" , "HTTP_SERVER_VARS" ,
"HTTP_ENV_VARS" , "HTTP_SESSION_VARS" ,
"_ENV" , "PHPSESSID" , "SESS_DBUSER" ,
"SESS_DBPASS" , "HTTP_COOKIE" );

$timestamp = date ("m/d/y h:m:s" );
$message = "Debug report created $timestamp \n" ;

// Get the last SQL error for good measure, where $link is the resource identifier
// for mysql_connect. Comment out or modify for your database or abstraction setup.
global $link ;
$sql_error = mysql_error ($link );
if($sql_error ){
$message .= "\nMysql Messages:\n" . mysql_error ($link );
}
// End MySQL

// Could use a recursive function here. You get the idea ;-)
foreach($defined_vars as $key => $val ){
if(is_array ($val ) && ! in_array ($key , $ignorelist ) && count ($val ) > 0 ){
$message .= "\n $key array (key=value):\n" ;
foreach($val as $subkey => $subval ){
if(! in_array ($subkey , $ignorelist ) && ! is_array ($subval )){
$message .= $subkey . " = " . $subval . "\n" ;
}
elseif(! in_array ($subkey , $ignorelist ) && is_array ($subval )){
foreach($subval as $subsubkey => $subsubval ){
if(! in_array ($subsubkey , $ignorelist )){
$message .= $subsubkey . " = " . $subsubval . "\n" ;
}
}
}
}
}
elseif(!
is_array ($val ) && ! in_array ($key , $ignorelist ) && $val ){
$message .= "\nVariable " . $key . " = " . $val . "\n" ;
}
}

If($method == "browser" ){
echo nl2br ($message );
}
elseif($method == "email" ){
if($email == "undefined" ){
$email = $_SERVER [ "SERVER_ADMIN" ];
}

$mresult = mail ($email , "Debug Report for " . $_ENV [ "HOSTNAME" ]. "" , $message );
if($mresult == 1 ){
echo "Debug Report sent successfully.\n" ;
}
else{
echo "Failed to send Debug Report.\n" ;
}
}
}
?>

17 years ago

Simple routine to convert a get_defined_vars object to XML.

function obj2xml ($v , $indent = "" ) {
while (list($key , $val ) = each ($v )) {
if ($key == "__attr" ) continue;
// Check for __attr
if (is_object ($val -> __attr )) {
while (list($key2 , $val2 ) = each ($val -> __attr )) {
$attr .= " $key2 =\" $val2 \"" ;
}
}
else $attr = "" ;
if (is_array ($val ) || is_object ($val )) {
print(" $indent < $key$attr >\n" );
obj2xml ($val , $indent . " " );
print(" $indent \n" );
}
else print(" $indent < $key$attr > $val \n" );
}
}

//Example object
$x -> name -> first = "John" ;
$x -> name -> last = "Smith" ;
$x -> arr [ "Fruit" ] = "Bannana" ;
$x -> arr [ "Veg" ] = "Carrot" ;
$y -> customer = $x ;
$y -> customer -> __attr -> id = "176C4" ;

$z = get_defined_vars ();
obj2xml ($z [ "y" ]);
?>
will output:


John
Smith


Bannana
Carrot

10 years ago

As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

// define a variable
$my_var = "foo" ;

// get our list of defined variables
$defined_vars = get_defined_vars ();

// now try to change the value through the returned array
$defined_vars [ "my_var" ] = "bar" ;

echo $my_var , "\n" ;

?>

will output "foo" (the original value). It"d be nice if get_defined_vars() had an optional argument to make them references, but I imagine its a rather specialized request. You can do it yourself (less conveniently) with something like:

$defined_vars = array();
$var_names = array_keys (get_defined_vars ());

foreach ($var_names as $var_name )
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

1 year ago

I posted here before about "this" being in get_defined_vars.

It turns out it"s not always there but in certain cases it will inexplicably appear.

Php -r "
class Test {
public function a() {var_dump(array_keys(get_defined_vars()));$a = 123;}
public function b() {var_dump(array_keys(get_defined_vars()));$this;}
}
$t = new Test();
$t->a();
$t->b();
"

Array()
array("this")

This does not happen in PHP 7.2 but will happen in PHP 5.6.

1 year ago

Some comments here point out that this function wont return references. It does however return names and names are "references".

I would not recommend the suggestions here that convert it to references.

Public function x($a, $b, $c) {
foreach(array_keys(get_defined_vars()) as $key)
if($key !== "this")
$this->y(${$key});
}

Public function y(&$input) {
$input++;
}

Instead of ${} you can also use $$.

I have done some whacky things in my time to make extremely generic code but I"ve never had to do anything like the above. It might not even work (but should since it"s no different to $a[$key]).

You could also do $$key++ but I"ve never seen code like that which wasn"t horrifically bad (using dynamic where dynamic isn"t beneficial).

If you"re doing something like that then give it additional scrutiny.