PHP进阶之路 --  PHP基础语法

  1. windows环境下php环境
  2. php定界符 
  3. php变量 
  4. php数据类型
  5. 数据类型转换
  6. 检测数据类型
  7. php中三种输出方式
  8. php字符集设置
  9. php常量
  10. php字符串
  11. php运算符 
  12. php数组
  13. php超全局变量
  14. php流程控制 
  15. php函数 
  16. php魔术常量 

一、windows环境下php环境

搭建环境对于每个开发者来说,是必须要掌握的技能,但是对于刚刚接触开发没多久的同学来说,完全没有必要把大把的时间花费在搭建环境的身上,想要学习搭建环境,完全可以等到后期再来研究,在学习的初期,完全可以怎么方便怎么快就怎么来。

在windows中,可以选择单独安装环境,也可以选择安装集成环境。

但是有意思的是,我们如果单独的下载php环境需要的文件,会发现任何一个文件都超过百M,但是如果我们安装集成环境,你会发现集成环境的大小都要远远小于独立下载的文件。而出现这种情况的原因是因为独立的文件里面包含了软件的全部服务,而我们单独下载的集成环境则省略了很多内容,所以才导致文件大小不同。

那么对于刚刚入行的学员来说,采用集成环境能够减少配置繁琐环境的时间以及不必要的麻烦。

目前国内比较好用的集成环境有很多,例如,wampserver ,phpstudy等等.在本次授课中,推荐使用phpstudy这款集成环境,中文界面,可以调整多个版本的php等等。

在安装完成之后需要对系统的环境变量进行配置,将php目录路径和mysql目录路径写入到环境变量当中,从而保证开发中的使用。

二、php定界符

php能做很多事,但是目前来讲,更多的是进行web开发,所以说php会经常和html打交道,而php是可以放在html代码的任何位置,以<? 开始,以?>结束。但是需要注意的是,php和html代码结合 存储代码的文件后缀必须是.php。

 文件后缀必须是.php
<!doctype html>
<html>
<body>
<h1><?php echo "hello,world" ?></h1>
</body>
</html>

三、php变量

在很多的语言中,变量都是至关重要的一项。

变量主要存储数据,从而方便开发者们的逻辑业务处理。

php程序中声明一个变量使用$这个美元符号来表示,例如$a,就是采用美元符号加变量名组合的形式来声明变量。变量一旦声明之后会被存储在内存中,直到脚本结束自动销毁或者人为销毁。

声明一个变量通常情况下需要遵循一些规则,例如:

  1. 变量以$开始,后面跟着变量的名称
  2. 变量名必须以数字字母或者下划线开始
  3. 变量名只能包含数字字母下划线
  4. 变量名不能包含空格
  5. 变量名是区分大小写的,例如$y 和 $Y 是完全不一样的两个变量

通常情况下,我们使用变量是为了存储数据,而变量本身并没有意义。

php本身是一门弱类型语言,所以,我们在给变量进行赋值的时候,变量的类型会随着值得变化而变化。

例如:

  $a = hello; // string  

  $a = array(); // array   

我们在程序开发的时候,通常需要预留变量,简单的说就是我们可能预料到在后期会用到一个变量用做存储数据,那么我们就可以提前声明变量,但是变量暂时并不需要值,这个时候我们就可以给变量赋值为null。

变量作用域

作用域的意思是说变量的生效范围,在php中存在四个范围:local(局部作用域)、global(全局作用域)、static(静态)、parameter(参数)。

首先来说一下全局作用域和局部作用域:

  在一个php文件中,如果在函数外面声明的变量,就是全局变量,作用域范围为全局;而在函数内部声明的变量就是局部变量,作用域仅限于函数内部。

那么作用域范围对php有什么影响吗?

  有的,例如,局部变量只能在函数内部使用,在函数外部将无法使用,那么无法使用的原因是因为当函数执行完毕之后这个变量就已经被销毁了。

