1.认识php
php是服务端嵌入到HTML中的脚本语言。
php的功能包括但不限于:
- 收集表单数据
- 生成动态网页
- 字符串处理
- 动态输出图像
- 服务器端文件系统操作
- 编写数据库支持的网页
- 会话跟踪控制
- 处理XML文件
- 支持大量的网络协议
- 服务器端的其它操作
2.php语言标记
php可以和HTML进行混编,在编译的过程中,用 来表现php模式的结束。如下:
";
?>
可以将php语言嵌入到扩展名为php的HTML文件中的任何地方,只需要在文件中写入
3.解读开始和结束标记
当脚本中含有php代码时,可以使用、 ?>、<% %>来界定php代码;在嵌入纯变量时,还可以使用=variablename ?>这样的形式。其中,和总是可用的。另外两种是短标记和asp风格标记,可以在php的配置文件php.ini中打开或关闭。
一般情况下,我们使用的写法。
4.指定分隔符“分号”
与C、perl和java一样,php语句分为两种:
- 一种是结构定义语言,如流程控制、函数定义、类的定义等,在结构定义语句后面不能使用分号作为结束;
- 另一种是功能执行语句,如变量的声明、内容的输出、函数的调用等,这种语句也成为指令,php需要在每个指定后用分号结束。
一段php的结束标记?>隐含标识一个分号,所以一个pgp代码段的最后可以不用分号结束。
5.程序注释
注释是用来说明程序的内容或码农自己的备忘,不会被解释并执行。格式如下:
单行注释://或#
echo “注释示例”//这里是一个单行注释
多行注释:/* */
/*这里是多行注释第一行
这里是多行注释第二行 */
echo “注释示例”
除了以上注释方法,还可以在php脚本中实用以/**开头和*/结束的多行文档注释(PHPDocumentor)。
6.空白处理
一般来说,空白符(包括空格、Tab制表符、换行)在PHP中无关紧要,会被PHP引擎忽略。但应注意,空白符使用需以不引起代码混淆、提高程序可读性为目的。
7.变量
php中最基本的数据存储单位就是变量和常量,它们可以存储不同的数据类型。需要注意的是,php是一种弱类型检查的语言,变量或常量的数据类型由上下文决定。
7.1变量的声明
php的特性之一就是不需要在使用变量之前声明变量,可以直接在赋值的同时在变量名前加$符声明变量。
php
$a=100;//声明一个变量$a并赋值为整形数据值100
$b="string";//声明一个变量$b并赋值为字符串值"string"
$c=true;//声明一个变量$c并赋值为布尔值true
$d=99.99//声明一个变量$并赋值浮点型数据值99.99
?>
变量声明以后具有一定的使用范围,即作用域。
- 一般变量的作用域为声明处到文件结束
- 函数内部的作用域为函数内
- 变量的作用域也包括当前页面include和require引入的文件
- 如果使用Cookie或Session,变量还可以在多个页面中使用
在变量的使用范围内,可以用:
- unset()释放指定变量。
- isset()检测变量是否设置。注意如果变量被设置成NULL,将返回FALSE。
- empty()检测变量是否为空。如果是非空或非零的值,将返回false。即“”、0、“0”、NULL、FALSE、array()、var $var都被认为是空的,返回TRUE。
7.2变量的命名
php的变量名严格区分大小写。
但内置结构和关键字及用户自定义的类名和函数名是不区分大小写的,如echo、while、class,模糊成交额美好、function等都可以任意大小写。
虽然php的关键字可以在php中作为变量名使用,不过容易混淆, 因此不推荐这样做。
7.3 可变变量
一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置,而一个可变变量则可以获取一个普通变量的值作为自己的变量名。
7.5变量的引用赋值
变量总是传值赋值,也就是说,一个表达式的值赋值给另一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,当一个变量的值赋予另一个变量时,改变其中一个变量的值,不会影响到另外一个变量。
php还提供了另一种变量赋值方式:引用赋值。这意味着新的变量将直接引用原始变量(相当于原始变量多了个别名叫新变量),改变任意一个变量都会影响到彼此的值。因为没有执行复制操作,因此这种赋值方式更快,不过只有在密集循环或很大的数组或对对象赋值时才能注意到速度的提升。
使用引用赋值,只需要将一个&符加到将要赋值的变量前。
需要注意的是,只有有名字的变量才能引用赋值。
另外,php的引用不同于C语言中的地址指针,不是直接指向变量的内存地址,只是将各自值关联起来。基于这一点,使用unset()不会导致所有引用变量消失,仅仅是取消值关联。
8.变量类型
8.1类型介绍
php中支持8种原始数据类型:
- 四种标准量型:boolen、integer、float(浮点型,又成double)、string
- 两种符合类型:array、object
- 两种特殊类型:resource、NULL
为确保代码可读性,这里还会介绍一些伪类型,如mixed、number、callback。
8.2布尔型(boolean)
boolean代表了TRUE或FALSE,即真或假。在php进行比较运算和逻辑运算时,返回值都为布尔类型,她是构成php逻辑控制的判断依据。
在php中,布尔型不只有TRUE和FALSE两个值,当运算符、函数或流程控制需要一个boolean参数时,任何类型的值都会自动转换为布尔值,以下值被认为是FALSE,其它值(包括任何资源)都被认为是TRUE:
- 布尔值FALSE
- 整型0为假。注意,-1和任何非零值,都被任何是TRUE;
- 浮点型0,0;
- 空白字符串和字符串“0”;
- 没有成员变量的数组;
- 没有单元的对象(仅适用于php4);
- 特殊类型NULL(包括尚未设定的变量)。
8.3 整型(integer)
整型变量用于存储整数,不仅可以表示整数或者复数,也不是只有十进制,还可以用十六进制或八进制。。使用八进制,数字前必须加上0;使用16进制,数字前必须加上0x。
整型数值有最大的使用范围。长短与平台有关,32位操作系统最值为正负20多亿,具体为正负2 147 483 647。如果一个数值超过了integer的范围,会被解释为float。
8.4浮点型(float或double)
浮点数(也称双精度数或实数)是包含小数部分的数。通常用来表示整数无法表示的数,如金钱距离、速度等。浮点数的长度也是和平台相关的,允许的范围为1.7E-38~1.7E+38,精确到小数点后15位。
浮点数只是一种近似值,如果使用浮点数标识8,其结果内部其实类似7.99999999……所以不要相信浮点数结果精确到了最后一位,也不要比较两个浮点数是否相等。
如果确实需要更高的精度,应该使用任意精度数学函数或gmp()函数。
8.5字符串(string)
php没有给字符串的大小强加实现范围,所以一个人的名字、一首诗、一篇文章都可以定义成一个字符串。
字符串可以用单引号、双引号、定界符三种字面上的方法定义。这三种方法可以定义相同的字符串,但是在功能上有明显差别。
8.5.1单引号
指定一个简单字符串最直接的方法四用单引号 ' 括起来。
单引号中不能再包含单引号。
如果要在单引号中表示单引号需要用反斜线 \ 转义。
如果单引号之前或字符串结果需要出现一个反斜线,则需要两个反斜线表示。
在单引号中使用反斜线只能转义单引号和转义字符本身。
另外,在单引号字符串中出现的变量不会被变量的值替代。即php不会解析单引号中的变量,而是将变量名原样输出。
因此在定义简单字符串时,使用单引号效率会比较高,因为php解析时不会花费一些处理字符转义和解析变量上的开销,没有特殊需求的情况下,应使用单引号定义字符串。
8.5.2双引号
使用双括号 " 定义字符串时,可以使用更多特殊字符的转义序列。
另外,双引号字符中的变量名会被变量值代替,即可以解析双引号中的包含变量。它提供了解析变量、数组值或对象的方法。
8.5.3定界符
另一种给字符串定界的方法是使用定界符<<<。应该在<<<之后提供一个标识符开始,然后是包含的字符串,最后是同样的标识符结束字符串。结束标识符必须从行的第一列开始,并且后面不能包含其它任何字符,空格和空白制表符都不行。同时,定界符使用的标识符也必须尊混PHP中其它任何标签的命名规则:只能包含字幕、数字、下划线,而且必须以下划线或非数字字母开始。
8.6数组
数组是php中一种重要的复合数据类型。前面介绍的标准数据类型只能存入一个数据,而数组可以存放多个数据,并且可以存放任何类型的数数。php中的数组实际上是一张有序图。图是一种把values映射到keys的类型,此类型在很多方面进行了优化,因此可以把它当成真正的数组或列表(矢量)、散列图、字典、集合、栈、队列来使用,以及更多的可能性。
因为可以用另一个PHP数组作为值,也可以很容易的模拟树。这里仅做简要说明,之后的内容里会详细介绍。
PHP中可以使用多种方法构造一个数组,这里使用array()方法来新建一个数组,它接受一定数量的用逗号分隔的key=》value参数树。
value1,
key2=>value2
……
)
key可以使inter或string
value可以是任何值
*/
$arr=arr("name"=>"liunan",18=>true);//构造一个数组
echo $arr[18]//通过下标访问数组单个数据
?>
8.7 对象(Object)
对象和数组都是一种符合数据类型,但对象是一种更高级的数据类型。一个对象类型的变量,是由一组属性值和一组方法构成的。后面做详细介绍,此处简要说明。
要初始化一个对象,用new语句将对象实例化到一个变量中:
name="Tom";
$p->say();
?>
8.8 资源类型(resource)
资源是一种特殊类型的变量,保存了到外部资源的一个引用。资源是通过专门函数来建立和使用的。使用资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,并由程序员创建、使用和释放。任何资源在不需要时都应该被及时释放,如果程序员忘记了释放资源,系统将自动启动垃圾回收机制,以避免内存消耗殆尽。因此,很少需要用某些free-result函数来手工释放内存。
在下面的示例中,使用相应的函数创建不同的资源变量。如果创建成功,则返回资源引用赋给变量;如果失败则返回false,所以很容易判断资源是否创建成功。
8.9 NULL类型
特殊的NULL值标识一个变量没有值,NULL类型唯一可能的值就是NULL。NULL不表示空格,也不表示零,也不是空字符串,而是表示一个变量的值为空。NULL不区分大小写,在下列情况下一个变量被认为是NULL:
- 将变量直接赋值为NULL
- 声明的变量尚未赋值
- 被unset()函数销毁的变量
8.10 伪类型
伪类型并不是PHP语言的基本数据类型,只是因为PHP是弱类型语言,所以在一些函数中,一个参数可以接受多种类型的数据,还可以接受其他函数作为回调函数使用。常用的伪类型有:
- mixed:说明一个函数可以接受多种不同的(但不必须是所有的)类型。例如gettype()可以接受所有的php类型,str_replace可以接受赐福穿和数组。
- number:说明一个函数可以使integer或float
- callback:不仅可以是一个函数,也可以是一个对象的方法,静态类的方法也可以。一个php函数用函数名字符串来传递,可以传递任何内置的或者用户自定义的函数,除了array(),echo(),empty(),eval(),exit(),isset(),list(),print(),unset()。
9.数据类型之间的相互转换
类型转换是指将变量或值从一种数据类型转换成其它数据类型。转换的方法有两种:一种是自动转换,另一种是强制转换。
在PHP中可以根据变量的使用环境自动将其转换为最合适的数据类型,也可以根据需要强制转换为用户指定的类型。
因为PHP在变量定义中不需要(或者说不支持)明示的类型定义,变量类型由该变量的上下文决定,所以在PHP中如果没有明确的要求类型转换,都可以使用默认的类型自动转换。
9.1自动类型转换
每一个数据都有它的类型,具有相同类型的数据才能彼此操作。在PHP中,自动转换通常发生在不同数据类型的变量进行混合运算时。当参与运算的量类型不同,则自动转换后再进行运算。通常只有四种标量类型(integer、float、string、boolean)才能使用自动类型转换。注意,这并没有改变这些运算数本身的类型,改变的仅是这些运算数如何被求值。
自动类型转换虽然是由系统自动完成的,但在混合运算时,自动转换要遵循转换按数据长度增加的方向进行,以保证精度不降低。所以转换规则如下:
- 有布尔值参与运算时,TRUE将转换为整型1、FALSE将转换为整型0后再参与运算。
- 有NULL值参与运算时,NULL值将转换为整型0再参与运算。
- 有integer型和float型的值参与运算时,先把integer型变量转换为float再参与运算。
- 有字符串和数值型(integer、float)数据参与运算时,字符串先转换为数字,再参与运算。转换后的数字是从字符串开始的数值型字符串,如果在字符串开始的数值型字符串不带小数点,则转换为integer类型的数字;如果带有小数点,则转换为float类型的数字。例如,字符串“123abc”转换为123,字符串“123.45abc”转换为123.45,字符串“abc”转换为整数0。
9.2 强制类型转换
PHP的强制类型转换有两种,可以在需要转换的变量前加上用括号括起来的目标类型,也可以额用具体的转换函数,即intval(),floatval()和strval(),或是使用settype函数转换类型。
在括号中允许的强制类型转换如下。
- (int),(integer):转换成整型。
- (bool),(boolean):转换成布尔型。
- (float),(double),(real):转换成浮点数。
- (string):准换成字符串。
- (array):转换成数组。
- (object):转换成对象。
自PHP5起,如果视图将对象转换为浮点数,将会发出一条E_NOTICE错误。
9.3 类型转换细节
整数转换为浮点型,由于浮点型的精度范围远大于整型,所以转换后的精度不会改变。
浮点型转换为整型,将自动舍弃小数部分,只保留整数部分。如果一个浮点数超过整型数字的有效范围,其结果将是不确定的。整型的最大值约为2.147e9。
当字符串转换为数字时,转换后的数字时从字符串开始部分的数值型字符串,数值型字符串包括用科学计数法表示的数字。
NULL值转换为字符串,为空字符串“ ”。
9.4 变量的测试函数
一般情况下,我们实用var_dump()来查看某个表达式的值和类型。
gettype()函数可以用来确定变量的类型并返回一个包含变量类型名称的字符串。但是要查看某个类型,不要用gettype()函数,而要用is_type()函数,它是PHP提供的一些特定类型的测试函数之一。每个函数都使用一个变量作为参数,并返回true或者false。这些函数如下:
- is_bool():判断是否是布尔型
- is_int()、is_integer()和is_long():判断是否是整型
- is_float()、is_double()和is_real():判断是否是浮点数
- is_string():判断是否是字符串
- is_array():判断是否是数组
- is_object():判断是否是对象
- is_resource():判断是否是资源类型
- is_null():判断是否为空
- is_scalar():判断是否是标量,也可以使一个整数、浮点数、布尔型或字符串
- is_numeric():判断是否是任何类型的数字或字符串
- is_callable():判断是否是有效的函数名
10 常量
常量一般用于数据计算中固定的数值。在脚本执行期间,常量一旦被定义,就不能再改变或者取消定义。
常量的作用域是全局的,可以在脚本的任何地方声明和访问到常量。
另外,虽然变量和常量都是PHP的存储单元,但常量声明的类型只能是标量数据(boolean、integer、float和string)。
对于整型这种简单数据类型常量来说,要比声明变量效率高一点,但是字符串这种复杂数据类型的话就差不多了。
常量在php中非常多见,不仅可以自定义常量使用,更主要的是几乎每个PHP扩展中都默认提供了大量可供使用的常量,而且PHP也提供了一些比较实用的魔术常量。
10.1 常量的定义和使用
声明常量的声明变量的方式不同,在PHP中是通过define()函数来定义常量的。常量的命名与变量相似,也要遵循PHP标识符的命名规则。另外,常量同样大小写敏感,按照惯例常量名称总是大写的,但是不能加$符。define()函数的格式如下:
boolean define(string name,mixed value,[bool case_insensitive])
此函数的第一个参数为字符串类型的常量名,第二个参数为常量值或表达式,第三个case_insensitive是可选参数,如果设为TRUE,则常数将会定义成不区分大小写,默认是区分大小写的。
如果只想检查是否定义了某个常量,则用defined()函数。示例如下:
注意:如果使用一个没有声明的常量,则常量名称会被解析为一个普通字符串,但会比直接使用字符串慢近8倍左右,所以声明字符串时一定要加上单引号或双引号。
10.2 常量和变量
常量与变量都是PHP的存储单元,但名称、作用域及声明方式都有所不同。以下是常量和变量的不同点。
- 常量前面没有美元符号$。
- 常量只能用define()函数定义,而不能通过赋值语句定义。
- 常量可以不用理会变量范围的规则而在任何地方定义和访问。
- 常量一旦定义就不能被重新定义或取消定义,直到脚本结束自动释放。
- 常量的值只能是标量(boolean、integer、float、string这四种类型之一)。
10.3 系统中的预定义常量
PHP中除了自己定义常量外,还预定义了一系列系统常量,可以在程序中直接使用。
不过很多常量都是不同的扩展库定义的,只有加载了这些扩展库时才会出现。下表是常见的一些预定义常量:
10.4 PHP中的魔术常量
PHP中还有5个常量会根据他们使用的位置而改变,这样的常量在PHP中被称为“魔术常量”。另外,这些特殊常量不分大小写,PHP中常见的几个魔术常量如下:
使用如下:
PHP程序当前行数:".LINE;
echo "
当前PHP程序的版本:".PHP_VERSION;
echo "
当前操作系统:".PHP_OS;
?>
11 PHP中的运算符
运算符和变量是每种计算机语法中必须有的一部分,是一个命令解释器对一个或多个操作符执行某种运算的符号,也称操作符。
可以根据操作数的个数分为一元运算符、二元运算符、三元运算符。一元运算符只运算一个数,例如!(取反运算符)或++(加一运算符)。二元运算符可以运算两个值,PHP支持的大多数运算符都是这种二元运算符。而三元运算符只有一个(?:)。
如果按运算符的不同功能去分类,可以分为算数运算符、字符串运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和其它运算符。
11.1 算术运算符
算术运算符包括常见的加、减、乘、除、取余等。使用方法与数学运算符一样。
这里重点介绍一下“%”、“++”和“--”三个运算符。
求模运算也称取余运算,在PHP语言中求模时,会将两边的操作数转换为整型,然后求余数。在程序开发时使用求模运算通常有两个目的:第一个目的是做整除运算,如计算闰年时,能被4整除不能被100整除,或者能被400整除的就是闰年;另一个目的是让输入数不超过某个数的范围。例如,让一个随机数在10以内,就可以让这个随机数和10取余。
在编程中,最常见的运算时对一个变量进行加1或减1的操作。可以使用+=或-=。另外,PHP也提供了递增和递减运算符,即 ++ 和 - - ,常用于循环之中。
++ 和 - - 都可以在变量的前面使用,也可以在变量的后面使用,这样就决定了变量时先运算后赋值,还是先赋值后运算。
$a++,等同于$a=$a+1,先运算后赋值;
如下例:
++$a,等同于$a=$a+1,先赋值后运算;
记忆方法:$a++中,a在前先赋值,a在后后赋值。
另外,在处理字符变量的元数运算符时,沿用了Perl的习惯,而非C的。如在Perl中,‘Z’+1将得到‘AA’;而在C中将得到'['(ord('Z'==90,ord('['==91)。
字符变量只能递增,不能递减,并且只支持纯字母(az和AZ)。
11.2 字符串运算符
PHP中字符串运算符只有一个,是英文的句号(.),用于连接字符串。字符串与任何标量数据类型连接,得到的都是引得字符串。
11.3 赋值运算符
赋值运算符也是一个二元运算符,之前接触过最基本的赋值运算符=,用于将右边的值赋给左边的变量。另外,还有一些复合赋值运算符。
用例如下;
11.4 比较运算符
比较运算符也称关系运算符、条件运算符,是一种常用的二元运算符。比较的结果只能是布尔值TRUE或者FALSE。
比较运算符常用语if条件和while循环等流程控制语句中,用于判断程序执行的条件。
==和===的区别在于是否比较数据类型。
11.5 逻辑运算符
逻辑运算符用来判断真假,返回值为布尔值TRUE或FALSE。
与或非和异或。
11.6 位运算符
任何信息在计算机中都是以二进制数的形式保存的,位运算符允许对整型数中指定的位进行置换。
如果左右参数都是字符串,则位运算符将操作字符的ASCII值,浮点数也会自动转换为整型再进行与位运算。
位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
位运算虽然用于对操作数中的每个二进制位进行运算,可以完成一些底层的系统程序设计,但是在程序开发时很少用到,因为使用PHP程序很少参与到计算机底层的技术。
关于位运算的详情见官方文档:
http://www.php.net/manual/zh/language.operators.bitwise.php
11.7 其它运算符
除了以上运算符外,还有一些其它运算符用于实现特定功能:
三元运算符 ?:,可以提供简单的逻辑判断。示例:
执行运算符,反引号(``)。PHP将尝试将反引号中的内容作为操作系统命令来执行,并将其输出信息返回。
效果相当于函数shell_exec()。
错误控制运算符 @。将其放置在一个表达式之前,该表达式可能产生出的任何警告信息都会被忽略。
数组下标指定符号=>。通过此符号指定数组的键与值。
对象成员访问符号->。访问对象中的成员属性或成员方法。
instanceof。类型运算符,用来测定一个给定的对象是否来自指定的对象类。
11.8 运算符优先级
所谓的优先级,是指在表达式中哪一个运算符应该先计算。
如果运算符优先级相同,则使用从左到右的左联顺序。
优先级相同的运算符,此时他们的家结合方法决定求值顺序。
一般不强记优先级,通常使用小括号()改变表达式的优先级更加易懂。
11.9 表达式
在PGP中,几乎所编写的任何代码都可以看做一个表达式,通常是变量、常量和运算符号的组合。简单却精确的定义一个表达式的方式就是“任何有值的东西”。
- 最基本的表达式形式是常量和变量,例如赋值语句$a=5。
- 稍微复杂的表达式就是函数,例如$a=foo()。
- 算术运算符中的前、后递增递减也是,例如$a++、$--a。
- 常用的表达式类型是“比较表达式”,例如$a>5、$a<=5。
- 组合的运算赋值也是常用的表达式,例如$a+=5。
- 三元运算符(?:)也是一种表达式,例如$v=($a?$b=5:$c=10)。