PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

預定義變數> <Type Juggling
Last updated: Sun, 25 Nov 2007

view this page in

變數

Table of Contents

基礎

PHP 中的變數用一個錢字元號後面跟變數名來表示。變數名是區分大小寫的。

變數名與 PHP 中其它的標籤一樣遵循相同的規則。一個有效的變數名由字母或者下劃線開頭,後面跟上任意數量的字母,數字,或者下劃線。按照正常的正則表示式,它將被表述為:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'。

Note: 在此所說的字母是 a-z,A-Z,以及 ASCII 字元從 127 到 255(0x7f-0xff)。

Tip

可以參考Userland Naming Guide

有關變數的函式資訊見變數函式

<?php
$var 
'Bob';
$Var 'Joe';
echo 
"$var, $Var";      // 輸出 "Bob, Joe"

$4site 'not yet';     // 非法變更名;以數字開頭
$_4site 'not yet';    // 合法變數名;以下劃線開頭
$i站點is 'mansikka';  // 合法變數名;可以用中文
?>

PHP 3 中,變數總是傳值指派。那也就是說,當將一個表達式的值賦予一個變數時,整個原始表達式的值被指派到目標變數。這意味著,例如,當一個變數的值賦予另外一個變數時,改變其中一個變數的值,將不會影響到另外一個變數。有關這種類型的指派操作,請參閱表達式一章。

PHP 4 提供了另外一種方式給變數指派:引用指派。這意味著新的變數簡單的引用(換言之,「成為其別名」 或者 「指向」)了原始變數。改動新的變數將影響到原始變數,反之亦然。

使用引用指派,簡單地將一個 & 符號加到將要指派的變數前(源變數)。例如,下列代碼片斷將輸出「My name is Bob」兩次:

<?php
$foo 
'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar "My name is $bar";  // Alter $bar...
echo $bar;
echo 
$foo;                 // $foo is altered too.
?>

有一點重要事項必須指出,那就是只有有名字的變數才可以引用指派。

<?php
$foo 
25;
$bar = &$foo;      // This is a valid assignment.
$bar = &(24 7);  // Invalid; references an unnamed expression.

function test()
{
   return 
25;
}

$bar = &test();    // Invalid.
?>

雖然在 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")
?>

依賴未初始化變數的默認值在某些情況下會有問題,例如把一個文件包含到另一個之中時碰上相同的變數名。另外把 register_globals 打開是一個主要的安全隱患E_NOTICE 級別的錯誤會在碰上未初始化的變數時發出,但是在向一個未初始化的數組附加單元時不會。isset() 語言結構可以用來檢測一個變數是否已被初始化。



預定義變數> <Type Juggling
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
變數
Anonymous
20-Jul-2008 09:25
[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>';
?>
alexandre at nospam dot gaigalas dot net
07-Jul-2007 12: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
}
?>
jsb17 at cornell dot edu
21-Feb-2007 12: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;
?>
code at slater dot fr
25-Jan-2007 06: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);
}

?>
molnaromatic at gmail dot com
20-May-2006 08: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
Mike at ImmortalSoFar dot com
26-Nov-2005 06: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;
}
?>
david at removethisbit dot futuresbright dot com
10-Nov-2005 05: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 ...)
Chris Hester
31-Aug-2005 08:09
Variables can also be assigned together.

<?php
$a
= $b = $c = 1;
echo
$a.$b.$c;
?>

This outputs 111.
Mike Fotes
10-Jul-2005 02: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 " : "");
?>
josh at PraxisStudios dot com
18-May-2005 04: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 ]
mike at go dot online dot pt
08-Apr-2005 12: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"
?>
lucas dot karisny at linuxmail dot org
15-Feb-2005 08: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
?>
jospape at hotmail dot com
05-Feb-2005 03:45
<?php
$id
= 2;
$cube_2 = "Test";

echo ${
cube_.$id};

// will output: Test
?>
ringo78 at xs4all dot nl
15-Jan-2005 04: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++;
}
?>
Carel Solomon
07-Jan-2005 07: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
raja shahed at christine nothdurfter dot com
26-May-2004 01: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
?>
webmaster at daersys dot net
21-Jan-2004 12: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
unleaded at nospam dot unleadedonline dot net
15-Jan-2003 10: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

預定義變數> <Type Juggling
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | sitemap | contact | advertising | mirror sites