再说全局变量,全局变量可以在函数中使用,但是必须通过global关键字来使用,否则系统会抛出错误提示。

而static则表示静态变量。能够让变量停止销毁。

上面的代码输出结果为 2 , 2。如果此时$a 变为static:

那么输出结果为2 , 3 。

原因是static 变量能够让变量即使在函数被销毁的情况下也能得以保存。

最后说一下函数的参数,函数的参数因为函数的限制,所以只能够在函数内部使用,所以说函数参数的作用域也仅仅停留在函数当中,相当于局部变量。

四、数据类型

数据是一个项目或者说一个网站的核心,而前后端的通信说白了就是对数据操作。而对于不同的开发语言来说,为了实现自己某些特性,都会在基础的数据类型上进行更改,但是从宏观来看,其实很多语言的数据类型都是很相似的。

在php中,存在的数据类型如下:

  • string 字符串
  • integer 整型
  • float 浮点
  • boolean 布尔
  • array 数组
  • object 对象
  • null 空值
  • resource 资源

上面的8种数据类型种,复合类型有array 和 object ,两种特殊类型为resource 和 null。

数据类型简单介绍

字符串类型:    

  字符串类型是比较常见的类型,创建一个字符串主要通过单引号或者双引号来进行创建,虽然二者都是用来创建字符串类型,但是还是有一定的细微的区别。

  通过单引号创建的字符串,是不可以解析变量的,但是功能的缺失却换来了速度的提升,所以说,如果在字符串中没有需要解析的变量,那么就使用单引号是最好的。

  而双引号的创建的字符串,因为可以解析变量,所以在某些对字符串的操作时是经常使用的。

    $a = “hello,world!”;

    $b = ‘how are you ?’;

    $c = “lilei,$a”; // 输出的结果为lilei,hello,world!

整型:  

  整数,顾名思义,就是没有小数位的数字。

  那么php对于整数的定义也有着一些需要注意的规则:

    ①整数必须至少有一个数字

    ②整数不能包含逗号或者空格

    ③整数不能有小数点

    ④整数正负均可

    ⑤可以用三种格式规定整数:十进制、十六进制、或者八进制。

浮点: 

  浮点数就是有小数点或者指数形式的数字。

  在使用的过程中,浮点数既可以用来存储小数,也可以用来存储整数。

布尔:  

  布尔型在任何一门语言当中都是比较常见的数据类型之一,它有两个值,true/false。

数组:

  数组可以说是一组数据的集合,它把一系列的数据组织存储起来,形成一个可以操作的整体。数组中可以包含很多的数据类型,例如字符串、布尔、浮点,甚至可以包括对象以及资源类型。

  数组中的每一个数据称之为元素,元素包括索引值(键名)和值两个部分。索引可以是数字或者字符组成,也可以是默认由数组分配的值。

对象: 

  可能在很多的教科书里面对于“对象”都有着大篇幅的介绍和概念理论,但是简单点说,对象就是存储数据和有关处理数据信息的一种数据类型。

  而如果想要去创建一个对象,在php中需要先声明一个类,再由类演化成对象。

  例如下面的代码,我们通过类来创建一个对象。

  

Null空值: 

  null是一种较为特殊的类型,表示变量为空的一种状态,NULL类型里面唯一的值就是null。

  通常情况下用在给预留变量赋值使用。

资源:

  资源类型代表的是通过php去读取某些文件的时候,返回的数据类型,例如通过函数读取了一个txt文件,那么返回值就是一个资源类型。

五、数据类型转换

php是一门弱类型语言,因为我们在声明一个变量 的时候,并不需要指明它保存的数据类型,但是PHP虽然是弱语言,但有时候仍然需要用到类型转换。

php允许转换的列表如下:

在php中转换数据类型,有三种转换方法:

第一种,只需要在要转换的变量之前加上用括号括起来的类型名称即可,像下面这样:

 <?php
