php基本语法
1. 四种不同的开始结束标记
只有<?php ?>、<script language="php"></script>两个总是可用,剩下的<? ?>、<% %>需要在php.ini中配置。即分别开启php.ini中的short-open-tag和asp-tags即可,默认情况下,它们被禁用,而且移植性较差,不推荐使用。
2. 指令分隔符“分号”
末尾的php代码段后面的“;”也可以不要,当使用输出缓冲和include()或者require()省略会更好。
3. 注释
书写恰当的注释是一种良好的习惯。php注释包括多行注释“/* */”,单行注释“//”与“#”,多行注释之内不能嵌套另一个多行注释,其他情况随意搭配都可。
4. 空行
空行可以展示代码层次的美感。比如一个源文件的两个代码片段使用两个空行,两个类的声明之间也是用两个空行。比如,两个函数声明之间用一个空行,函数内局部变量与第一条语句之间用一个空行,块注释或单行注释之前还有一个函数内的两个逻辑代码段之间都是用一个空行。运用空格的情况有,参数列表的逗号后面空格,运算符与操作数之间,for语句表达式逗号后面等。
5.变量
php最基本的存储单元是变量和常量,可以存储不同类型的数据。由于它是弱类型语言,变量的数据类型由上下文或者运行时决定。
5.1 变量声明
“$”后跟变量名,并用“=”赋值,当第一次给一个变量赋值,才创建了这个变量(只是声明,没赋值呢?)。大部分变量如果不是在函数内部声明的,只有在声明处到文件结束的一个单独的范围使用。这里的单独范围不仅包含<?php 到?>,他可以在一个页面的所有开启的php模式下使用,也包含用include和require引入的文件。如果使用cookie或session则还可在更多的页面使用。
可使用unset()释放指定的变量,使用inset()检测变量是否已设置(存在声明),使用empty()检查是否为空。
5.2 变量命名
变量名区分大小写,但是内置结构和关键字以及用户自定义的类名和函数名却不区分大小写。变量名以字母下划线开头,后面是任意的字母,数字,下划线。
5.3 可变变量
可将一个已定义的变量的值作为另一个变量的名字,如:hi="hello";hi="world";则echo"hi hello"与"hi {hi}"结果都是”hello world“。
5.4 变量的引用赋值
即在变量名前加“&”,相当于c中的取址操作,将变量地址赋给两一个变量,两个变量共同指向同一个值。只有有名字的变量才可以进行取址赋值,形如(3*9)或函数返回的值都不能。
6. 变量的类型
强类型语言在定义变量或常量前需要指定类型,而php是弱类型语言,具体类型取决于应用时的上下文。
6.1 类型介绍
php支持8种原始类型和一些伪类型。原始类型如下:
四种标量类型 | boolean(布尔型) | |
integer(整形) | ||
float(浮点型,也称double) | ||
string(字符型) | ||
数据类型 | 两种复合类型 | array(数组) |
object(对象) | ||
两种特殊类型 | resource(资源) | |
NULL |
变量类型由上下文决定,可以使用var_dump()查看某变量的类型和值。
6.2 布尔型
php中进行关系运算或逻辑运算时返回的都是布尔值。下列情况下的值,默认为是布尔值中的false:
布尔值false,0,0.0,空白字符串或“0”,没有成员变量的数组,没有单元的对象(适用于php4),特殊类型null(包括尚未设定的变量)。
6.3 整形
整形字长和平台有关。可用“+”,“-”表示正负,整数可省略“+”;可以用“0”和“0x”指定八进制或十六进制,但是结果都是以十进制输出;不支持无符号整数,最大整数为2 147 483 647,最小为-2 147 483 647,超出则按照float类型处理。
6.4 浮点型(float或double)
浮点数字长也和平台有关。范围在1.7E-308~1.7E+38,精确到小数点后15位。它只是一种近似的值,永远不可能精确到最后一位,如表示8,内部表示为7.9999999...。也因此,无法表示两个浮点数是否相等,即使是字面量相等的两个浮点数,内部表示也不一样,导致比较的结果出人意料。此时可使用任意精度数学函数或gmp()函数。
6.5 字符串
字符串长度没有限制,可以使用单引号,双引号,定界符三种字面上的方法定义,但是它们具有功能上的差异。
6.5.1 单引号
单引号内可使用转义字符“\”转义单引号和转义字符本身,不能转义其他特殊字符,否则原样输出。出现在单引号内的变量也不会被变量值取代,只是将变量名输出。使用单引号定义字符串时效率最高,因为省去了php解析时的字符处理转换和变量解析的开销。
6.5.2 双引号
可转义更多特殊字符,可解析字符串中的变量,可使用{}将变量名分离出来再解析(“{beer}s” 或 “{beer}s”)。
6.5.3 定界符
$string<<<EOT /文本/ EOT; 结束处的EOT顶头第一列写,后面只能跟着分号作为结束。
6.6 数组
php中的数组实际是一个有序图,把values映射到keys,values可以是任何php允许的类型值。
6.7 对象
和其他面向对象语言类似的对象类型,不过在声明使用细节上有差异。
6.8 资源类型
资源类型保存了一个到外部资源的引用,通过专门的函数建立并使用,保存有打开文件,数据库连接,图形画布区域等的特殊句柄,并由程序员创建,使用,释放。
6.9 null
null表示一个变量没有值,null类型唯一可能的值就是null,null不表示空格,不表示零,也不是空字符串,而是表示一个变量值为空。不区分大小写,一下情况变量视为null:将变量直接赋值null,声明的变量尚未赋值,使用unset()销毁的变量。
6.10 伪类型
mixed
number
callback
6.11 数据类型之间的转化
自动类型转换
强制类型转换
变量类型测试函数:is_boolean(),is_int()等。
7. 常量
常量是一个简单值的标识符,脚本执行期间,一旦定义就不能被改变或取消定义。作用域是全局的,可在脚本任何地方声明和访问。常量只能包含类型如boolean,integer,string,float几种标量数据。
7.1 定义和使用
默认大小写敏感,通常使用大写,但是不加$,使用define()函数定义,如define(string name,mixed value[,boolean case_insensitive])。第一个参数是名称,第二个是值,第三个可选,表示是否大小写敏感。可使用defined()检查是否定义了某常量。
7.2 常量和变量的区别
• 常量前没有$
• 只能用define()定义,不能通过赋值语句
• 不用理会变量范围的规则而在任何地方定义使用
• 一旦定义就不能重定义或取消定义
• 值只能是特定的标量
7.3 预定义常量
php中预定义了一系列常量,不区分大小写,可在程序中直接使用完成一些特殊功能。它们有不同的扩展库定义,使用前应加载这些库。有些常量根据使用的位置而变,如_LINE_根据在脚本中的行来决定。
8. 运算符
算数运算符(+,-.*,/,%,++,--)
字符运算符(.) 可连接字符,相当于java中的"+"。
赋值运算符(=,+=,-=,*=,/=,%=,.=)
比较运算符(>,<,>=,<=,==,===,<>/!=,!==)
逻辑运算符(and/&&,or/||,not/!,xor)
位运算符(&,|,^,~,<<,>>)
其他运算符(?:,‘‘,@,=>,->,instanceof)
优先级
9.表达式
简单定义表达式概念就是"任何有值的东西",无值可视为声明。
10. php的语言结构
任何语言都有三种结构:顺序,分支,循环。
分支结构
if、if...else...、if...elseif...else...、switch case...
循环结构
while、do...while、for
特殊控制语句
break、continue、exit(只要执行到exit(),无论它在那个结构都会直接退出当前脚本die()是exit()的别名,可带参数输出一条信息并退出)。
11. php的函数
11.1 函数定义
函数是一个被命名的、独立的代码段,执行特定任务,并可能返回一个值。
11.2 自定义函数
定义
function fname(参数列表){
语句;
return ;
}
调用
如果函数不被调用就不会执行。函数名称有三个作用:
• 通过函数名称调用函数
• 用来传递参数
• 代表返回值
参数
返回值
11.3 函数工作原理与结构化编程
仅当函数被调用,函数中的语句才会被执行。执行完成后,控制权将返回到调用函数的地方。结构化编程中将任务划分为数个小模块,而每个小模块就是一个函数。
12. php变量的范围
大部分php变量只有一个单独的范围,这个单独范围跨度同样包含include和require引入的文件。变量的有效范围依据声明的位置分为局部变量和全局变量。
局部变量
在函数内部声明的变量和函数的参数,都是局部变量,在函数执行结束后,函数内部变量都被释放。
全局变量
全局变量是在函数外部定义的,作用于为从定义开始到本程序文件结束。php中,函数中局部变量会覆盖同名的全局变量,此时可以在引用的全局变量前加上global关键字,或者使用GLOBALS数组,这个数组是运行时自动创建,用于存放全局作用域内的所有变量,通过索引就可以引用。
静态变量
局部变量在存储方式上分为动态存储和静态存储。函数中的局部变量如果不是显式的声明为static类型,默认为动态分配存储空间,在函数调用结束后自动释放空间。这时,如果希望函数执行完成后,其内部变量依然存在内存中,应使用static将该变量修饰为静态变量。改变量在函数第一次被调用时初始化,之后留在内存。
13. 参数传递
php参数传递方式包括按值传递和引用传递,而且还支持默认参数和任意参数列表的传递方式。
值传递
父程序调用函数时,函数有自己的内存区,父程序直接传递变量或是值给函数使用,这时候父程序的变量和传递进函数的变量已经不在同一个地方存放,所以函数对参数的任何操作都不会影响父程序的变量或值。例如:
1 <?php
2
3 function test($arg){
4
5 $arg = 100;
6
7 }
8
9 $var = 300;
10 echo $var;
11 test($var);
12 echo $var;
13
14 ?>
第9行$var存放在全局php所在内存中,将它的值传递给方法后,方法会在属于自己的内存区划出一块用于存放通过参数传递进来的变量值。假设一个在A区,一个在B区,那么函数操作的值在B区,并不能影响A区那个值,因为他们不是同一个值。但是引用传递就不同了。
引用传递
引用传递则是将变量在内存中的相对地址传递给函数,此时,函数操作的值和父程序变量是同一个值,那么函数对传进的参数的修改会影响父程序变量。要进行引用传递,只需在参数前加&,相当于c中的取址运算符。
1 function test(&$arg){
2 }
函数的默认参数
允许定义函数时,指定参数的默认值,如:
1 <?php
2
3 function test($name,$age=10){
4 }
5 function show($name="bob hu",$age=10){
6 }
7
8 test("bob hu");
9 test("bob hu",12);
10 show();
11 ?>
这时,test函数参数age指定了默认值,可以不传,但是name必传。而show函数两个参数都有默认值,可以直接调用,也可传参调用。很多系统函数的前面几个参数是必选项,后面却是可选项,定义的方式就像test函数,如printf(),mysql_query()等。
可变长度参数列表
即,可以传递多于形参个数的实参,这时可在函数内部通过func_get_args()获得一个包括所有实参的数组,也可以通过func_num_args()获得实参个数。该功能类似于javascript函数内部的arguments属性。系统函数array()(难怪,数组可以不预先声明长度,直接加入任意个数元素),echo()等参数都可变长度。
14. 变量函数
类似于javascript中将函数赋给变量,php也有这样的功能,如:
1 <?php
2
3 function test($name,$age=10){
4 }
5
6 $func = "test";
7 $func("bob");
8
9 ?>
(函数名也是地址?)
15. 递归函数
自己内部间接或直接的调用自己。
16. 使用自定义函数库
使用自己定义的函数,可以将这些函数放在文件中,用时,通过一些结构方法包含进来。比如:
1 <?php
2
3 require("bob.php");
4
5 if(true){
6 include("hu.txt");
7 else{
8 include "hu.php";
9 }
10
11 require "bob.txt";
12
13 ?>
区别是,require在脚本执行前就会检查并将文件加载进来,而include在执行时用到的时候才加载。另外,require_once()和include_once()保证某文件只加载一次,不重复加载。
17. 使用系统函数库
要使用系统的函数,就必须引入扩展包或程序库模块,通过phpinfo()和get_loaded_extensions()可以得知php加载了哪些扩展库。