Как да покажете стойностите на всички променливи на средата в Windows. Как да покажете стойностите на всички променливи на средата в Windows Отпечатване на стойността на променлива на екрана

Със сигурност имате килер или скрин у дома. Принципът на тяхното използване е прост: поставяме там неща, които не са ни необходими в момента, но може да са необходими след известно време.

Променливите са подредени по абсолютно същия начин. Можете да поставите някаква стойност в тях и да я съхранявате там, докато ви потрябва.

Създаване на променливи

Можете да поставите стойност в променлива като тази:

В кода по-горе създадохме променливата $name и поставихме стойността Ivan в нея, след това създадохме променливата $age и й присвоихме стойност 20.

Името "променлива" означава, че нейната стойност може да се променя по време на изпълнение на скрипта:

В някои езици променливата трябва първо да бъде "декларирана", преди да бъде използвана. В PHP няма декларация - променлива се създава в момента, в който поставите стойност в нея.
PHP програмистите обаче често казват „декларирайте променлива“ вместо „създайте променлива“.

Също така, вместо „поставете стойност в променлива“, често се казва „присвояване на стойност“.
Причината е проста - символът = , благодарение на който съхраняваме стойността в променлива, се нарича "оператор за присвояване". Оттук и терминът "възлагам".

Конвенции за именуване на променливи

1. Името на променливата започва със символа $.

2. Вторият знак може да бъде буква или долна черта _

Имената на променливите са чувствителни към главни и малки букви. $name и $Name са различни променливи.

Показване на стойността на променлива на екрана

Можете да покажете променлива с помощта на вече известната ни команда echo:

Командата echo ви позволява да показвате няколко стойности наведнъж:

Имайте предвид, че предадохме 2 стойности за ехо, разделяйки ги със запетая. Така че можем да предаваме толкова стойности, колкото искаме. Следните два примера ще доведат до същия резултат:

Също така в PHP има съкратен синтаксис за извеждане на променливи. Вместо

Преди PHP 5.4 съкратеният синтаксис работеше само когато директивата short_open_tag беше активирана в настройките на PHP, което също позволява използването на съкратен отварящ таг

Проверка на стойността на променлива

Командата echo не винаги е удобна за проверка на текущата стойност на променлива. Например, ако се опитате да покажете празен низ "", на екрана няма да се покаже абсолютно нищо. И не е ясно каква е причината - в празна променлива или неработещ код.

Следователно функцията var_dump() се използва за проверка на стойността на променлива:

Резултат от изпълнението на скрипта:

String(5) "Вася" string(0) ""

Както можете да видите, PHP извежда не само съдържанието на променливата, но и броя на символите и дори типа на променливата (низ). Ще разгледаме подробно типовете данни в следващите уроци.

Премахване на променливи

Можете да премахнете съществуваща променлива с помощта на функцията unset():

А сега е време да потренирате малко.

Не забравяйте, че почти всеки PHP проблем може да има множество решения. Следователно, ако вашите решения се различават от написаните в този сайт, това изобщо не означава, че сте направили нещо нередно.

Напишете скрипт, който:
1. Създава променливи с имена заглавие и съдържание и някои стойности.
2. Показва стойността на променливата title вътре в тага h1 и стойността на променливата content вътре в тага div.

Покажи решение

", $title, ""; ехо "

", $съдържание, "
"; ?>

Искам още веднъж да ви обърна внимание, че това решение не е единственото правилно. Например следният код ще доведе до същия резултат:

Променливите на средата (среда) в Windows съдържат различна информация за системните настройки и средата на потребителя. Прави се разлика между потребителски, системни и променливи на средата на процеса.

Най-лесният начин да видите съдържанието на променливите на средата в Windows е да отворите системните свойства ( sysdm.cpl) -> Разширени -> Променливи на средата.Както можете да видите, има две секции в отворената секция: горната съдържа променливите на средата на потребителя, долната съдържа системните.

Освен това променливите на средата се съхраняват в системния регистър. Потребителските променливи се съхраняват в . Системни - в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.

Можете да покажете стойностите на всички променливи на средата в командния ред на Windows. Командата е проста:

Командата ще изброи променливите на средата и техните стойности.

В PowerShell, за да покажете всички променливи на средата, можете да използвате командата:

Ако искате да изведете стойността само на една променлива, трябва да използвате командата echo, а името на променливата трябва да бъде оградено в знаци за процент. Например,

ехо %systemroot%

set > c:\tmp\env_var.txt

Променливите на средата на определен процес могат да бъдат получени с помощта на free Помощни програми Process Explorer(от Sysinternals). Просто отворете свойствата на процеса и отидете на раздела Околен свят.

Този урок се фокусира върху обхвата на PHP променливите. Обяснява разликата между локален и глобален обхват, показва как да получите достъп до глобални променливи във функция, как да работите със суперглобални и да създавате статични променливи.

Когато започнете да изучавате PHP и започнете да работите с функции и обекти, обхватът на променливите е малко объркващ. За щастие правилата на PHP в това отношение са много лесни за разбиране (в сравнение с други езици за програмиране).

Какво е обхват?

Обхватът на променливата е контекстът, в който е дефинирана променливата и където тя може да бъде достъпна. PHP има два обхвата на променливи:

  • Глобален- променливите могат да бъдат достъпни навсякъде в скрипта
  • Местен- променливите могат да бъдат достъпни само в рамките на функцията, в която са дефинирани

Променливият обхват и особено локалният обхват значително опростяват управлението на кода. Ако всички променливи бяха глобални, тогава те биха могли да се променят навсякъде в скрипта. Това би довело до хаос и големи скриптове, тъй като много често различни части на скрипта използват променливи с едно и също име. Чрез ограничаване на обхвата до локалния контекст вие дефинирате границите на кода, който има достъп до променливата, което прави кода по-стабилен, модулен и по-лесен за отстраняване на грешки.

Променливите с глобален обхват се наричат ​​глобални променливи, а тези с локален обхват се наричат ​​локални променливи.

Ето пример за това как работят глобалните и локалните променливи.

"; ) sayHello(); echo "Стойност \$globalName: "$globalName"
"; echo "Стойност \$localName: "$localName"
"; ?>

Здравей Хари! $globalName стойност: "Зоя" $localName стойност: ""

В този скрипт сме създали две променливи:

  • $globalName- това е глобаленпроменлива
  • $localName- това е местенпроменлива, която се създава във функцията sayHello().

След като променливата и функцията са създадени, скриптът извиква sayHello() , което отпечатва „Здравей Хари!“ . След това скриптът се опитва да изведе стойностите на двете променливи с помощта на функцията ехо. Ето какво се случва:

  • защото $globalNameе създаден извън функцията, той е достъпен навсякъде в скрипта, така че се показва „Зоя“.
  • $localNameще бъде наличен само във функцията sayHello(). Тъй като ехо изразът е извън функцията, PHP не позволява достъп до локалната променлива. Вместо това PHP приема, че кодът ще създаде нова променлива с име $localName, която по подразбиране ще бъде празен низ. ето защо второто извикване на echo извежда стойността "" за променливата $localName.

Достъп до глобални променливи във функция

За достъп до глобална променлива извън функциятапросто напиши нейното име. Но за достъп до глобална променлива вътре във функция, първо трябва да декларирате променливата като глобална във функцията, като използвате ключовата дума global:

Функция myFunction() (глобална $globalVariable; // Достъп до глобалната променлива $globalVariable)

Ако не го направите, тогава PHP приема, че създавате или използвате локална променлива.

Ето примерен скрипт, който използва глобална променлива във функция:

"; global $globalName; echo "Здравейте $globalName!
"; ) sayHello(); ?>

Когато се изпълни, скриптът ще изведе:

Здравей Хари! Здравей Зоя!

Функцията sayHello() използва ключовата дума global, за да декларира променливата $globalName като глобална. След това тя може да получи достъп до променливата и да изведе нейната стойност („Зоя“).

Какво представляват суперглобалите?

PHP има специален набор от предварително дефинирани глобални масиви, които съдържат различна информация. Такива масиви се наричат суперглобали,тъй като те са достъпни от всяко място в скрипта, включително вътрешното функционално пространство, и не е необходимо да се дефинират с ключовата дума global.

Ето списък на суперглобали, налични в PHP версия 5.3:

  • $GLOBALS - списък на всички глобални променливи в скрипта (с изключение на суперглобалните)
  • $_GET - съдържа списък на всички полета на формуляра, изпратени от браузъра с GET заявка
  • $_POST - съдържа списък на всички полета на формуляра, изпратени от браузъра чрез POST заявка
  • $_COOKIE - съдържа списък с всички бисквитки, изпратени от браузъра
  • $_REQUEST - съдържа всички комбинации ключ/стойност, съдържащи се в масивите $_GET, $_POST, $_COOKIE
  • $_FILES - съдържа списък на всички файлове, изтеглени от браузъра
  • $_SESSION - позволява ви да съхранявате и използвате сесийни променливи за текущия браузър
  • $_SERVER - съдържа информация за сървъра, като името на файла на скрипта, който се изпълнява и IP адреса на браузъра.
  • $_ENV - Съдържа списък с променливи на средата, предадени на PHP, като CGI променливи.
Например, можете да използвате $_GET, за да получите стойностите на променливите, съдържащи се в URL низа на заявката на скрипта, и да ги покажете на страницата:

Ако стартирате горния скрипт с URL http://www.example.com/script.php?yourName=Fred, той ще изведе:

Хей Фред!

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

$GLOBALS superglobal е много удобен за използване, тъй като ви позволява да организирате достъп до глобални променливи във функция, без да е необходимо да използвате ключовата дума global. Например:

"; ) sayHello(); // Показва "Здравей Зоя!" ?>

Статични променливи: те са някъде наоколо

Когато създавате локална променлива във функция, тя съществува само докато функцията работи. Когато функцията приключи, локалната променлива изчезва. Когато функцията бъде извикана отново, се създава нова локална променлива.

В повечето случаи това работи чудесно. По този начин функциите са самодостатъчни и винаги работят по един и същи начин при всяко извикване.

Въпреки това, има ситуации, в които би било удобно да се създаде локална променлива, която "помни" стойността си между извикванията на функцията. Такава променлива се нарича статична.

За да създадете статична променлива във функция, трябва да използвате ключовата дума static преди името на променливата и не забравяйте да й дадете начална стойност. Например:

Функция myFunction() ( статичен $myVariable = 0; )

Помислете за ситуация, в която е удобно да използвате статична променлива. Да приемем, че създавате функция, която при извикване създава уиджет и отпечатва броя на вече създадените уиджети. Можете да опитате да напишете код като този, като използвате локална променлива:


"; echo createWidget() . " вече създадохме.
"; echo createWidget() . " вече създадохме.>
"; ?>

Но тъй като променливата $numWidgets се създава при всяко извикване на функцията, получаваме следния резултат:

Създаваме някои джаджи... 1 вече създадохме. 1 вече сме създали. 1 вече сме създали.

Но като използваме статична променлива, можем да запазим стойността от едно извикване на функция до следващото:

"; echo createWidget() . " вече създадохме.
"; echo createWidget() . " вече създадохме.
"; echo createWidget() . " >вече създадохме.
"; ?>

Сега скриптът ще даде очаквания резултат:

Създаваме някои джаджи... 1 вече създадохме. 2 вече създадохме. 3 вече създадохме.

Въпреки че статичната променлива запазва стойността си между извикванията на функцията, тя е валидна само докато скриптът работи. След като скриптът завърши своето изпълнение, всички статични променливи се унищожават, както и локалните и глобалните променливи.

Това е всичко! Препращайте често към документацията на PHP.

преди 13 години

Малко нещо, за което да внимавате:

Ако изключите RegisterGlobals и свързаните с тях, след това използвате get_defined_vars(), може да видите нещо като следното:

масив
[ ГЛОБАЛНИ ] => Масив
[ ГЛОБАЛНИ ] => Масив
* РЕКУРСИЯ *
[_POST] => Array()
[_GET] => Array()
[_COOKIE] => Array()
[ _FILES ] => Array()
)

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

)
?>

