加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

四章变量、常量、表达式、运算符

发布时间:2022-11-01 14:01:58 所属栏目:PHP教程 来源:转载
导读: 第一节变量、常量4.1.1变量PHP中一个美元?符号后面跟?上一个变量?名称,即表示一个?变量。变量的名称?是对大小写?敏感的。变量名与PHP中其它的标?签一样遵循?相同的规则?。一个有效的?变量

第一节变量、常量4.1.1变量PHP中一个美元?符号后面跟?上一个变量?名称,即表示一个?变量。变量的名称?是对大小写?敏感的。变量名与PHP中其它的标?签一样遵循?相同的规则?。一个有效的?变量名由字?母或者下划?线开头,后面跟上任?意数量的字?母,数字,或者下划线?。按照正常的?正则表达式?,它将被表述?为:?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*?字母为a-z,A-Z,ASCII?字符从127255(0x7f-0xff)。〈?php$var"Bob";$Var"Joe";echo"$var,$Var";outpu?ts"Bob,Joe"$4site?inval?id;start?under?score?$t?yte?mansi?kka?;(Exten?ded)ASCII?228.提供了另外?一种方式给?变量赋值:传地址赋值?。这意味着新?的变量简单?的引用(换言之,“成为其别名?”?或者“指向”)了原始变量?。改动新的变?量将影响到?原始变量,反之亦然。这同样意味?着其中没有?执行复制操?作;因而,这种赋值操?作更加快速?。尽管如此,任何提速的?操作只有在?紧密循环或?者大数组或?者对象才可?能被注意到?。

使用传地址?赋值,简单地追加?一个(&)符号到将要?赋值的变量?前(源变量)。例如,下列代码片?断两次输出??My?name?is?Bob?:〈?php$foovalue??Bob?$foo$barRefer?ence$foovia$bar.$bar"MynameAlter?$bar...echo$bar;echo$foo;alter?edtoo.需要注意的?是只有命名?变量才可以?传地址赋值?,这一点非常?重要。〈?php$foo25;$barvalid?assig?nment?Inval?id;refer?ences?unnam?edexpre?ssionfunct?iontest()Inval?id.4.1.2预定义变量?PHP提供了大量?的预定义变?量。由于许多变?量依赖于运?行的服务器?的版本和设?置,及其它因素?,所以并没有?详细的说明?文档。一些预定义?变量在PHP以命令行形?式运行时并?不生效。请优先使用?可用的PHP预定义变量?,如超级全局数?组。PHP4.1.0开始,PHP提供了一套?附加的预定?数组,这些数组变?量包含了来?自Web服务器(如果可用),运行环境,和用户输入?的数据。

这些数组非?常特别,它们在全局?范围内自动?生效,例如,在任何范围?内自动生效?。为此,它们常因是?"autog?lobal?s"或者"super?globa?ls"而闻名。(PHP中尚且没有?一种可使用?户自定义超?级全局变量?的机制)超级全局变?量罗列于下?文中;但是为了得?到它们的内?容和关于PHP预定义变量?的进一步的?讨论以及它?们的本质,请参阅预定?义变量。而且,你也将注意?到旧的预定?义数组($HTTP_?*_VARS?)仍旧存在。PHP5.0.0PHP预定义数组?可以通过设?置regis?ter_l?ong_a?rrays?来屏蔽。可变变量:超级全局变?量不能被用?作可变变量?。如果某些varia?bles_?order?中的变量没?有设定,它们的对应?的PHP预定义数组?也是空的。4.1.3变量范围变量的范围?即它定义的?上下文背景?(译者:说白了,也就是它的?生效范围)。大部分的PHP变量只有一?个单独的范?围。这个单独的?范围跨度同?样包含了inclu?derequi?re引入的文件?。范例:〈?phpinclu?de"b.inc";将会在包含?文件b.inc中生效。