/**
* Created by PhpStorm.
* User: liujunhang
* Date: 2018/6/18
* Time: 22:05
*/
$num1 = 3.14;
$num2 = (int)$num1;
var_dump($num1); // float(3.14)
var_dump($num2); // int(3)

第二种,使用3个具体类型的转换函数,intval()、floatval()、strval():

 <?php
/**
* Created by PhpStorm.
* User: liujunhang
* Date: 2018/6/18
* Time: 22:05
*/ $a = "123.43abc";
$int = intval($a); // 转换成整型
var_dump($int); // int(123)
$float = floatval($a); // 转换成浮点
var_dump($float); // float(123.43)
$str = strval($a); // 转换成字符串
var_dump($str); // string(9) "123.43abc"

第三种,使用settype()函数,该函数可以将指定的变量转换成指定的数据类型,语法如下:

settype(mixed var,string type)

参数var为指定的变量;参数type为指定的数据类型。参数type有7个可选值,即boolean,float,integer,array,null,object和string,如果转换成功setype()函数返回true,否则返回false。

 <?php
/**
* Created by PhpStorm.
* User: liujunhang
* Date: 2018/6/18
* Time: 22:05
*/
$num = 12.9;
$flag = settype($num,"int");
var_dump($flag); // bool(true)
var_dump($num); // int(12)

当字符串转换为整型或浮点型时,如果字符串是以数字开头的,就会先把数字部分转换为整型,在舍去后面的字符串;如果数字中含有小数点,则会取到小数前一位。

六、检测数据类型

我们在开发的过程中经常碰到需要监测数据类型,从而做出判断,我们可以根据下面的这些方法来进行监测:

七、php中三种输出方式

在php中基础的输出方式有echo、print,以及var_dump三种方式。

其中echo能够输出一个或者多个字符串,而print仅能够输出一个字符串。var_dump可以打印数据并且返回数据类型。

八、php字符集设置

php是一门跨平台的语言,所以也就导致了相同的代码在不同的平台上因为不同平台的差异从而不能很好的运行下去,这其中字符集编码就是经常出现的问题,而为了解决这个问题,我们就需要在代码中进行字符集编码设置。

设置字符集可以采用下面这条代码:

header("Content-type:text/html;Charset=utf-8");

九、php常量

php常量类似于变量,但是常量一旦被定义就无法更改或者撤销定义。而常量名通常是以字符或者下划线开头(常量名前面并没有$符号)。

设置php常量,需要使用define()函数,define函数有三个参数:

  1. 首个参数定义常量的名称
  2. 第二个参数定义常量的值

可选的第三个参数规定常量名是否对大小写敏感。默认是false。

常量在项目的开发中使用的频率非常高,通常情况下用于设定一些配置参数或者固定的参数。常量默认的作用域为全局。

十、php字符串详解

上面我们说到,创建一个字符串需要单引号或者双引号,而一个字符串string就是由一系列的字符组成,其中每个字符相当于一个字节。需要注意的是php 的string 最大可以达到2GB。

创建一个字符串除了上面我们说的两种常见的使用方式,还有另外的两种方式,下面对这四种使用方式进行展示:

上面对字符串的四种方式简单的应用了一下:

  ①双引号

  ②单引号

  ③heredoc

  ④nowdoc

在Heredoc 结构中,同双引号一样是可以进行解析工作的。如下:

Heredoc还可以进行再复杂一点的操作:

甚至在需要的时候还可以进行传参。

Tip:在字符串操作的时候,无论是双引号还是Heredoc结构都可以解析变量,这其中解析可以直接将变量写在里面使用,但是一旦进行稍微复杂一点的操作,例如上面对象查询属性等操作,就需要使用{},因为{}在字符串里不解析,所以可以将表达式写在{}里面,但是必须和美元符号紧贴。

十一、php运算符

运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。

运算符可按照其能接受几个值来分组。一元运算符只能接受一个值,例如 !逻辑取反运算符)或 ++递增运算符)。 二元运算符可接受两个值,例如熟悉的算术运算符 +(加)和 -(减),大多数 PHP 运算符都是这种。最后是唯一的三元运算符 ? :,可接受三个值;通常就简单称之为“三元运算符”(尽管称之为条件运算符可能更合适)。

php的运算符在开发当中是必不可少的内容,但是就如同我们学习小学数学一样,也是同样具有先后顺序的。

运算符优先级

下面我们来说一下运算符的优先级。

  运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式 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 <= 1 == 1 是合法的, 因为 == 的优先级低于 <=。

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

下表是官方文档里面对于运算符优先级给出的定义,在这里并不强调大家全部记住,在编写表达式的时候我们完全可以灵活的运用小括号()这种形式来提升优先级。

算数运算符

诸位同学是否还记得学校里学到的基础数学知识?就和他们一样。

通过上面的算术运算符进行表达式运算很简单,但是也有一些需要注意的点:

除法运算符总是返回浮点数。只有在下面的情况下例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这是它返回一个整数。

取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。

取模运算符%的结果和被除数的符号(正负号)相同。即$a % $b 的结果的符号和$a的符号相同。

赋值运算符  

在php中,赋值运算符(=) 与 数学中的“等于”是不同的,赋值运算符相当于把右边表达式的值赋给左边的运算数。

除了上述的基础赋值运算符,还有适合于所有二元算数,数组集合和字符串运算符的”组合运算符”,这样可以在一个表达式中使用它的值并把表达式的结果赋给它。

处理上面例子里面的+=,.=以外,很多运算符都是可以组合的,例如-= ,*= 等等。

在php中存在引用赋值的使用方式。

位运算符

位运算符允许对整型数中指定的位数进行求值操作。

位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。

比较运算符

就如同名字所暗示的,比较运算符允许对两个值进行比较。

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

对于多种类型,比较运算符会根据下标进行比较:

Tip:因为浮点数float的内部表达式,所以不应该比较两个浮点数是否相等。

三元运算符

三元运算符相当于简化版的if判断,以?:来组成三元运算符。

从php5.3开始,可以省略中间的部分,例如下面:

Tip:尽可能的不要将三元运算符堆积在一起使用,会造成php语句不清晰。

错误控制运算符  

php中存在错误抑止符,也叫错误控制运算符,是一个简单的@符号,那么将@符号放置在表达式的前面就能够屏蔽掉表达式中的存错,但是这种写法在实际开发中是禁止使用的,因为我们看见的报错其实是程序和我们之间的交互,通过错误告诉我们哪里出了问题,但是一旦我们将这种错误屏蔽掉,可能直接导致项目无法运行但是却什么错误都看不到。

执行运算符  

执行运算符,顾名思义,就是只要被执行运算符包裹的代码都相当于一条命令是可以执行的。

PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。

例如上面的代码,我们是将执行运算符得到的结果内容存储到一个变量中并且输出。

需要注意的是,反引号运算符在激活了安全模式或者关闭了shell_exec()时是无效的。同时,反引号不能够在双引号字符串中使用。

递增递减运算符

PHP支持c风格的前/后递减与递增运算符。

Tip:递增/递减并不影响布尔值,递减Null值也没有效果,但是递增null值得结果为1.

在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 $a = 'Z'; $a++; 将把 $a 变成'AA',而在 C 中,a = 'Z'; a++; 将把 a 变成 '[''Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化。

逻辑运算符  

主要是对逻辑操作起到辅助作用。

字符串运算符  

在php中,存在两个字符串运算符。

第一个是 ‘  .  ’ ,第二个是’.=’。

. 返回的是左右链接后的字符串,第二个是将右边的参数附加到左边的参数之后。

数组运算符  

+ 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只使用左边数组的,右边的被忽略。

类型运算符  

instanceof 用于确定一个php变量是否属于某一类class的实例。

十二、php数组

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。

定义数组array()

可以使用array() 来定义一个数组。它接受任意数量用逗号分隔的键(key) =>值(value)对。

key可以是一个整数integer或者字符串string 。

value 值可以是任意类型的值。

在单行数组当中,最后一个数组单元的逗号可以省略,例如array(1,2) 。

在多行数组当中,最后一个数组单元的后面通常情况下要保留一个逗号,这样添加新单元的时候方便。

Tip:自php5.4起,可以使用短数组定义语法,用[]代替array()。

Tip:key可以是int或者string,value可以是任意类型。

此外 key 会有如下的强制转换:

  ①包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。

  ②浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。

  ③布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。

  ④Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。

  ⑤数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

Tip:在数组中定义了多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

在使用php数组的时候,php数组可以同时含有integer和string类型的键名,因为php实际并不区分索引数组和关联数组。如果数组中没有给定键名,那么则取当前最大的索引值,新的键名将该值加一。如果指定的键名已经有了值,则该值会被覆盖。

下面是一个包含int键值和string键值的数组:

在上面的例子中存在一个我们没有设置键的元素,系统会默认分配给它一个键,而这个键是当前最大int类型的键值+1.

访问数组元素  

当我们需要访问数组元素的时候,可以采用[] 这样的形式。

我们也可以通过{} 的形式访问数组元素。

在php5.4之后我们可以直接在函数中引用数组,如下:

上面的这种写法在之前是不可以的。

添加和修改数组元素

如果想要添加和修改数组元素,同样可以采用方括号的形式。

如果要删除某个数组元素,可以使用unset()方法。

当我们进行删除操作时,有一种情况是需要注意的:

在上面的代码中,我们清空了一个数组,然后重新向数组中注入新的值,并且没有给值设置索引,那么新添加的这个值采用的索引就是之前删除的数组最大的数值索引+1。

Tip:unset()函数允许删除数组中的某个键,但是注意数组将不会重建索引。如果要删除后重建索引,可以使用array_values()函数。

十三、PHP超全局变量

超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量。

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

这些超全局变量是:

$GLOBALS  

引用全局作用域中可用的全部变量。$GLOBALS本身就是一个数组,一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

Tip: $GLOBALS 也称之为自动化的全局变量。这表示可以在全局的任何地方使用它。

$_SERVER  

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

具体信息可以参考:https://www.cnblogs.com/liujunhang/articles/9178070.html

$_GET  

通过url参数传递给当前脚本的变量的数组。通常情况下用于表单传递。

例如下面的实例(注意,php代码和html代码在同一个页面):

当我们提交过一次留言后,可以看到浏览器url已经发生了变化。

$_POST

当HTTP POST 请求的Content-Type 是 application/x-www-form-urlencoded 或multipart/form-data 时,会将变量以关联数组形式传入当前脚本。

在上面我们使用了get方式进行了html和php数据交互,我们可以将get方法换成post方法。

$_REQUEST  

$_REQUEST - HTTP request 变量。

默认情况下包括了$_GET、$_POST 和$_COOKIE 的数组。

上面几个是常见的超全局变量。还有一些其他的超全局变量暂时是我们用不到的,并且使用频率不是很高,后面需要在来说。

十四、php流程控制

任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。

if else语句  

if else 语句可以根据条件进行判断,如果满足条件执行对应的代码。

还有下面的一些变化,例如在html中满足条件输出内容:

循环语句

当我们在开发中如果需要进行批量的重复性的工作,就可以在代码中开启一个循环,让php帮你去执行和重复。

while循环语句

语法:

  while (expr):

    statement

    ....

  endwhile;

例如下面就是两个简单的循环的例子:

do while循环语句 

do while循环语句和while很相似,不同的是表达式的值是在每次循环结束时检查而不是在循环开始时检查。并且和一般的循环不同的是,即使开始的时候条件就为false,do while也会执行一次。

for循环

