当前位置: 首页 > 后端技术 > PHP

搞定PHP面试——变量知识点整理

时间:2023-03-29 20:00:49 PHP

一、变量定义1、变量命名规则变量名可以包含字母、数字、下划线,不能以数字开头。$Var_1='foo';//合法$var1='foo';//合法$_var1='foo';//合法$Var-1='foo';//非法,不能包含-$1_var='foo';//不合法,不能以数字开头这里提到的字母是a-z、A-Z、127到255(0x7f-0xff)的ASCII字符。因此,使用中文变量名其实是合法的。使用中文标点符号作为变量名甚至是合法的。只是一般不推荐。$name='foo';//合法的$?....='富';//合法的。变量名区分大小写$var='Bob';$Var='Joe';echo"$var,$Var";//输出"Bob,Joe"$this是一个特殊变量,不能赋值$this='foo';//致命错误:无法重新分配$this2。变量赋值变量引用赋值和传值赋值详情传送门:变量引用赋值和传值赋值传值赋值变量默认总是按值赋值。也就是说,当将一个表达式的值赋给一个变量时,会将整个原始表达式的值赋给目标变量。这意味着,例如,当一个变量的值被分配给另一个变量时,改变一个变量的值不会影响另一个变量。$foo='鲍勃';//将'Bob'赋值给$foo$bar=$foo;//将$foo传递给$bar$bar='Jack';//修改$bar变量echo$foo;//$foo的值不变,仍然是'Bob'ref-assignment-reference-assignment,即新变量只是引用(换句话说,“别名”或“指向”)原始变量。更改新变量将影响原始变量,反之亦然。要使用引用赋值,只需在要赋值的变量(源变量)前添加一个&符号$foo='Bob';//将'Bob'赋值给$foo$bar=&$foo;//传递$bar引用$foo$bar='Jack';//修改$bar变量echo$foo;//$foo的值也改为'Jack'只能引用命名变量赋值$foo=25;$bar=&$foo;//合法赋值$bar=&(24*7);//非法的;引用没有名称的表达式functiontest(){return25;}$bar=&test();//Illegal3.变量的初始化虽然在PHP中不需要初始化变量,但是初始化变量是一个好习惯。未初始化的变量具有默认值未初始化的变量具有其类型的默认值。布尔变量默认值为FALSE,整型和浮点型变量默认值为0,字符串变量默认值为空字符串""数组变量默认值为空数组array()4。Variable变量variable变量是引用变量的变量名,可以动态设置和使用。可变变量获取普通变量的值作为可变变量的变量名。在下面的例子中,hello可以在使用两个美元符号($)之后作为变量变量。$a='你好';$$a='世界';此时定义了两个变量:$a的内容为“hello”,$hello的内容为“world”。因此,如下语句:echo"$a${$a}";输出与以下语句完全相同的结果:echo"$a$hello";他们都输出:你好世界。数组的可变变量要对数组使用可变变量,必须解决一个歧义。那就是在编写$$a[1]时,解析器需要知道它是否需要$a[1]作为变量,或者它是否需要$$a作为变量并获取该变量值中的索引[1]。解决此问题的语法是对第一种情况使用${$a[1]},对第二种情况使用${$a}[1]。可变变量用于也可以通过可变属性名称访问的类属性。变量属性名称将在调用范围内解析。例如,对于表达式$foo->$bar,$bar将在本地范围内解析,其值将用于$foo的属性名称。$bar是一个数组元素也是如此。您还可以使用花括号{}来清楚地分隔属性名称。当属性位于数组中,或者属性名称包含多个部分,或者属性名称包含非法字符(例如来自json_decode()或SimpleXML)时最有用。将json格式的字符串转换为php对象:$string='{"os-version":"10.3.1","1day":24}';$obj=json_decode($string);print_r($obj);outputresult:stdClassObject([os-version]=>10.3.1[1day]=>24)这时候如果要访问对象$obj中的os-version属性或者1day属性,如果直接使用$obj->os-version,$obj->1dayaccess肯定会报错。正确的获取方式:echo$obj->{"os-version"};echo'
';echo$obj->{"1day"};输出结果:10.3.124二、变量的作用域和静态变量1.变量的作用域变量的作用域也称为变量作用域,即定义它的上下文(即,其有效范围)。php变量的范围跨度也包括include和require引入的文件。用户定义函数中的局部变量将引入局部函数作用域。函数内部使用的任何变量的范围将被限制在局部函数范围内。示例:$outer='str';/*全局作用域*/functionmyfunc(){echo$outer;/*对局部范围变量的引用*/}myfunc();由于echo语句引用了变量$outer的本地版本,因此此脚本不会有任何输出,并且未在此范围内为其分配值。全局变量global关键字$outer='str';//全局函数myfunc(){global$outer;回声$外;//本地}myfunc();该脚本将输出str。使用global关键字在函数中声明全局变量$a和$b后,所有对任一变量的引用都将指向它们的全局版本。PHP对一个函数可以声明的全局变量的最大数量没有限制。$GLOBALS超全局数组$GLOBALS—引用全局范围内可用的所有变量$outer='str';//全局函数myfunc(){echo$GLOBALS['outer'];}myfunc();该脚本将输出str。$GLOBALS是一个关联数组,每个变量都是一个元素,键名对应变量名,值对应变量的内容。$GLOBALS存在于全局范围内的原因是因为$GLOBALS是一个超全局变量。超全局变量PHP中的许多预定义变量都是“超全局变量”,这意味着它们在脚本的所有范围内都可用。无需执行global$variable即可访问它们;在一个函数或方法中。这些超全局变量是:$GLOBALS—超全局变量是在所有范围内始终可用的内置变量$_SERVER—服务器和执行环境信息$_GET—HTTPGET变量$_POST—HTTPPOST变量$_FILES—HTTP文件上传变量$_COOKIE—HTTPCookies$_SESSION—会话变量$_REQUEST—HTTP请求变量。默认包含$_GET、$_POST和$_COOKIE数组。$_ENV—环境变量2.静态变量变量范围的另一个重要特征是静态变量。静态变量只存在于局部函数作用域中,但是当程序执行离开这个作用域时,它们的值并没有消失。静态变量的特点1.使用static关键字修饰2.静态声明在编译时解析3.只初始化一次4.初始化时需要赋值5.每次调用都会保留该值函数被执行6.静态修改的变量是局部的是的,它只在函数内部有效7.可以记录函数的调用次数,以便在一定条件下终止递归。函数myFunc(){静态$a=1;echo$a++;}myFunc();//1myFunc();//2myFunc();//3变量$a只在第一次调用myFunc()函数时使用初始化后,会输出$a的值,每次调用myFunc()函数时都会加1。声明静态变量时,不能使用表达式的结果对其赋值functionfoo(){static$int=0;//正确的static$int=1+2;//错误(使用表达式的结果赋值)static$int=sqrt(121);//错误(使用表达式的结果进行赋值)echo$int++;}静态变量和递归函数静态变量提供了一种处理递归函数的方法。递归函数是一个调用自身的函数。编写递归函数时要小心,因为无限递归是可能的。您必须确保有足够的方法来中止递归。以下简单函数递归计数到10,使用静态变量$count来确定何时停止:functiontest(){static$count=0;$计数++;回声$计数;如果($count<10){测试();}$count--;}3.实例分析写出以下程序的输出$count=5;functionget_count(){static$count;返回$count++;}echo$count;++$count;echoget_count();echoget_count();第8行echo$count;output5line9++$count;,此时$count的值为6line11echoget_count();,第一次调用get_count()函数functionget_count(){//声明静态变量$count,因为是赋值,所以它的值为NULLstatic$count;//$count++,先返回$count的值,然后递增。因此,返回值为NULL。//increment后NULL的值为1,所以$countafterincrement=1return$count++;}第一次调用get_count()的返回值为NULL,echoNULL;不会输出任何东西。第12行echoget_count();,第二次调用get_count()functionfunctionget_count(){//第二次调用时,该行不会执行static$count;//之前$count=1,$count++,先返回$count的值,然后自增。因此,返回值为1。return$count++;}第一次调用get_count()返回1,echoget_count();outputs1.整个程序的输出是51