但是,在用户自定?义函数中,一个局部函?数范围将被?引入。任何用于函?数内部的变?量按缺省情?况将被限制?在局部函数?范围内。范例:〈?phpfunct?ionTest()refer?encelocal?scopevaria?ble这个脚本不?会有任何输?出,因为echo语句引用了?一个局部版?本的变量$a,而且在这个?范围内,它并没有被?赋值。你可能注意?到PHP的全局变量?和语言中,全局变量在?函数中自动?生效,除非被局部?变量覆盖。这可能引起?一些问题,有些人可能?漫不经心的?改变一个全?局变量。PHP中全局变量?在函数中使?用时必须申?明为全局。globa?lkeywo?rd首先,一个使用globa?l的例子:〈?phpfunct?ionSum()Sum();echo以上脚本的?输出将是"3"。在函数中申?明了全局变?量$b,任何变量的?所有引用变?量都会指向?到全局变量?。对于一个函?数能够申明?的全局变量?的最大个数?,PHP没有限制。在全局范围?内访问变量?的第二个办?法,是用特殊的?PHP自定义$GLOBA?LS数组。前面的例子?可以写成:使用$GLOBA?LS替代globa?l〈?phpfunct?ionSum()$GLOBA?LS["b"]$GLOBA?LS["a"]$GLOBA?LS["b"];Sum();echo$GLOBA?LS数组中,每一个变量?为一个元素?,键名对应变?量名,值变量的内?容。

$GLOBA?LS所以在全?局范围内存?在,是因为$GLOBA?LS是一个超全?局变量。以下范例显?示了超全局?变量的用处?:演示超全局?变量和作用?域的例子〈?phpfunct?iontest_?globa?"super?",它们需要用??globa?中有效。globa?$HTTP_?POST_?VARS;print?$HTTP_?POST_?VARS[?name?];Super?globa?ls在任何范围?内都有效,它们并不需?声明。Super?globa?lsPHP4.1.0引入的。print?$_POST?[?name?];(二)使用静态变?量变量范围的?另一个重要?特性是静态?变量(stati?cvaria?ble)。静态变量仅?在局部函数?域中存在,但当程序执?行离开此作?用域时,其值并不丢?失。看看下面的?例子:演示需要静?态变量的例?子〈?phpfunct?ionTest没有作用,因为一旦退?出本函数则?变量定义为静态?的。使用静态变?量的例子〈?phpfunct?ionTest()现在,每次调用Test()函数都会输?出静态变量也?提供了一种?处理递归函?数的方法。

递归函数是?一种调用自?己的函数。写递归函数?时要小心,因为可能会?无穷递归下?去。必须确保有?充分的方法?来中止递归?。一下这个简?单的函数递?归计数到10,使用静态变?量$count?来判断何时?停止:静态变量与?递归函数〈?phpfunct? ion Test() echo$count? 静态变量可?以按照上面?的例子声明?。如果在声明?中用表达式?的结果对其?赋值会导致?解析错误。声明静态变? 〈?phpfunct? ion foo(){ stati? corre?ct stati? expre?ssion? expre?ssion? too) $int++; echo $int; Zend引擎 代,驱动了PHP4,对于变量的? stati?c globa?l定义是以 refer?ences? 的方式实现? 的。例如,在一个函数?域内部用 globa?l 语句导入的?一个真正的?全局变量实?际上是建立?了一个到全?局变量的 引?用。这有可能导?致预料之外?的行为,如以下例子?所演示的: 〈?php funct? ion test_? globa? l_ref? $obj;$obj &newstdcl? ass; funct?ion test_? globa? l_nor? ef() $obj;$obj newstdcl? ass; test_?globa? l_ref? var_d?ump($obj); test_? globa? l_nor? ef(); var_d? ump($obj); 执行以上例?子会导致如?下输出:NULL objec?t(stdCl?ass)(0) 类似的行为?也适用于stati?c 语句。

PHP超级全局变量_php超级变量_qt定义全局结构体变量

引用并不是?静态地存储?的: 〈?php funct? ion &get_i? nstan? ce_re? $obj;echo "Stati? var_d?ump($obj); (!isset?($obj)) 将一个引用?赋值给静态?变量 $obj &newstdcl? ass; $obj-〉prope?rty++; retur? funct?ion &get_i? nstan? ce_no? ref() $obj;echo "Stati? var_d?ump($obj); (!isset?($obj)) 将一个对象?赋值给静态?变量 $obj newstdcl? ass; $obj-〉prope?rty++; retur? get_i?nstan? ce_re? $still?_obj1? get_i?nstan? ce_re? get_i?nstan? ce_no? ref(); $still? _obj2? get_i?nstan? ce_no? ref(); 执行以上例?子会导致如?下输出:Stati?c objec?t: NULL Stati?c objec?t: NULL Stati?c objec?t: NULL Stati?c objec?t: objec?t(stdCl?ass)(1) ["prope?rty"]=〉int(1) 4.1.4常量 常量是一个?简单值的标?识符(名字)。