Забележете, че $_SERVER не е там. Изглежда, че php зарежда суперглобалния $_SERVER само ако се използва някъде. Можете да направите това:

печат"

" .htmlspecialchars(print_r(get_defined_vars(), true )) . "
" ;
печат"
" .htmlspecialchars (print_r ($_SERVER , true )) . "
" ;
?>

И тогава $_SERVER ще се появи и в двата списъка. Предполагам, че всъщност не е нещо лошо, защото нищо лошо няма да се случи и в двата случая, но въпреки това е интересно любопитство.

преди 6 години

Тъй като get_defined_vars() получава само променливите в точката, в която извиквате функцията, има лесен начин да получите променливите, дефинирани в текущия обхват.

// Самият връх на вашия php скрипт
$vars = get_defined_vars();

// Сега направете вашите неща
$foo = "foo";
$bar = "бар";

// Вземете всички променливи, дефинирани в текущия обхват
$vars = array_diff(get_defined_vars(), $vars);

ехо "

"
;
print_r($vars);
ехо "
" ;
?>

преди 15 години

Ето функция, която генерира доклад за отстраняване на грешки за дисплей или имейл
използвайки get_defined_vars. Чудесно за получаване на подробна моментна снимка без
разчитайки на въвеждане от потребителя.

функция generateDebugReport ($method, $defined_vars, $email = "undefined")(
// Функция за създаване на доклад за отстраняване на грешки за показване или имейл.
// Използване: generateDebugReport(method,get_defined_vars(),email);
// Където методът е "браузър" или "имейл".

// Създаване на списък за игнориране за ключове, върнати от "get_defined_vars".
// Например HTTP_POST_VARS, HTTP_GET_VARS и други са
// излишно (същото като _POST, _GET)
// Също така включете променливи, които искате да бъдат игнорирани от съображения за сигурност - т.е. PHPSESSID.
$ignorelist =масив("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 = дата("m/d/y h:m:s");
$message = "Създаден отчет за отстраняване на грешки $timestamp \n" ;

// Получаване на последната SQL грешка за добра мярка, където $link е идентификаторът на ресурса
// за mysql_connect. Коментирайте или модифицирайте за вашата база данни или настройка на абстракция.
глобална $връзка;
$sql_error = mysql_error($link);
if($sql_error )(
$message .= "\nMysql съобщения:\n" . mysql_error($link);
}
// Край на MySQL

// Може да използва рекурсивна функция тук. Схванахте идеята ;-)
foreach($defined_vars като $key => $val )(
if(is_array ($val) && ! in_array ($key, $ignorelist) && count ($val) > 0)(
$message .= "\n $ключов масив (ключ=стойност):\n" ;
foreach($val като $subkey => $subval )(
if(! in_array ($subkey, $ignorelist) && ! is_array ($subval))(
$message .= $подключ. "=" . $subval. "\н" ;
}
elseif(! in_array ($subkey, $ignorelist) && is_array ($subval))(
foreach($subval като $subsubkey => $subsubval )(
if(! in_array ($subsubkey, $ignorelist))(
$message .= $subsubkey . "=" . $subval. "\н" ;
}
}
}
}
}
иначе (!
е_масив ($val) &&! in_array ($key, $ignorelist) && $val)(
$message .= "\nПроменлива " . $ключ. "=" . $вал. "\н" ;
}
}

If($method == "браузър" )(
ехо nl2br($съобщение);
}
elseif($method == "имейл" )(
if($email == "undefined" )(
$имейл = $_SERVER["SERVER_ADMIN"];
}

$mresult = поща ($email, "Доклад за отстраняване на грешки за ". $_ENV [ "HOSTNAME"]. "", $message);
if($mresult == 1 )(
ехо „Докладът за отстраняване на грешки е изпратен успешно.\n“;
}
иначе(
ехо „Неуспешно изпращане на отчет за отстраняване на грешки.\n“;
}
}
}
?>

преди 17 години

Проста рутина за конвертиране на обект get_defined_vars в XML.

функция obj2xml ($v, $indent = "") (
докато (списък($ключ, $вал) = всеки ($v)) (
if ($key == "__attr" ) продължи;
// Проверка за __attr
if (is_object ($val -> __attr)) (
докато (списък($key2, $val2) = всеки ($val -> __attr)) (
$attr .= " $key2 =\" $val2 \"" ;
}
}
иначе $attr = "";
if (is_array ($val ) || is_object ($val )) (
print(" $indent< $key$attr >\н");
obj2xml ($val, $indent. " ");
print(" $indent\н");
}
else print(" $indent< $key$attr >$вал\н");
}
}

//Примерен обект
$x -> име -> first = "Джон" ;
$x -> име -> последно = "Смит" ;
$x -> arr [ "Плодове" ] = "Банани" ;
$x -> arr [ "Veg" ] = "Морков" ;
$y -> клиент = $x;
$y -> клиент -> __attr -> id = "176C4" ;

$z = get_defined_vars();
obj2xml($z["y"]);
?>
ще изведе:


Джон
Смит


банан
морков

преди 11 години

Като забележка, get_defined_vars() не връща набор от препратки към променливи (както се надявах). Например:

// дефиниране на променлива
$my_var = "foo" ;

// вземете нашия списък с дефинирани променливи
$defined_vars = get_defined_vars();

// сега опитайте да промените стойността чрез върнатия масив
$defined_vars [ "my_var" ] = "лента";

echo $my_var , "\n" ;

?>

ще изведе "foo" (първоначалната стойност). Би било хубаво, ако get_defined_vars() имаше незадължителен аргумент, за да ги направи препратки, но си представям, че това е доста специализирана заявка. Можете да го направите сами (по-малко удобно) с нещо като:

$defined_vars = масив();
$var_names = array_keys(get_defined_vars());

foreach ($var_names като $var_name )
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

преди 1 година

Публикувах тук преди за това, че "това" е в get_defined_vars.

Оказва се, че не винаги е там, но в някои случаи ще се появи необяснимо.

Php -r"
клас тест (
публична функция a() (var_dump(array_keys(get_defined_vars()));$a = 123;)
публична функция b() (var_dump(array_keys(get_defined_vars()));$this;)
}
$t = нов тест();
$t->a();
$t->b();
"

масив ()
масив ("това")

Това не се случва в PHP 7.2, но ще се случи в PHP 5.6.

преди 1 година

Някои коментари тук посочват, че тази функция няма да върне препратки. Той обаче връща имена и имената са "препратки".

Не бих препоръчал предложенията тук, които го превръщат в препратки.

публична функция x($a, $b, $c) (
foreach(array_keys(get_defined_vars()) като $key)
if($key !== "това")
$това->y($($key));
}

Публична функция y(&$input) (
$input++;
}

Вместо $() можете също да използвате $$.

Правил съм някои странни неща навремето, за да направя изключително общ код, но никога не ми се е налагало да правя нещо подобно на горното. Може дори да не работи (но би трябвало, тъй като не е по-различно от $a[$key]).

Можете също така да направите $$key++, но никога не съм виждал такъв код, който да не е ужасяващо лош (използването на динамика там, където динамиката не е от полза).

Ако правите нещо подобно, тогава го разгледайте допълнително.

преди 13 години

Малко нещо, за което да внимавате:

Ако изключите RegisterGlobals и свързаните с тях, след това използвате get_defined_vars(), може да видите нещо като следното:

масив
[ ГЛОБАЛНИ ] => Масив
[ ГЛОБАЛНИ ] => Масив
* РЕКУРСИЯ *
[_POST] => Array()
[_GET] => Array()
[_COOKIE] => Array()
[ _FILES ] => Array()
)

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

)
?>