php中的for循环与c语言类似,基础的语法如下:

  for(条件1;条件2;条件3){

    coding

  }

需要注意的是三个条件的执行时机:

  条件1 会在循环开始前执行一次,

  条件2会在每次循环开始前进行判断,如果为true,那么执行循环

  条件3会在每次循环后开始执行

看下面的例子,体会三条条件执行的时机:

for循环同样还有另外一种写法:

假设有一个数组,我们需要取出数组中所有的值进行某些操作,我们就可以使用循环来完成,因为这种重复性较高的工作循环的效率远远超过我们自己一个个取值。

foreach 遍历数组

上面的代码中,我们通过for循环遍历了数组,将数组中的值取了出来,但是在php中,给我们提供了一个专门用来遍历数组的方法foreach。

foreach仅能够应用于数组和对象。

基础语法如下:

  foreach ($array  as  $value){}

  foreach($array as $key => $value){}

break

break关键字能够结束当前的for,foreach,while,do-while或者switch等结构。同时,break能够接受一个可选的参数来决定能够跳出几层循环。

下面的实例是在for循环里面嵌套switch,再通过break进行指定层数跳转。

continue 跳过本次循环

在循环中,我们可以通过continue来跳过本次循环,但是循环依旧继续。

switch 语句

switch语句的功能很类似if判断,可以先来看下面的例子:

上面是switch的用法和实例,我们在使用的时候还可以对switch写法上进行一些变化:

上面是switch的两种写法,当然,在实际应用中并不强制使用哪种方式,而是哪种使用更方便就使用哪种。

require  、include  

无论是require还是include ,二者都是用来引入文件,而且二者几乎一样,除了处理失败的方式不同之外。

require 在错误产生时产生E_NOTICE级别的错误,换句话说会导致脚本停止运行。

include会产生E_WARINE警告,程序会继续执行。

require_once 、include_once

和上面两位的用法一样,只不过使用require_once 和 include_once的时候,会检查是否已经引用,如果文件已经引用将不再引用。

上面的四位,其实是我们在项目开发中经常使用的方法,例如进行web开发的时候,网页的开头和结尾都是相同的,我们就没有必要去每个网页都写一份开头和结尾,而是只写一份,放在公用的目录中,每个网页中只引用一次即可。

goto

goto操作符可以用来跳转到程序的另外一个位置。php中对goto存在一定的限制,目标位置只能位于同一个文件和作用域,也就是无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用 goto 代替多层的 break。

15.php函数

在开发过程中,或者说在项目的功能业务实现的过程中,我们会经常碰到代码重复的现象,而为了节约开发时间和成本(主要是因为懒),我们就可以将这些重复的代码进行封装,封装成函数,一次封装,重复调用,就可以摆脱这种麻烦。

而php的强大的原因之一就是官方给我们封装了很多很多的功能性函数,例如我们之前用到的var_dump(),就是一个封装好的函数。

我们也可以根据自己的需求进行函数自定义封装。

我们可以将用户登录这种常用的功能进行一下函数的封装。

上面的代码是我们根据需求写的一段伪代码,那么在真实的开发环境下是需要更加严谨和复杂的,我们只是简单的模拟下。

那么在进行函数的封装的时候,我们需要注意的点有三个:第一个是函数的说明,通常情况下写在函数的上面,目的是为了日后团队他人调用的方便,其次在程序的关键步骤进行注释,因为很多时候,我们自己之前敲过的代码可能过了很久后自己也会忘掉,所以写好注释能够在后期的维护和升级时起到很大的帮助。

上面我们通过一段伪代码简单的说了一下函数封装,下面我们来演示一下函数的参数问题,

需要知道的是,形参的作用范围仅限于函数内部,在函数外部则没法使用。

通常情况下,我们在函数中进行操作的变量是没办法在函数外部的作用域直接访问的,如果我们需要函数里面的数据,我们可以通过return来将数据进行返回,作为调用这个函数产生的返回值返回到函数的外面。从而在函数的外面进行其他业务操作。

在php中,还有一种很重要的函数,就是下面我们要说的匿名函数。

匿名函数(anonymous functions ) ,也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然也有其他的应用情况。

例如下面就是一个简单的实例:

输出结果:

在上面的实例中,我们在使用preg_replace_callback()方法时,第二个参数则是一个匿名函数,也可以称之为闭包函数 。

在这需要强调的是,php中的闭包函数跟传统的闭包函数写法是有些区别的,例如在JavaScript中的闭包函数写法如下:

但是在php中并不存在这种传统的闭包函数,如果站在子函数可以调用父域内的变量这种角度来定义闭包函数,那么在php中,可以使用use。

例如下面的例子,函数通过use关键字来调用父域中的变量,另外,下面例子中的匿名函数被存储在变量中也是一种常见的写法。

在使用函数时,我们也可以通过函数的形参列表将函数传入。

16. php魔术常量

PHP进阶之路 -- 01 PHP基础语法的更多相关文章

  1. Scala进阶之路-Scala的基本语法

    Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...

  2. 075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现

    075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现 本文知识点:综合案例-数组移位-主方法功能4的实现 说明:因为 ...

  3. 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现

    074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...

  4. 073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现

    073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现 本文知识点:综合案例-数组移位-主方法功能1和2的实现 说 ...

  5. 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法

    072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...

  6. 071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法

    071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法 本文知识点:综合案例-数组移位-显示数组当中所有元素 ...

  7. 070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据

    070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据 本文知识点:综合案例-数组移位-从键盘接收数据 说明:因为时间紧张 ...

  8. 069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求

    069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求 本文知识点:综合案例-数组移位-案例需求 说明:因为时间紧张,本人写博客 ...

  9. 068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题——基本数据类型传值

    068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题--基本数据类型传值 本文知识点:参数传递问题--基本数据类型传值 说明:因为时间紧张,本人写博 ...

随机推荐

  1. mysql 命令行导出导入数据

    导出数据库(sql脚本)  mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u root -p --databases db_name > test ...

  2. 解决nginx无法访问的问题

    解决nginx无法访问的问题 解决方案-->恢复Nginx默认配置: cd /usr/local/nginx/conf rm nginx.conf cp nginx.conf.default n ...

  3. expect无交互操作

    #!/usr/bin/expect set ip '192.168.4.5' set ' set timeout spawn ssh root@$ip expect { "yes/no&qu ...

  4. Android中关于回调概念的笔记

    一.回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调 ...

  5. jQuery事件之解绑事件

    语法: $(selector).unbind([eventType][,handler(eventObject)]); 返回值:jQuery 参数解释: eventTypey:类型:String以后包 ...

  6. 1.Linux常用命令大全

    系统信息 arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) h ...

  7. Android学习_服务

    一.           服务1.         Android多线程 每一个Android应用程序都会分别运行在一个独立的Dalvik(或ART?)虚拟机中,而每个虚拟机在启动时会运行一个UI主线 ...

  8. 【Nginx】 linux环境下安装nginx步骤

    开始前,请确认gcc g++开发类库是否装好,默认已经安装. centos平台编译环境使用如下指令 安装make: yum -y install gcc automake autoconf libto ...

  9. 20165213 Exp6 信息搜集与漏洞扫描

    信息搜集与漏洞扫描 一. 实践内容 (1)各种搜索技巧的应用 利用Google Hacking Datebase搜索. 尝试搜索http相关的漏洞,可以看到漏洞的相关信息. 也可以使用过滤器进行过滤, ...

  10. Ubuntu的root用户通过SSH登录的解决方法

    通过ISO镜像安装完ubuntu 系统后,我们不能直接使用putty或其他远程工具通过SSH方式连接到linux系统 原因: linux 系统上没有安装远程工具openssh-server 解决方法: ...