Heim > Backend-Entwicklung > PHP-Tutorial > 变量与常量

变量与常量

WBOY
Freigeben: 2016-06-23 13:26:10
Original
939 Leute haben es durchsucht

变量基础

PHP中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的,并且出现中文可能也是合法的。

变量默认总是传值赋值。PHP也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,"成为其别名" 或者 "指向")了原始变量。改动新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)。注意,只有有名字的变量才可以引用赋值。

预定义变量

PHP拥有大量预定义变量,许多变量依赖与服务器,某些预定义变量以命令行形式运行时并不生效。

PHP提供了一套附加的预定数组,这些数组变量包含了来自web服务器(如果可用),运行环境,和用户输入的数据,通常被称为自动全局变量(autoglobals)或者超全局变量(superglobals)。

变量范围

这里的变量范围指的是,它定义的上下文背景,也就是它的生效范围。变量的范围包含了include和require引入的文件。

PHP的全局变量和C语言有一点点不同,在C语言中,全局变量在函数中自动生效,除非被局部变量覆盖。PHP中全局变量在函数中使用时必须声明为global。

<?php $a = 'hello';function test() {    var_dump($a);}// test();include 'b.inc';
Nach dem Login kopieren

b.inc内容如下:

<?php echo 'hello';?>
Nach dem Login kopieren

该程序能够正常输出hello,但是被注释掉的test()不能正常解析,因为变量$a是未定义的。

使用全局变量

