(003)系统学习PHP之基础语法

和通通一起学习 PHP

【本文目标】

了解PHP标识符

熟悉PHP编码规范

掌握常量的使用方法

掌握变量的使用方法

掌握数据类型

掌握运算符的使用方法

掌握流程控制的使用方法

【正 文】

[ 1 ]

PHP标记

当解析一个文件时,PHP 会寻找起始和结束标记,也就是,这告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略。以下将介绍 PHP 的几种标记符。

1.1 XML风格(默认)

1.2 简短风格(short style)

1.3 SCRIPT 风格

1.4 ASP 风格

注意: 简短风格 和 ASP 风格需要在 php.ini 配置文件中打开或关闭,打开方法是将选项 shor_open_tag 和 asp_tags 选项赋值 on 。如果你安装的是 PHP7 ,你会发现找不到 asp_tags 代码,那是因为 PHP7之后, 后两种标记风格(SCRIPT 风格、ASP 风格)被取消了,所以建议使用 XML 风格;还有如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。

[ 2 ]

PHP编码规范

由于现在的WEB开发往往是多人一起合作开发完成的,因此使用相同的编程规范显得非常重要,特别是新的开发人员参与时,通常需要知道前面开发代码中变量或函数的作用等,这就需要统一的编码规范,主要包括文件组织、缩进、注释、声明、空格处理、命名规则等。

2.1 指令分隔符

同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。一段 PHP 代码中的结束标记隐含表示了一个分号,在一个 PHP 代码段中的最后一行可以不用分号结束。如果后面还有新行,则代码段的结束标记包含了行结束。

2.2 缩进

使用Tab键来缩进,每个Tab键长度设置为4个空格;

2.3 关键字

PHP的关键字,必须小写,boolean值:true,false,null 也必须小写。

2.4 命名

(1)、类名使用大驼峰式(StudlyCaps)写法;

(2)、(类的)方法名 使用小驼峰(cameCase)写法;

(3)、函数名使用 小写字母 + 下划线 写法,如 function http_send_post();

(4)、变量名 使用小驼峰写法,如 $userName;

2.5 注释

PHP 支持三种注释风格,分别是 C++ 风格、shell 风格、以及C 风格;

//这是类似 C++ 风格的单行注释;

# 这是类似 shell 风格的单行注释;

/* 这是类似 C 风格 的多行注释块 它横跨了多行*/

注意 : 单行注释不可以出现?> ,否则会被PHP编译器识别为PHP程序的结束符。这意味着在 // … ?> 或者 # … ?> 之后的 HTML 代码将被显示出来:?> 跳出了 PHP 模式并返回了 HTML 模式。

另外必须遵守 phpDocument 注释规则,更多更纤细的注释规范请参考:phpDocument官网

[ 3 ]

PHP 常量

在 PHP 中,常量是一旦声明就无法改变的值,具有全局性,但只能存储布尔值、整形、浮点型和字符串数据。

3.1 声明和使用常量

PHP 通过 define() 命令来声明常量,格式如下

define("NAME",$value,[TRUE]); //如果第三个参数为true,则不区分大小写,默认是区分大小写的;

在 PHP 5.3.0 后可以这样定义;

const CONSTANT = 'Hello World';

Note:和使用 define() 来定义常量相反的是,使用const关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及if语句之内用const来定义常量。

3.2获取常量的值

可以简单的通过指定其名字来取得常量的值,如果常量名是动态的,也可以用函数constant()来获取常量的值。

另外,使用defined()可以检测常量是否已定义,使用get_defined_constants()函数可以获得所有已定义的常量列表。

3.3内置常量

__LINE__ : 文件中的当前行号。

__FILE__ : 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

__DIR__: 文件所在的目录。等价于 dirname(__FILE__)。

__FUNCTION__ : 返回该函数被定义时的名字(区分大小写)。

__CLASS__ : 返回该类被定义时的名字(区分大小写)。

__TRAIT__ : 返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域。

__METHOD__: 返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__: 当前命名空间的名称(区分大小写)。

[ 4 ]

PHP 变量

变量像一个贴有名字标签的空盒子,不同的变量类型对应不同种类的数据,就像不同种类的东西要放入不同种类的盒子。PHP 中的变量不同于 c 或Java 语言,因为它是弱类型的,在 c 或 Java 中需要对每一个变量声明类型,但在 PHP 中不需要这样做。

4.1PHP的命名规则

变量以 $ 符号开头,其后是变量的名称

变量名称必须以字母或下划线开头

变量名称不能以数字开头

变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)

变量名称对大小写敏感($y 与 $Y 是两个不同的变量)

$this 是一个特殊的变量,它不能被赋值。

4.2 PHP变量作用域

local(局部),函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。

global(全局),函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。

static(静态),静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。常用于递归函数中;

4.3 PHP 的赋值

直接赋值:使用“=”直接赋值给变量;

传值赋值:当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。

引用赋值:$a=”aa”; $b=&$a; 则改变$a的值,$b也变化。不同:存储结构是分开的,即使unset($a),$b还在(区分C语言)。

4.4 可变变量

可变变量是一种独特的变量,它允许动态的改变一个变量的名称,其工作原理是该变量的名称由另外一个变量的值来确定。 实现过程就是在变量的前面多加一个美元符号”$”

$a = "hello";//定义一个普通变量

$$a="world";//定义一个可变变量,$$a可以拆分为$和$a两部分,$a的值是hello,那么$$a就等于$hello

echo "$a $hello";//结果输出:hello world

echo"$a ${$a}";//结果输出:hello world

普通变量$a的值时hello,可变变量$$a的值时world. 也就是说$$a和$hello是等价的,值都为world。

4.5 预定义变量

$_SERVER — 服务器和执行环境信息

$_GET — HTTP GET 变量

$_POST — HTTP POST 变量

$_FILES — HTTP 文件上传变量

$_REQUEST — HTTP Request 变量

$_SESSION — Session 变量

$_ENV — 环境变量

$_COOKIE — HTTP Cookies

$php_errormsg — 前一个错误信息

$HTTP_RAW_POST_DATA — 原生POST数据

$http_response_header — HTTP 响应头

$argc — 传递给脚本的参数数目

$argv — 传递给脚本的参数数组

4.6 变量的销毁

当用户创建一个变量时,相应地在内存中有一个空间专门用于存储该变量,该空间的引用计数加 1 。当变量与该空间的联系被断开时,空间计数减 1 ,直接引用计数为 0 ,则成为垃圾。PHP 有自动回收垃圾的机制,用户也可以手动销毁变量,通常使用 unset() 函数实现。

[ 5 ]

PHP 变量类型

不同的数据类型其实就是所存储数据的不同种类,PHP中存在这 9 中数据类型:

四种标量类型

boolean(布尔型),只有TRUE、FALSE两个值。

integer(整型),整数,默认取值(-2147483648,2147483648)。

float(浮点型,也称作 double),实数,大小为8个字节。

string(字符串),表示印号之间的字符,注意“双引号”和‘ 单引号’的区别。

三种复合类型

array(数组),PHP变量的集合。

object(对象),一个类的实例。

callable(可调用),回调。

两种特殊类型

resource(资源),表示PHP扩展资源,例如打开文件、数据库连接等。

NULL(无类型),仅有null这一个值。

注意:如果想查看某个表达式的值和类型,用var_dump() 函数。如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype() 函数。要检验某个类型,不要用 gettype(),而用is_type函数。

关于is_type 函数:

is_array-- 检测变量是否是数组

is_bool-- 检测变量是否是布尔型

is_callable-- 检测参数是否为合法的可调用结构

is_double-- is_float() 的别名

is_float-- 检测变量是否是浮点型

is_int-- 检测变量是否是整数

is_integer-- is_int() 的别名

is_long-- is_int() 的别名

is_null-- 检测变量是否为 NULL

is_numeric-- 检测变量是否为数字或数字字符串

is_object-- 检测变量是否是一个对象

is_real-- is_float() 的别名

is_resource-- 检测变量是否为资源类型

is_scalar-- 检测变量是否是一个标量

is_string-- 检测变量是否是字符串

如果要将一个变量强制转换为某类型,可以对其使用强制转换或者 settype() 函数。关于强制转换:

(int), (integer)- 转换为整形 integer

(float), (double), (real)- 转换为浮点型float

(string)- 转换为字符串string

(array)- 转换为数组array

(object)- 转换为对象 object(unset) - 转换为NULL(PHP5)

(bool), (boolean)- 转换为布尔类型 boolean

TRUEFALSE。两个都不区分大小写。 当转换为 boolean 时,以下值被认为是FALSE

布尔值FALSE本身

整型值 0(零)

浮点型值 0.0(零)

空字符串,以及字符串 “0”

不包括任何元素的数组

特殊类型 NULL(包括尚未赋值的变量)

从空标记生成的 SimpleXML 对象

所有其它值都被认为是TRUE

字符串、数组、对象都非常重要,后面需要专题研究·,敬请关注。

[ 6 ]

PHP 运算符

PHP 包含多种类型的运算符,统计如下:

算数运算符:+ – * / % ++ – --

连接运算符: .

赋值运算符: =, +=,-=,*=,/=,%=,.=

比较运算符:>,

逻辑运算符: and,&& ; or, ; not,! ; xor(逻辑异或,两边不同返回TRUE,相同返回FALSE)

位运算符 : & ;;^(异或,不同返回1);~(非运算符,1.0取反);右移左边空出的补0

错误控制运算符:@(屏蔽错误信息生成)

三目运算符:“...?...:...”

运算符的优先级