如同其名称?所暗示的,在脚本执行?期间该值不?能改变(除了所 谓的?魔术常量,它们其实不?是常量)。常量默认为?大小写敏感?。按照惯例常?量标识符总?是大写的。 常量名和其?它任何 PHP 标签遵循同?样的命名规?则。合法的常量?名以字母或?下划线开始?,后面跟着任?何 字母,数字或下划?线。用正则表达?式是这样表?达的: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 在这里,字母是a-z,A-Z,以及从 127 255(0x7f-0xff)的ASCII? 字符。 super?globa?ls一样,常量的范围?是全局的。不用管作用?域就可以在?脚本的任何?地方访问常?量。有关 作用得?更多信息请?阅读手册中?的变量范围?。 可以用 defin?e() 函数来定义?常量。一个常量一?旦被定义,就不能再改?变或者取消?定义。 常量只能包?含标量数据?(boole?an,integ?er,float? strin?g)。可以简单的?通过指定其?名字来取得?常量的值,不要在常量?前面加上 符号。如果常量名?是动态的,也可以用函?数cons?tant() 来读取常量?的值。

用 get_d?efine?d_con?stant?s() 可以获得所?有已定义的?常量列表。 如果使用了?一个未定义?的常量,PHP 假定你想要?的是该常量?本身的名字?,如同你用字?符串调用它?一样 (CONST?ANT 对应"CONST?ANT")。此时将发出?一个 E_NOT?ICE 级的错误。参见手册中?为什么 $foo[bar] 是错误的(除非你事先?用 defin?e() bar定义为一个?常量)。如果你只想?检查是否定?义了某常量?,用 defin?ed() 函数。 常量和变量?不同: 常量前面没?有美元符号?($); 常量只能用? defin?e() 函数定义,而不能通过?赋值语句; 常量可以不?用理会变量?范围的规则?而在任何地?方定义和访?问; 常量一旦定?义就不能被?重新定义或?者取消定义?; 常量的值只?能是标量。 定义常量〈?php defin? e("CONST? ANT", "Hello? world? echoCONST? ANT; outpu?ts "Hello? world? echoConst? ant; outpu?ts "Const? ant" 第二节表达式 表达式是 PHP 最重要的基?石。

在 PHP 中,几乎你所写?的任何东西?都是一个表?达式。简单但却最?精 确的定义?一个表达式?的方式就是?“anyth?ing value?”。最基本的表?达式形式是?常量和变量?。当你键入“$a?=?5”,即将值 分配给变量?$a。?5?,很明显,值 的表达式?(既然如此,?5?是一个整型?常量)。 赋值之后,你所盼望的?情况是 一样。换句话说,$a 的表达式。如果一切运?行正确,那这正是将?要发生的正?确结果。稍微复杂的?表达式例子?就是函数。例如PHP超级全局变量,考虑下面的?函数: 〈?php funct? ion foo foo()从本质上来?说就如写下? 函数也是表?达式,表达式的值?即为它们的?返回值。既然foo() 返回5,表达式 ?foo()?? 的值也是5?。通常函 数不?会仅仅返回?一个静态值?,而可能会计?算一些东西?。 当然,PHP 中的值常常?并非是整型?的。PHP 支持三种标?量值类型:整型值,浮点值和字?符串值(标 量值不能?拆分为更小?的单元,比如:数组)。PHP 也支持两种?复合类型:数组和对象?。这两种类型?具可以 赋值?给变量或者?从函数返回?。 一个很好的?面向表达式?的例子就是?前、后递增和递?减。

PHP/FI 和多数其它?语言的用户?应该比较熟?悉变量 符号。即递增和递?减操作符。在PHP/FI 中,语句“$a++”没有值(不是表达式?),这样的话你?便不能为其?赋值或者以?任何其它方?式来使用它?。PHP 通过将其变?为了表达式?,类似 语言,增强了递增?/递减的能力?。在 PHP 语言中,有两种类型?的递增前递?增和后递增?,本质上来讲?,前递 增和后?递增均增加?了变量的值?,并且对于变?量的影响是?相同的。不同的是递?增表达式的?值。前递增,写做 “++$varia?ble”,求增加后的?值(PHP 在读取变量?的值之前,增加变量的?值,因而称之为?“前递增”)。后递 增,写做?$varia?ble++?,求变量未递?增之前的原?始值(PHP 在读取变量?的值之后,增加变量的?值,因而叫 做?后递增?)。前递增,++$a,则该表达式?的值加 1;后递增,$a++,则该表达式?的值不变。 一个常用到?表达式类型?是比较表达?式。这些表达式?求值 FALSE?或者 TRUE(分别的)。 PHP 支持 〉(大于),〉=(大于等于),==(等于),!=(不等于),〈(小于),〈= (小于等于)。

这些表达式?都是在条件?判断语句,比如,if 语句中最常?用的。 这里,我们将要研?究的最后一?个例子是组?合的赋值操?作符表达式?。你已经知道?如果想要为?变量 的值,比如3,该怎么做?你可以多 次?写?$a++?,但这样明显?不是一种高?效舒适的方?法,一个更加通?用的做法是??$a?=?$a?+?3?。?$a?+?3?? 计算 的值,并且得到的?值重新赋予?变量$a,于是 的值增加了?3。在PHP 及其它几种?类似 的当前值加?3,可以这 3,得到的结果?再次分配给?变量$a”。除了更简略?和 清楚外,也可以更快?的运行。?$a?+=?3?的值,如同一个正?常赋值操作?的值,是赋值后的?值。注意它不是? 加上3的组?合值(即已经分配?给 的原始值,而是完成+3 操作后变量? 任何两位操?作符都可以?使用在复制?操作符模式?,例如?$a?-=?5?(从变量 乘以7),等等。 有一些表达?式,如果你没有?在别的语言?中看到过的?话,可能认为它?们是多余的?,如三重操作?符: $first? $third?如果第一个?子表达式的?值是 TRUE(非零),那么计算第?二个子表达?式的值,其值即为整?个表达式的? 值。

否则,将是第三个?子表达式的?值。 下面的例子?一般来说应?该可以稍微?帮你理解前?、后递增和表?达式: 〈?php funct? ion doubl? 在本章的开?始,我们说过我?们将会描述?多种语句类?型,并且如同许?诺的那样,表达式可以?是语句。尽管如此,不是每个表?达式都是一?个语句。而这样的话?,一个语句,它的形式是? ?expr? ?;?,一个表达式?有一个 分号?结尾。在?$b=$a=5;?,$a 是一个有效?的表达式,但是它却不?是一个语句?。?$b=$a=5;??却是一个有? 效的语句。 最后一件值?得提起的事?情就是表达?式的真实值?。在许多事件?中,大体上主要?是在条件执?行和循环中?, 不要专注于?表达式中明?确的值,反而要注意?表达式的值?是否是 TRUE 或者 FALSE?。常量 TRUE FALSE?(大小写无关?)是两种可能?的 Boole?an 值。如果有必要?,一个表达式?将自动转换?为 Boole?an。 PHP 提供了一套?完整强大的?表达式,而为它提供?完整的文件?资料已经超?出了本手册?的范围。上面的例 子?应该为你提?供了一个好?的关于什么?是表达式和?怎样构建一?个有用的表?达式的概念?。

在本手册的?其余部分, 我们将始终?使用 expr 来?表示一个有?效的 PHP 表达式。 第三节 运算符 4.3.1 运算符优先?级 运算符优先?级指定了两?个表达式绑?定得有多“紧密”。例如,表达式 的结果是16 而不是 18 是因为乘号?(“*”)的优先级比?加号(“+”)高。必要时可以?用括号来强?制改变优先?级。例如:(1 18。下表从低到?高列出了运?算符的优先?级。 如下表,运算符优先?级 结合方向 运算符 (int)(float?) (strin?g) (array?) (objec?t) new注:尽管 的优先级高?,PHP仍旧允许类?似如下的表?达式:if foo()),在此例中foo() 4.3.2算术运算符? 还记得学校?里学到的基?本数学知识?吗?就和它们一?样。 表格:算术运算符? 例子 名称 结果 的余数。除号(“/”)总是返回浮?点数,即使两个运?算数是整数?(或由字符串?转换成的整?数)也是这样。 4.3.3 赋值运算符? 基本的赋值?运算符是“=”。你一开始可?能会以为它?是“等于”,其实不是的?。它实际上意?味着把右边?表达 赋值运算表?达式的值也?就是所赋的?值。

也就是说,“$a?=?3”的值是3。这样就可以?使你做一些?小技巧: hasbeen set 在基本赋值?运算符之外?,还有适合于?所有二元算?术和字符串?运算符的“组和运算符?”,这可以让你?在一个表达?式中使用它?的值并把表?达式的结果?赋给它,例如: wehad said: justlike 注意赋值运?算将原变量?的值拷贝到?新变量中(传值赋值),所以改变其?中一个并不?影响另一个?。这也适合于?你在在紧密?循环中拷贝?一些值例如?大数值。PHP 支持引用赋?值,用$var &$other?var;语法, 但在 PHP 中不可能这?样做。“引用赋值”意味着两个?变量都指向?同一个数据?,没有任何数?据的拷贝。有关引用的?更多信息见?引用的说明?。 4.3.4 位运算符 位运算符允?许对整型数?中指定的位?进行置位。如果左右参?数都是字符?串,则位运算符?将操作这个?字符 串中的?字符。 〈?php echo 12 Outpu?ts echo"12" Outpu?ts Backs?pace chara? cter (ascii? (ascii?49)) (ascii?57)) echo"hallo? Outpu?ts ascii?value? 表格:位运算符例子 名称 结果 Xor(按位异或)将在 的位设为1,反之亦然。

Shift?left(左移) Shift?right?(右移) 4.3.5比较运算符? 比较运算符?,如同它们名?称所暗示的?,允许你对两?个值进行比?较。你还可以参?考 PHP 类型比较表?看 不同类型?相互比较的?例子。 表格:比较运算符? 例子 名称 结果 等于TRUE,如果 全等TRUE,如果 等于$b,并且它们的?类型也相同?。(PHP 不等TRUE,如果 不等TRUE,如果 非全等TRUE,如果 不等于$b,或者它们的?类型不同。(PHP 大于TRUE,如果 小于等于TRUE,如果 大于等于TRUE,如果 以及很多其?它语言的操?作一样。〈?php Examp?le usage? Terna?ry Opera? tor $actio? (empty?($_POST? [?actio? ?defau?lt? $_POST?[?actio? ident?ical if/elsestate? ment (empty?($_POST? [?actio? ?defau?lt?; $_POST?[?actio? 对于表达式?(expr1?) (expr3?),如果expr1? TRUE,则此表达式?的值为expr2?,如果 expr1? FALSE?,则此表达式?的值为expr3?。

4.3.6 逻辑运算符? 逻辑运算符? 例子 名称 结果 And(逻辑与)TRUE,如果 都为TRUE。 Or(逻辑或)TRUE,如果 任一为TRUE。 Xor(逻辑异或)TRUE,如果 任一为TRUE,但不同时是?。 Not(逻辑非)TRUE,如果 不为TRUE。 And(逻辑与)TRUE,如果 都为TRUE。 Or(逻辑或)TRUE,如果 任一为TRUE。 “与”和“或”有两种不同?形式运算符?的原因是它?们操作的优?先级不同 4.3.7 字符串运算?符 有两个字符?串运算符。第一个是连?接运算符(“.”),它返回其左?右参数连接?后的字符串?。第二个是连?接 赋值运算?符(“.=”),它将右边参?数附加到左?边的参数后?。更多信息见?赋值运算符?。 conta?ins"Hello? World?!" conta?ins"Hello? World?!" 4.3.8 数组运算符? PHP 仅有的一个?数组运算符?是 运算符。它把右边的?数组附加到?左边的数组?后,但是重复的?键值不会被?覆盖。 array?("a"=〉"pear", var_d?ump($c);执行后,此脚本会显?示: array?(3) strin?g(5)"apple?" strin?g(6)"banan?a" strin?g(7)"cherr?y" 【本课小结】这一章主要?讲解了变量?、常量和运算?符的内容。其中变量中?我们要重点?掌握变量的?范围。在运算符中?我 们重点介?绍了运算符?的优先级,再分别介绍?了算术运算?符、赋值运算符?、位运算符、比较运算符?等。掌握 好这些?基本的内容?为以后的熟?练编程做好?基础的铺垫?。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!