若在某个函数中想使用全局变量,可以通过下面两种方式。

  • global关键字

  • global $a, $b;
    Nach dem Login kopieren

    在函数中声明全局变量后,对任一变量的所有引用都会指向其全局版本。

  • $GLOBALS超全局变量数组

  • $GLOBALS['b'] = $GLOBALS['a'] + $BLOBALS['b'];
    Nach dem Login kopieren

    用法同global关键字相似。

    静态变量

    静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。并且,只在声明时初始化一次,每次调用函数并不会覆盖静态函数的值。

    静态变量在声明中用表达式的结果对其赋值会导致解析错误,静态声明是在编译时解析的。

    <?php function test() {    static $cnt = 0;    echo $cnt;    $cnt++;    if($cnt < 10) {        test();    }    $cnt--;}test();
    Nach dem Login kopieren

    和C语言的static相似,下面这段C代码也可以把0~9十个数字依次输出。

    #include <stdio.h>void test(void) {    static int cnt = 0;    printf("%d ", cnt);    cnt++;    if(cnt < 10) {        test();    }    cnt--;}int main(void) {    test();    return 0;}
    Nach dem Login kopieren

    对于变量的static和global定义是以引用的方式实现的。

    可变变量

    可变变量是PHP语言中的一种特殊用法,不知其他语言存不存在。

    简而言之,可变变量就是,一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。

    <?php $a = 'hello';$$a = 'world';echo "$a $$a";  // hello $helloecho "$a ${$a}";  // hello world
    Nach dem Login kopieren

    当可变变量用于数组时,可能会出现模棱两可的问题。比如,写下$$a[1],编译器会报错的,你想要表达的意思需要用下面两种方式替换掉。

    ${$a[1]}
    $a[1]作为一个变量

    ${$a}[1]
    $$a作为一个变量并取出变量中索引为1的值。

    表单变量

    当表单提交给PHP脚本时,表单中的信息自动在脚本中可用,可以通过$_GET[]、$_POST[]和$_REQUEST[]访问。

    注意,变量名中的点和空格被转换成下划线。例如变成了$_REQUEST["a_b"],下面的示例中展示了表单中标识符的使用。

    <form action="process.php" method="post"><input name="my.text" type="text"><input name="my text" type="text"><input name="my_text" type="text"><input type="submit"></form>
    Nach dem Login kopieren

    表单处理文件process.php。

    <?php var_dump(isset($_POST['my.text']));var_dump(isset($_POST['mytext']));var_dump(isset($_POST['my_text']));var_dump($_POST['my_text']);
    Nach dem Login kopieren

    因为句点不是PHP变量名中的合法字符,输出结果如下所示。

    boolean falseboolean falseboolean truestring 'h3' (length=2)
    Nach dem Login kopieren

    magic_quotes_gpc配置指令影响到get/post/cooie的值,这个特性已经废弃移除,输入中的单引号、双引号、反斜杠和NULL字符都不会被转义。若需要转义可使用addslashes(),若需要反引用一个引用的字符串需要使用stripslashes()。

    PHP也懂得表单变量上下文中的数组,下面的例子使用了更复杂的表单变量,并将表单post给自己并在提交时显示数据。

    <?php if(isset($_POST['action'])) {    var_dump($_POST);} else {    $page = $_SERVER['PHP_SELF'];    $s = <<<STR<form action="{$_SERVER['PHP_SELF']}" method="post"><input type="text" name="personal[name]"><input type="text" name="personal[detail]"><select multiple name="option[]">    <option value="a">a</option>    <option value="b">b</option>    <option value="c">c</option></select><input type="hidden" name="action" value="submitted"><input type="submit" name="submit"></form>STR;    echo $s;}
    Nach dem Login kopieren

    在heredoc中含有复杂变量时要格外小心,上面这段代码$_SERVER['PHP_SELF']不加花括号会在运行时报错。

    array (size=4)  'personal' =>     array (size=2)      'name' => string 'hello' (length=5)      'detail' => string 'world' (length=5)  'option' =>     array (size=2)      0 => string 'a' (length=1)      1 => string 'c' (length=1)  'action' => string 'submitted' (length=9)  'submit' => string '提交查询内容' (length=12)
    Nach dem Login kopieren

    IMAGE提交

    当提交表单时,可以用一张图片代替标准的提交按钮。第一次使用,真的好神奇。

    <?php if(isset($_POST['action'])) {    var_dump($_POST);} else {    $s = <<<STR<form action="{$_SERVER['PHP_SELF']}" method="post"><input type="hidden" name="action" value="1"><input type="image" src="go.jpg" name="sub"></form>STR;    echo $s;}
    Nach dem Login kopieren

    对于上面这段程序,当用户点击图片某处时,表单会传送到服务器,并加上两个变量sub_x和sub_y,包含了用户点击图片的坐标。

    array (size=3)  'action' => string '1' (length=1)  'sub_x' => string '334' (length=3)  'sub_y' => string '282' (length=3)
    Nach dem Login kopieren

    cookies

    PHP可以用setcookie()函数设定cookies,cookies是HTTP信息头的一部分,因此必须在向浏览器发送任何输出之前调用。

    cookie的相关使用如下所示。

    <?php if(isset($_COOKIE['cnt'])) {    $cnt = $_COOKIE['cnt'] + 1;        echo $cnt;} else {    $cnt = 1;}setcookie('cnt', $cnt, time() + 3600);
    Nach dem Login kopieren

    cookie数据在相应的cookie数组中可用,如果将多个值赋给一个cookie变量,必须将其赋成数组。

    常量语法

    常量在脚本执行期间其值不能改变。常量大小写敏感,传统上常量标识符总是大写。常量一旦定义就不能被重新定义或取消定义,常量的值只能是标量。

    可以用define()函数来定义常量,也可以使用const关键字在类定义之外定义常量。自定义常量不要以双下划线开头,可能会与魔术常量冲突。

    define('FOO', 'something');const FOO = 'something';
    Nach dem Login kopieren

    使用const关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。常量的范围是全局的,不用管作用区域,就可以在脚本的任何地方访问常量。

    魔术常量

    魔术常量值能变,但它其实不是常量。

    __LINE__  // 文件中的当前行号__FILE__  // 文件的完整路径和文件名,绝对路径__DIR__  // 文件所在的目录,除非根目录,否则不包括末尾斜杠,等价于dirname(__FILE__)__FUNCTION__  // 函数名称,区分大小写__CLASS__  // 类的名称,包括其被声明的作用区域__TRAIT__  // Trait的名字,包括其被声明的作用区域__METHOD__  // 类的方法名__NAMESPACE__  // 当前命名空间的名称
    Nach dem Login kopieren

    PHP向它运行的任何脚本提供了大量的预定义常量,上面8个魔术常量的值随着它们在代码中的位置改变而改变。

    (全文完)

    Verwandte Etiketten:
    Quelle:php.cn
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage