[EDIT by danbrown AT php DOT net: The function provided by this author will give you all defined variables at runtime. It was originally written by (john DOT t DOT gold AT gmail DOT com), but contained some errors that were corrected in subsequent posts by (ned AT wgtech DOT com) and (taliesin AT gmail DOT com).]
<?php
echo '<table border=1><tr> <th>variable</th> <th>value</th> </tr>';
foreach( get_defined_vars() as $key => $value)
{
if (is_array ($value) )
{
echo '<tr><td>$'.$key .'</td><td>';
if ( sizeof($value)>0 )
{
echo '"<table border=1><tr> <th>key</th> <th>value</th> </tr>';
foreach ($value as $skey => $svalue)
{
echo '<tr><td>[' . $skey .']</td><td>"'. $svalue .'"</td></tr>';
}
echo '</table>"';
}
else
{
echo 'EMPTY';
}
echo '</td></tr>';
}
else
{
echo '<tr><td>$' . $key .'</td><td>"'. $value .'"</td></tr>';
}
}
echo '</table>';
?>
Променливи
Съдържание
- Предварително-дефинирани променливи
- Област на действие на променливи
- Променливи променливи
- Външни променливи за PHP
Основи
Променливите в PHP се представят чрез знака за долар, последван от името на променливата. Името на променливата е чувствително към регистъра.
Имената на променливите следват същите правила като другите етикети в PHP. Валидното име на променлива започва с буква или подчертавка, последвана от произволен брой букви, цифри или подчертавки. Като регулярен израз, това би могло да бъде представено така: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Забележка: В случая, под буква се разбират a-z, A-Z и ASCII знаците от 127 до 255 (0x7f-0xff).
Забележка: $this е специална променлива, която не може да бъде присвоявана.
Вж. също Userland Naming Guide.
За информация относно функциите, свързани с променливи, вижте Справочник на функциите за променливи.
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var"; // извежда "Bob, Joe"
$4site = 'not yet'; // невалидно; започва с цифра
$_4site = 'not yet'; // валидно; започва с подчертавка
$tдyte = 'mansikka'; // валидно; 'д' е (Разширен) ASCII 228.
?>
В PHP 3 променливите винаги се присвояват по стойност. С други думи, когато присвоявате израз на променлива, цялата стойност на оригиналния израз се копира в променливата. Това означава, например, че след присвояване стойността на една променлива на друга, променянето на една от тези променливи няма да се отрази на другата. За повече информация относно този тип присвояване, вижте главата за Изрази.
От PHP 4 се предлага друг начин за присвояване на стойности на променливи: присвояване по референция. Това означава, че новата променлива просто указва (с други думи, "става псевдоним на" или "сочи към") оригиналната променлива. Промени в новата променлива влияят на оригиналната и обратно.
За да присвоите променлива по референция, просто сложете амперсанд (&) в началото на променливата, която се присвоява (променливата - източник). Например, следващото парче код извежда 'My name is Bob' два пъти:
<?php
$foo = 'Bob'; // Присвояване на стойността 'Bob' на $foo
$bar = &$foo; // Указване на $foo чрез $bar. (Присвояване по референция)
$bar = "My name is $bar"; // Променяне на $bar...
echo $bar;
echo $foo; // $foo е променена също.
?>
Важно нещо за отбелязване е, че само именувани променливи могат да бъдат присвоявани по референция.
<?php
$foo = 25;
$bar = &$foo; // Това е валидно присвояване.
$bar = &(24 * 7); // Невалидно; указва безименен израз.
function test()
{
return 25;
}
$bar = &test(); // Невалидно.
?>
Инициализиране на променливите в PHP не е необходимо, но все пак е добра практика то да се прави. Неинициализираните променливи имат стойност по подразбиране според типа им - - FALSE, нула, празен низ или празен масив.
Example #1 Стойности по подразбиране на неинициализирани променливи
<?php
echo ($unset_bool ? "true" : "false"); // false
$unset_int += 25; // 0 + 25 => 25
echo $unset_string . "abc"; // "" . "abc" => "abc"
$unset_array[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
?>
Да се разчита на стойностите по подразбиране на неинициализирана променлива е проблемно в случай на включване (include) на един файл в друг, който използва същото име на променлива. Това също представлява и значителен риск за сигурността с включена директива register_globals. В случай на работа с неинициализирани променливи се извежда грешка от ниво E_NOTICE, освен в случаите на добавяне на елементи към неициализиран масив. За установяване дали дадена променлива е била инициализирана може да се използва езиковата конструкция isset().
Променливи
20-Jul-2008 03:25
07-Jul-2007 06:13
Here's a simple solution for retrieving the variable name, based on the lucas (http://www.php.net/manual/en/language.variables.php#49997) solution, but shorter, just two lines =)
<?php
function var_name(&$var, $scope=0)
{
$old = $var;
if (($key = array_search($var = 'unique'.rand().'value', !$scope ? $GLOBALS : $scope)) && $var = $old) return $key;
}
?>
20-Feb-2007 05:48
As an addendum to David's 10-Nov-2005 posting, remember that curly braces literally mean "evaluate what's inside the curly braces" so, you can squeeze the variable variable creation into one line, like this:
<?php
${"title_default_" . $title} = "selected";
?>
and then, for example:
<?php
$title_select = <<<END
<select name="title">
<option>Select</option>
<option $title_default_Mr value="Mr">Mr</option>
<option $title_default_Ms value="Ms">Ms</option>
<option $title_default_Mrs value="Mrs">Mrs</option>
<option $title_default_Dr value="Dr">Dr</option>
</select>
END;
?>
25-Jan-2007 11:10
Here's a pair of functions to encode/decode any string to be a valid php and javascript variable name.
<?php
function label_encode($txt) {
// add Z to the begining to avoid that the resulting
// label is a javascript keyword or it starts with a
// number
$txt = 'Z'.$txt;
// encode as urlencoded data
$txt = rawurlencode($txt);
// replace illegal characters
$illegal = array('%', '-', '.');
$ok = array('é', 'è', 'à');
$txt = str_replace($illegal,$ok, $txt);
return $txt;
}
function label_decode($txt) {
// replace illegal characters
$illegal = array('%', '-', '.');
$ok = array('é', 'è', 'à');
$txt = str_replace($ok, $illegal, $txt);
// unencode
$txt = rawurldecode($txt);
// remove the leading Z and return
return substr($txt,1);
}
?>
20-May-2006 02:44
Simple sample and variables and html "templates":
The PHP code:
variables.php:
<?php
$SYSN["title"] = "This is Magic!";
$SYSN["HEADLINE"] = "Ez magyarul van"; // This is hungarian
$SYSN["FEAR"] = "Bell in my heart";
?>
index.php:
<?php
include("variables.php");
include("template.html");
?>
The template:
template.html
<html>
<head><title><?=$SYSN["title"]?></title></head>
<body>
<H1><?=$SYSN["HEADLINE"]?></H1>
<p><?=$SYSN["FEAR"]?></p>
</body>
</html>
This is simple, quick and very flexibile
25-Nov-2005 11:03
References and "return" can be flakey:
<?php
// This only returns a copy, despite the dereferencing in the function definition
function &GetLogin ()
{
return $_SESSION['Login'];
}
// This gives a syntax error
function &GetLogin ()
{
return &$_SESSION['Login'];
}
// This works
function &GetLogin ()
{
$ret = &$_SESSION['Login'];
return $ret;
}
?>
10-Nov-2005 10:25
When using variable variables this is invalid:
<?php
$my_variable_{$type}_name = true;
?>
to get around this do something like:
<?php
$n="my_variable_{$type}_name";
${$n} = true;
?>
(or $$n - I tend to use curly brackets out of habit as it helps t reduce bugs ...)
31-Aug-2005 02:09
Variables can also be assigned together.
<?php
$a = $b = $c = 1;
echo $a.$b.$c;
?>
This outputs 111.
09-Jul-2005 08:46
In conditional assignment of variables, be careful because the strings may take over the value of the variable if you do something like this:
<?php
$condition = true;
// Outputs " <-- That should say test"
echo "test" . ($condition) ? " <-- That should say test" : "";
?>
You will need to enclose the conditional statement and assignments in parenthesis to have it work correctly:
<?php
$condition = true;
// Outputs "test <-- That should say test"
echo "test" . (($condition) ? " <-- That should say test " : "");
?>
17-May-2005 10:06
As with echo, you can define a variable like this:
<?php
$text = <<<END
<table>
<tr>
<td>
$outputdata
</td>
</tr>
</table>
END;
?>
The closing END; must be on a line by itself (no whitespace).
[EDIT by danbrown AT php DOT net: This note illustrates HEREDOC syntax. For more information on this and similar features, please read the "Strings" section of the manual here: http://www.php.net/manual/en/language.types.string.php ]
07-Apr-2005 06:18
In addition to what jospape at hotmail dot com and ringo78 at xs4all dot nl wrote, here's the sintax for arrays:
<?php
//considering 2 arrays
$foo1 = array ("a", "b", "c");
$foo2 = array ("d", "e", "f");
//and 2 variables that hold integers
$num = 1;
$cell = 2;
echo ${foo.$num}[$cell]; // outputs "c"
$num = 2;
$cell = 0;
echo ${foo.$num}[$cell]; // outputs "d"
?>
15-Feb-2005 01:42
Here's a function to get the name of a given variable. Explanation and examples below.
<?php
function vname(&$var, $scope=false, $prefix='unique', $suffix='value')
{
if($scope) $vals = $scope;
else $vals = $GLOBALS;
$old = $var;
$var = $new = $prefix.rand().$suffix;
$vname = FALSE;
foreach($vals as $key => $val) {
if($val === $new) $vname = $key;
}
$var = $old;
return $vname;
}
?>
Explanation:
The problem with figuring out what value is what key in that variables scope is that several variables might have the same value. To remedy this, the variable is passed by reference and its value is then modified to a random value to make sure there will be a unique match. Then we loop through the scope the variable is contained in and when there is a match of our modified value, we can grab the correct key.
Examples:
1. Use of a variable contained in the global scope (default):
<?php
$my_global_variable = "My global string.";
echo vname($my_global_variable); // Outputs: my_global_variable
?>
2. Use of a local variable:
<?php
function my_local_func()
{
$my_local_variable = "My local string.";
return vname($my_local_variable, get_defined_vars());
}
echo my_local_func(); // Outputs: my_local_variable
?>
3. Use of an object property:
<?php
class myclass
{
public function __constructor()
{
$this->my_object_property = "My object property string.";
}
}
$obj = new myclass;
echo vname($obj->my_object_property, $obj); // Outputs: my_object_property
?>
05-Feb-2005 08:45
<?php
$id = 2;
$cube_2 = "Test";
echo ${cube_.$id};
// will output: Test
?>
14-Jan-2005 09:27
<?php
// I am beginning to like curly braces.
// I hope this helps for you work with them
$filename0="k";
$filename1="kl";
$filename2="klm";
$i=0;
for ($varname = sprintf("filename%d",$i); isset ( ${$varname} ) ; $varname = sprintf("filename%d", $i) ) {
echo "${$varname} <br>";
$varname = sprintf("filename%d",$i);
$i++;
}
?>
07-Jan-2005 12:02
You can also construct a variable name by concatenating two different variables, such as:
<?php
$arg = "foo";
$val = "bar";
//${$arg$val} = "in valid"; // Invalid
${$arg . $val} = "working";
echo $foobar; // "working";
//echo $arg$val; // Invalid
//echo ${$arg$val}; // Invalid
echo ${$arg . $val}; // "working"
?>
Carel
25-May-2004 07:58
<?php
error_reporting(E_ALL);
$name = "Christine_Nothdurfter";
// not Christine Nothdurfter
// you are not allowed to leave a space inside a variable name ;)
$$name = "'s students of Tyrolean language ";
print " $name{$$name}<br>";
print "$name$Christine_Nothdurfter";
// same
?>
20-Jan-2004 05:15
You don't necessarily have to escape the dollar-sign before a variable if you want to output its name.
You can use single quotes instead of double quotes, too.
For instance:
<?php
$var = "test";
echo "$var"; // Will output the string "test"
echo "\$var"; // Will output the string "$var"
echo '$var'; // Will do the exact same thing as the previous line
?>
Why?
Well, the reason for this is that the PHP Parser will not attempt to parse strings encapsulated in single quotes (as opposed to strings within double quotes) and therefore outputs exactly what it's being fed with :)
To output the value of a variable within a single-quote-encapsulated string you'll have to use something along the lines of the following code:
<?php
$var = 'test';
/*
Using single quotes here seeing as I don't need the parser to actually parse the content of this variable but merely treat it as an ordinary string
*/
echo '$var = "' . $var . '"';
/*
Will output:
$var = "test"
*/
?>
HTH
- Daerion
15-Jan-2003 03:37
References are great if you want to point to a variable which you don't quite know the value yet ;)
eg:
<?php
$error_msg = &$messages['login_error']; // Create a reference
$messages['login_error'] = 'test'; // Then later on set the referenced value
echo $error_msg; // echo the 'referenced value'
?>
The output will be:
test