运算符优先级指定了两个表达式绑定得有多“紧密”。例如表达式1 + 5 * 3的结果是16而不是18是因为乘号(“*”)的优先级比加号(“+”)高。必要时可以用括号来强制改变优先级。例如:(1 + 5) * 3的值为18。

如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么1 - 2 - 3就等同于(1 - 2) - 3并且结果是-4. 另外一方面,"="是右联的,所以$a = $b = $c等同于$a = ($b = $c)。

没有结合的相同优先级的运算符不能连在一起使用,例如1 < 2 > 1在PHP是不合法的。

但另外一方面表达式1

括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。

[ 7 ]

PHP 流程语句

流程控制也叫控制结构,它决定了某个程序段是否会被执行和执行多少次,PHP 中的控制语句分为 3 类:顺序控制语句、条件控制语句、循环控制语句。其中,顺序控制语句是从上到下依次执行的,这种结构没有分支和循环,是PHP 中最简单的结构,下面要讲述的是条件控制语句和循环控制语句。

if 语句– 如果指定条件为真,则执行代码

if…else 语句– 如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码

if…elseif….else 语句– 选择若干段代码块之一来执行

switch 语句– 使用 Switch 语句可以避免冗长的 if..elseif..else 代码块。

while– 只要指定条件为真,则循环代码块

do…while– 先执行一次代码块,然后只要指定条件为真则重复循环

for– 循环代码块指定次数

foreach– 遍历数组中的每个元素并循环代码块

7.1 if语句

if ($a > $b) { ... }

7.2 if…else语句

if ($a > $b) { ... } else { ... }

7.3 if…elseif….else语句

if ($a > $b) { ... } elseif ($a == $b) { ... } else { ,,, }

7.4switch语句

类似于具有同一个表达式的一系列if语句。下面使用两种不同方法实现同样的事,一个用一系列的if和elseif语句,另一个用switch语句:

if ($a == 5): ... elseif ($a == 6): ... else: ... endif;

switch ($i) { case 0: ... break; case 1: ... break; case 2: ... break; }

7.5while循环

$i = 1; while ($i

7.6 do…while循环

$i = 0; do { echo $i; } while ($i > 0);

注意 : while循环和do…while循环除了判断条件的位置不同外,还有一个区别就是do…while循环要在语句的尾部加上分号(;);

7.7 for循环语句

$people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) ); for($i = 0;$i < count($people);++$i) { $people[$i]['salt'] = rand(000000, 999999); }

以上代码可能执行很慢,因为每次循环时都要计算一遍数组的长度。由于数组的长度始终不变,可以用一个中间变量来储存数组长度以优化而不是不停调用 count():

$people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) ); for($i = 0,$size = count($people);$i < $size; ++$i) { $people[$i]['salt'] = rand(000000, 999999); }

7.8 foreach 循环语句

foreach语法结构提供了遍历数组的简单方式。foreach仅能够应用于数组和对象,

有两种语法:

foreach (array_expression as $value) statement /* 将数组中的值遍历赋于$value */ foreach (array_expression as $key => $value) statement /* 将数组的键遍历赋于$key,将数组的值遍历赋予$value */

7.9 include 和 require

include() 每次执行文件都要进行读取,如果文件不存在,会给出一个 warning,但脚本会继续执行;

require() 文件只处理一次,这就意味着如果可能执行多次的代码,则使用require()效率比较高;

include_once() 与 include() 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。

require_once() 与 require() 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。

不同点:

对 include() 来说,在 include() 执行时文件每次都要进行读取和评估;如果文件不存在,会给出一个 warning,但脚本会继续执行;require()不能有条件的包含文件。使用require()语句包含的文件不能有返回值。

对 require() 来说,文件只处理一次(实际上,文件内容替换了 require() 语句。如果文件不存在,会报出一个 fatal error 脚本停止执行;

应用:

require 的使用方法如 require(“./inc.php”);通常放在PHP程式的最前面,PHP程式在执行前,就会先读入 require 所指定引入的档案,使它变成PHP 程式网页的一部份。

include 使用方法如 include(“./inc.php”);一般是放在流程控制的处理区段中。PHP程式网页在读到 include 的档案时,才将它读进来。这种方式,可以把程式执行时的流程简单化。

理解:require 相当于文件内容替换require()语句,只加载一次以后都在那里,当是不能重复加载;否则报错停止代码运行;include相当于运行一次脚本就加载一次文本内容,加载之后又需要重新加载,所以理论上require的效率更高,由此特性可区分报错级别与运用域;

7.10 其它语句:

continue 跳过当前循环,循环还在继续

break 跳出当前循环,循环终止;

exit 终止当前脚本,这行代码后边的代码不执行;

return 立即结束此函数的执行并将它的参数作为函数的值返回。

goto操作符可以用来跳转到程序中的另一位置。通常的用法是用goto代替多层的break。

【END】

以上是今天的全部内容

如果内容对您有所帮助

不要忘记在下方点“”

感谢您的收看,敬请关注下一章节

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180215G00HYG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券