Забележете, че $_SERVER не е там. Изглежда, че php зарежда суперглобалния $_SERVER само ако се използва някъде. Можете да направите това:

печат"

" .htmlspecialchars(print_r(get_defined_vars(), true )) . "
" ;
печат"
" .htmlspecialchars (print_r ($_SERVER , true )) . "
" ;
?>

И тогава $_SERVER ще се появи и в двата списъка. Предполагам, че всъщност не е нещо лошо, защото нищо лошо няма да се случи и в двата случая, но въпреки това е интересно любопитство.

преди 6 години

Тъй като get_defined_vars() получава само променливите в точката, в която извиквате функцията, има лесен начин да получите променливите, дефинирани в текущия обхват.

// Самият връх на вашия php скрипт
$vars = get_defined_vars();

// Сега направете вашите неща
$foo = "foo";
$bar = "бар";

// Вземете всички променливи, дефинирани в текущия обхват
$vars = array_diff(get_defined_vars(), $vars);

ехо "

"
;
print_r($vars);
ехо "
" ;
?>

преди 15 години

Ето функция, която генерира доклад за отстраняване на грешки за дисплей или имейл
използвайки get_defined_vars. Чудесно за получаване на подробна моментна снимка без
разчитайки на въвеждане от потребителя.

функция generateDebugReport ($method, $defined_vars, $email = "undefined")(
// Функция за създаване на доклад за отстраняване на грешки за показване или имейл.
// Използване: generateDebugReport(method,get_defined_vars(),email);
// Където методът е "браузър" или "имейл".

// Създаване на списък за игнориране за ключове, върнати от "get_defined_vars".
// Например HTTP_POST_VARS, HTTP_GET_VARS и други са
// излишно (същото като _POST, _GET)
// Също така включете променливи, които искате да бъдат игнорирани от съображения за сигурност - т.е. PHPSESSID.
$ignorelist =масив("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 = дата("m/d/y h:m:s");
$message = "Създаден отчет за отстраняване на грешки $timestamp \n" ;

// Получаване на последната SQL грешка за добра мярка, където $link е идентификаторът на ресурса
// за mysql_connect. Коментирайте или модифицирайте за вашата база данни или настройка на абстракция.
глобална $връзка;
$sql_error = mysql_error($link);
if($sql_error )(
$message .= "\nMysql съобщения:\n" . mysql_error($link);
}
// Край на MySQL

// Може да използва рекурсивна функция тук. Схванахте идеята ;-)
foreach($defined_vars като $key => $val )(
if(is_array ($val) && ! in_array ($key, $ignorelist) && count ($val) > 0)(
$message .= "\n $ключов масив (ключ=стойност):\n" ;
foreach($val като $subkey => $subval )(
if(! in_array ($subkey, $ignorelist) && ! is_array ($subval))(
$message .= $подключ. "=" . $subval. "\н" ;
}
elseif(! in_array ($subkey, $ignorelist) && is_array ($subval))(
foreach($subval като $subsubkey => $subsubval )(
if(! in_array ($subsubkey, $ignorelist))(
$message .= $subsubkey . "=" . $subval. "\н" ;
}
}
}
}
}
иначе (!
е_масив ($val) &&! in_array ($key, $ignorelist) && $val)(
$message .= "\nПроменлива " . $ключ. "=" . $вал. "\н" ;
}
}

If($method == "браузър" )(
ехо nl2br($съобщение);
}
elseif($method == "имейл" )(
if($email == "undefined" )(
$имейл = $_SERVER["SERVER_ADMIN"];
}

$mresult = поща ($email, "Доклад за отстраняване на грешки за ". $_ENV [ "HOSTNAME"]. "", $message);
if($mresult == 1 )(
ехо „Докладът за отстраняване на грешки е изпратен успешно.\n“;
}
иначе(
ехо „Неуспешно изпращане на отчет за отстраняване на грешки.\n“;
}
}
}
?>

преди 17 години

Проста рутина за конвертиране на обект get_defined_vars в XML.

функция obj2xml ($v, $indent = "") (
докато (списък($ключ, $вал) = всеки ($v)) (
if ($key == "__attr" ) продължи;
// Проверка за __attr
if (is_object ($val -> __attr)) (
докато (списък($key2, $val2) = всеки ($val -> __attr)) (
$attr .= " $key2 =\" $val2 \"" ;
}
}
иначе $attr = "";
if (is_array ($val ) || is_object ($val )) (
print(" $indent< $key$attr >\н");
obj2xml ($val, $indent. " ");
print(" $indent\н");
}
else print(" $indent< $key$attr >$вал\н");
}
}

//Примерен обект
$x -> име -> first = "Джон" ;
$x -> име -> последно = "Смит" ;
$x -> arr [ "Плодове" ] = "Банани" ;
$x -> arr [ "Veg" ] = "Морков" ;
$y -> клиент = $x;
$y -> клиент -> __attr -> id = "176C4" ;

$z = get_defined_vars();
obj2xml($z["y"]);
?>
ще изведе:


Джон
Смит


банан
морков

преди 11 години

Като забележка, get_defined_vars() не връща набор от препратки към променливи (както се надявах). Например:

// дефиниране на променлива
$my_var = "foo" ;

// вземете нашия списък с дефинирани променливи
$defined_vars = get_defined_vars();

// сега опитайте да промените стойността чрез върнатия масив
$defined_vars [ "my_var" ] = "лента";

echo $my_var , "\n" ;

?>

ще изведе "foo" (първоначалната стойност). Би било хубаво, ако get_defined_vars() имаше незадължителен аргумент, за да ги направи препратки, но си представям, че това е доста специализирана заявка. Можете да го направите сами (по-малко удобно) с нещо като:

$defined_vars = масив();
$var_names = array_keys(get_defined_vars());

foreach ($var_names като $var_name )
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

преди 1 година

Публикувах тук преди за това, че "това" е в get_defined_vars.

Оказва се, че не винаги е там, но в някои случаи ще се появи необяснимо.

Php -r"
клас тест (
публична функция a() (var_dump(array_keys(get_defined_vars()));$a = 123;)
публична функция b() (var_dump(array_keys(get_defined_vars()));$this;)
}
$t = нов тест();
$t->a();
$t->b();
"

масив ()
масив ("това")

Това не се случва в PHP 7.2, но ще се случи в PHP 5.6.

преди 1 година

Някои коментари тук посочват, че тази функция няма да върне препратки. Той обаче връща имена и имената са "препратки".

Не бих препоръчал предложенията тук, които го превръщат в препратки.

публична функция x($a, $b, $c) (
foreach(array_keys(get_defined_vars()) като $key)
if($key !== "това")
$това->y($($key));
}

Публична функция y(&$input) (
$input++;
}

Вместо $() можете също да използвате $$.

Правил съм някои странни неща навремето, за да направя изключително общ код, но никога не ми се е налагало да правя нещо подобно на горното. Може дори да не работи (но би трябвало, тъй като не е по-различно от $a[$key]).

Можете също така да направите $$key++, но никога не съм виждал такъв код, който да не е ужасяващо лош (използването на динамика там, където динамиката не е от полза).

Ако правите нещо подобно, тогава го разгледайте допълнително.



Свързани статии: