PHP复习笔记

1、PHP简介

1.1、PHP概述和开发运行环境介绍

1.1.1、动态网页技术

区别于静态网页技术而言,具有下面特征:

  • 交互性:按客户要求显示内容
  • 自动更新:自动地更新HTML文档,便会自动生成新的页面
  • 内容生成可在客户端或服务器端完成
  • 可以包含有动画的内容

1.1.2、浏览器端Scripts

浏览器端Scripts嵌入在HTML中的小程序,由浏览器负责执行,如JavaScript
过程:

  • 客户机在浏览器打开含有浏览器端Scripts的网页,发送请求
  • Web服务器接受请求,从磁盘读取网页传送给浏览器,不做任何运算
  • 客户端浏览器收到网页,执行里面的浏览器端Scripts,将结果解析成网页

1.1.3、服务器端Scripts

服务器端Scripts也是嵌入在HTML中的小程序,由web服务器负责执行,如CGI、JSP、ASP和PHP

过程:

  • 客户机在浏览器打开含有浏览器端Scripts的网页,发送请求
  • Web服务器接受请求,从磁盘读取网页,执行里面的Scripts,结果转换为HTML页面,传送给浏览器并关闭连接。
  • 客户端浏览器收到网页,将结果解析成网页
    在这里插入图片描述

1.2、PHP介绍

  • PHP: Hypertext Preprocessor,中文:“超文本预处理器”)是一种应用广泛、功能强大的嵌入html中的脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的WEB站点。
  • PHP的语法类似于C,Perl,ASP或者JSP。
  • PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行

PHP官网

1.2.1、PHP功能

  • 生成动态页面内容
  • 能够创建、打开、读取、写入、删除以及关闭服务器上的文件
  • 在网页之间传递数据
  • 添加、删除、修改数据库中的数据
  • 限制用户访问网站中的某些页面
  • 对数据进行加密

1.2.2、PHP优势

  • 免费性:免费、开源代码
  • 快捷性:
    • 程序开发快,运行快,技术本身学习快
    • PHP可以被嵌入于HTML语言,编辑简单,实用性强,更适合初学者
  • 跨平台性强:运行在服务器端的脚本,可以运行在UNIX、LINUX、WINDOWS、Mac OS、Android等平台
  • 效率高:PHP消耗相当少的系统资源,将用户经常访问的PHP程序驻留在内存中,其他用户再次访问时不需要重新编译程序,直接执行代码就可以。
  • 图像处理:用PHP动态创建图像,PHP图像处理默认使用GD2;也可以配置为使用image magick进行图像处理。
  • 面向对象:在php4,php5 中,面向对象方面都有了很大的改进,完全可以用来开发大型商业程序。

1.2.3、PHP应用

  1. web开发。
    网站:企业网站、门户网站等。
    软件:开发基于B/S结构的应用软件。如办公OA、CRM等。
  2. 命令行脚本。
    只需要 PHP 解析器来用于这种方式。这是常规脚本扩展使用 cron(在 Unix 或者 Linux 中)或者 Task Scheduler(在 Windows 中)时的理想用法。
  3. 编写桌面应用程序
    PHP-GTK可以在图形界面的系统中编写图形界面的应用程序。
  4. 电子商务
    Cybercash 支付、CyberMUT、VeriSign Payflow Pro以及 MCVE 函数对于在线交易程序来说是非常有用的

1.2.4、PHP7新特性

  1. 面向对象能力
  2. try/catch异常处理
  3. 字符串处理(字符串偏移量offset)
  4. XML与web服务支持
  5. 对SQLite数据库服务器的内置支持

1.2.5、PHP运行环境

浏览器在线运行1
浏览器在线运行2

  1. Apache服务器的安装。 (web服务器)
    下载地址
  2. PHP引擎的安装。 (php环境)
    下载网址
  3. Zend引擎的安装。 (php优化引擎)

1.2.6、PHP环境的搭建

Windows平台下:
1、Apache的安装
2、PHP的安装
3、两者的关联
安装过程参考资料

2、PHP程序基础结构和编写惯例

2.1、PHP程序嵌入HTML文件

在这里插入图片描述

2.2、常用的嵌入方式

  1. PHP标准结构<?php … ?>
<?php      
echo "Hi, I'm a PHP script!"; 
 ?>
  1. PHP的简短风格<? … ?>
<?  echo "Hi, I'm a PHP script!"; ... ?>

注意:此方法需要在php.ini中去配置才能生效
开启 short_open_tag = on

  1. PHP的script风格<script language="php">. . .</script>
< script language="php">
         echo "Hi, I'm a PHP script!"; ...</script>
  1. asp风格<% … %>
 <%  echo "Hi, I'm a PHP script!";  %>

注意:此方法需要在php.ini中去配置才能生效开启 asp_tags = on

PHP7不支持方法三和四

2.3、php页面的解释

  • 无法在浏览器中通过查看源文档的方式来查看 PHP 的源代码。
  • 而只能看到 PHP 文件的输出,即纯粹的 HTML。
  • 这是因为在结果返回浏览器之前,脚本就已经在服务器执行了。
  • 所以页面后缀必须为.php

2.4、apache服务器处理页面的原理

apache服务器处理页面的原理:

  • 普通的html、javascript、css代码原样输出;
  • php代码,将由php引擎解释,最终输入html代码。
  • 一般地,apache对*.htm或者 *.html文件,不作php解释,所以将原样输出。所以,在普通的.htm、.html页面中,不能写php代码。

2.5、include和require

  • 在服务器执行 PHP 文件之前把一个文件的内容插入到这个 PHP 文件中
  • include 和 require 很相似,除了在错误处理方面的
  • require 会产生致命错误 (E_COMPILE_ERROR),并停止脚本
  • include 只会产生警告 (E_WARNING),脚本将继续

2.6、include_once和require_once

  • require_once 语句在脚本执行期间包括并运行指定文件。此行为和 require语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。
  • include_once语句在脚本执行期间包括并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。只会包括一次。
  • include_once函数的作用和 include是几乎相同的

在这里插入图片描述

3、PHP的输出和注释

3.1、php输出

3.1.1、echo:是语句不是函数,没有返回值,可输出多个变量值。不能输出数组和对象,只能打印简单类型(如int,string)。

  • 语法:echo(strings)
  • 语言结构,可以使用小括号、单引号、双引号;
  • 如果希望向 echo() 传递多个参数,那么使用括号会发生解析错误。
  • 也可以使用print()命令实现,但是echo()函数的运行速度要快一些。
<?php
echo ("可以使用小括号");
echo "<br>";
echo '可以使用单引号';
echo "<br>";
echo "可以使用双引号";
echo "<br>";
echo "一个参数"."两个参数"."可以使用.来传递多个参数";
echo "<br>";
echo ("一个参数"."两个参数");
# echo ("一个参数","两个参数");//这样会出错
echo "<br>";
print "print比echo慢";
?> 
/*执行结果:
可以使用小括号
可以使用单引号
可以使用双引号
一个参数两个参数可以使用.来传递多个参数
一个参数两个参数
print比echo慢
*/

单引号和双引号的不同之处:单引号仅输出变量名,而不是值。

<?php
$color="red";
echo "Roses are $color";
echo "<br>";
echo 'Roses are $color';
#单引号仅输出变量名,而不是值。
/*
Roses are red
Roses are $color
*/
?>

简化语句

<html> 
	<body> 

		<?php $color = "red"; ?> 

		<p>Roses are <?=$color?></p> 

	</body> 
</html>

3.1.2、print:是语句不是函数,有返回值 1 ,只能输出一个变量。不能输出数组和对象,只能打印简单类型(如int,string)。

print也是语言结构,有无括号均可使用:print或者print()

<?php
print '单引号';
print "<br>";
print "双引号";
print "<br>";
print ("小括号");
print "<h2>使用h2标题</h2>";
$var=2;
print $var;
print "<br>";
$var=print 2;
print "<br>";
print $var;//print有返回值,返回值为1
print "<br>";
//$var=echo 2;echo没有返回值,所以这句话会出错
$var1=print 3;
print "<br>";
echo $var1;


/*
执行结果:
单引号
双引号
小括号
使用h2标题
2
2
1
3
1

*/
?>

print有返回值,返回值是1,echo没有返回值

3.1.3、print_r:是函数,可以打印复合类型,例如:array、object等

<?php
$arr=array('name'=>'技术博客','site'=>'www.huangyibiao.com');
print_r($arr);//参数二设置为false则有打印,就跟没有设置第二个参数,一样,因为默认是false
echo '<br>';

// 参数二设置为true则不会打印,而是直接返回
$arr1=print_r($arr, true);
var_dump($arr1);//输出string(71) "Array ( [name] => 技术博客 [site] => www.huangyibiao.com ) ”


/*
执行结果:
Array ( [name] => 技术博客 [site] => www.huangyibiao.com )
string(71) "Array ( [name] => 技术博客 [site] => www.huangyibiao.com ) "
*/
?> 

3.1.4、printf:是函数,有返回值,返回值是打印内容的长度,把文字格式化以后输出(参看C语言)

  • printf函数带有两个参数,第一个参数是指定输出格式,第二个参数是要输出的变量。
  • 输出格式为:
    • %s: 按字符串;
    • %d: 按整型;
    • %b: 按二进制;
    • %x: 按16进制;
    • %o: 按八进制;
    • $f: 按浮点型
<?php
$var = 10;
$var1=printf('整型:%d<br>', $var);
$var2=printf('浮点型:%.2f<br>', $var); // 保留两位小数
$var3=printf('字符串:%s<br>', $var);
$var4=printf('二进制:%b<br>', $var);
$var5=printf('八进制:%o<br>', $var);
$var6=printf('十六进制:%x<br>', $var);
//printf有返回值,返回值是打印内容的长度
echo $var1;
echo "<br>";
echo $var2;
echo "<br>";
echo $var3;
echo "<br>";
echo $var4;
echo "<br>";
echo $var5;
echo "<br>";
echo $var6;

/*
执行结果:
整型:10
浮点型:10.00
字符串:10
二进制:1010
八进制:12
十六进制:a
15
21
18
20
18
20
*/
?>


3.1.5、sprintf:是函数,跟 printf 相似,但不打印,而是返回格式化后的文字(该函数把格式化的字符串写写入一个变量中,而不是输出来)其他的与 printf 一样。

<?php
$str = "Hello"; 
$number = 123;
$txt = sprintf("%s world. Day number %u",$str,$number);//这句话不会打印,只有返回值,下句echo将其输出
 echo $txt; //输出: Hello world. Day number 123
?>

3.1.6、var_dump():函数,输出变量的内容、类型或字符串的内容、类型、长度。常用来调试

<?php
$str = "Hello"; 
$number = 123; 
var_dump($str);// 输出:string(5) "Hello"
echo '<br>';
var_dump(123);// 输出:int(123)
echo '<br>';
var_dump($number);
/*
执行结果:
string(5) "Hello"
int(123)
int(123)
*/
?>

3.2、php的注释

//   单行注释
/*  多行注释 */                     
#  Unix风格注释    (单行注释)

注释符号只在<?php?>代码范围内有效!

4、类型、变量、常数和运算符

4.1、php数据类型

PHP支持八种类型

  • 四种标量类型:
    • 布尔型(boolean)
    • 整型(integer)
    • 浮点型(float)(浮点数,也作“double”)
    • 字符串(string)
  • 两种复合类型:
    • 数组(array)
    • 对象(object)
  • 特殊类型:资源(resource) NULL

4.1.1、布尔型

  • 最简单的类型。两个值,可以为 TRUE 或 FALSE。
  • 语法:使用关键字 TRUE 或 FALSE。两个都是大小写不敏感。
<?php
$foo = True; // 大小写不敏感
?>
  • 转换为布尔值:bool或者boolean强制转换
  • 数值0,0.0 、空数组、空字符串,转换为布尔型时,为false;
  • 非零值(不论正负),被认为是 TRUE!
<?php
$foo = true; // 大小写不敏感
$foo1= false;
echo $foo;
echo "<br>";
echo $foo1;//没有输出,echo不能输出布尔型的false值
echo "<br>";
var_dump($foo1);
/*
执行结果:
1

bool(false)
*/

?>

4.1.2、数值型

整数型

  • 整型:一个 integer 是集合 Z = {…, -2, -1, 0, 1, 2, …} 中的一个数。
  • 语法:
    整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +)。
    如果用八进制符号,数字前必须加上 0(零),用十六进制符号数字前必须加上 0x,二进制叫上0b。
<?php 
$a = 1234; # 十进制数
$a1 = -123; # 一个负数
$a2 = 0123; # 八进制数(等于十进制的 83)
$a3 = 0x1A; # 十六进制数(等于十进制的 26)
var_dump($a) ; //显示数据类型和值
echo "<br>";
var_dump($a1) ; //显示数据类型和值
echo "<br>";
var_dump($a2) ; //显示数据类型和值
echo "<br>";
var_dump($a3) ; //显示数据类型和值
echo "<br>";
/*
执行结果:
int(1234)
int(-123)
int(83)
int(26)
*/
?> 

浮点型

  • 浮点型:字长和平台相关
  • 语法
<?php
$a1 = 1.234;
$a2 = 1.2e3;
$a3 = 7E-10;
var_dump($a1);
echo "<br>";
var_dump($a2);
echo "<br>";
var_dump($a3);
echo "<br>";
/*
执行结果:
float(1.234)
float(1200)
float(7.0E-10)
*/
?>

4.1.3、字符串

  • PHP 没有给字符串的大小强加实现范围,不需要担心长字符串。
  • 字符串可以用四种字面上的方法定义:单引号 双引号 heredoc语法 nowdoc语法
  • 单引号支持的转义符少,主要是单引号和反斜线的转义序列,主要使用双引号。
  • 单引号字符串中出现的变量不会被解析。
<?php
echo('生日快乐!')."<br>";
echo('c:\\win')."<br>";//单引号中有\\代表反斜线
echo("I am \"Jaen \".")."<br>";//双引号中的\"代表"",所以里面有两个\",第一个代表"Jean",第二个代表"."
$str="mary";
echo("Hi,$str")."<br>";
echo('Hi,$str')."<br>";

/*
执行结果:
生日快乐!
c:\win
I am "Jaen ".
Hi,mary
Hi,$str
*/
?> 

常用的转义符
在这里插入图片描述
Heredoc语法

  • 一种给字符串定界的方法使用定界符语法(“<<<”)
  • 在 <<< 之后提供一个标识符和换行,
  • 然后是字符串,
  • 然后是同样的标识符结束字符串。
  • heredoc语法针对双引号字符串
<?php
$name="Jean";
echo<<<STR1
My name is $name.<br>
Happy birthday to you!
STR1;
/*
执行结果:
My name is Jean.
Happy birthday to you!
*/
?> 

nowdoc语法

  • nowdoc语法针对单引号字符串
<?php
$name="Jean";
echo<<<'STR1'
My name is $name.<br>
Happy birthday to you!
STR1;
/*
执行结果:
My name is $name.
Happy birthday to you!
*/
?>  

  1. 在<<<之后的字符EOT是自己定义的,随便什么都是可以的,但是结尾处的字符一定要和它一样,必须成对出现;
  2. 结尾的一行(如上例的EOT;),一定要另起一行,并且该行除了EOT; 之外不能有任何其他字符,前后都不能有,包括空格。如果在本行最前或者最后出现空格,制表符的话,会出现到一个这样的错误信息:Parse error: parse error, unexpected $end in……,提示语法错误;
  3. 如果在定界符中间出现有PHP的变量,只需要像在其它字符串中输出一样写就行
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
echo <<<EOT
My name is abc I am printing some $str.
Now,I am printing some.
This should print a capital 'A':\x41
EOT;
/*
执行结果:
My name is abc I am printing some Example of string spanning multiple lines using heredoc syntax.. Now,I am printing some. This should print a capital 'A':A
*/
?>
<?php
$name="cheng";
print<<<EOF
hello{$name}
EOF;
/*
执行结果:
hellocheng
*/
?>

变量$name之所以要用{}括起来,是要告诉PHP解析器这是一个PHP变量,不用也可以的,但是有可能会产生歧义

串接和变量

  • 为了把变量和字符串连接在同一行,可以使用(.)。
  • 句号是一个操作符号,作用于其两侧的表达式子。
  • 如果两侧的表达式是数值和字符串,PHP会把数字转化为字符串。
<?php
 $n=5 ."cats";
 echo $n;
 echo "abcd$n";
 echo 'abcd$n';
/*
执行结果:
5catsabcd5catsabcd$n
*/
?>
<?php
$number = 9;
$str = "北京";
printf("在%s有 %u 百万辆自行车。",$str,$number);
/*
执行结果:
在北京有 9 百万辆自行车。 
*/
?> 

4.1.4、printf()函数输出格式化的字符串

  • 语法: printf(format,arg1,arg2,arg++)
  • format:必需。规定字符串以及如何格式化其中的变量
  • arg1、arg2、arg++ 参数将被插入到主字符串中的百分号(%)符号处。
  • 该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推

在这里插入图片描述

<?php
$number = 123; 
printf("有两位小数:%1\$.2f<br>
没有小数:%1\$u",$number); 
/*
执行结果:
有两位小数:123.00
没有小数:123 
*/
?> 

如果 % 符号多于 arg 参数,则您必须使用占位符。占位符被插入到 % 符号之后,由数字和 “$” 组成。

4.2、类

  • 类(class)是对象的蓝图,PHP的类可以包含下列成员:
  • 属性:字段或者成员变量
  • 方法:成员函数
  • 常数:存放数据的常数
  • 构造函数:对象初始化函数,创建对象时自动执行
  • 析构函数:释放对象所占用系统资源的函数,在释放对象时会自动执行,无须在程序代码内加以调用,没有参数没有返回值。

4.2.1、定义特殊类

1.定义一个空类
Class Person{};
2.定义一个有成员属性和操作的类
Class Person{
 //成员属性
 $name     =  '';
 //操    作
protected function getActionName() {
return $this->name;
}
}
3.定义一个不能被继承的类,使用final关键字
Final class Person{
成员属性........
操    作........
}

4.3、对象

要初始化一个对象,用 new 语句将对象实例到一个变量中。

<?php
class foo{
	function do_foo(){
		echo "Doing foo.";
	}
}
$bar = new foo;
$bar->do_foo();
/*
执行结果:
Doing foo.
*/
?> 

转换为对象

  • 如果将一个对象转换成另一对象,它将不会有任何变化。
  • 如果其它任何类型的值被转换成对象,内置类 stdClass 的一个实例将被建立。如果该值为 NULL,则新的实例为空。
  • 对于任何其它的值,名为 scalar 的成员变量将包含该值。
<?php
$obj = (object) 'ciao';
echo $obj->scalar;  
/*
执行结果:
ciao 
*/
?> 

4.4、资源和NULL

4.4.1、资源:Resource

  • 通过专门函数进行建立和使用的特殊变量
  • 是保存外部资源的一个引用
  • 例如:
    • 打开的文件句柄
    • 数据库连接
    • 图片资源
  • 无法将其他类型的值转换为资源,资源大部分可以被系统自动回收
  • is_resource()函数测定一个变量是否是资源,get_resource_type()函数返回该资源的类型。

4.4.2、NULL

  • 特殊的 NULL 值表示一个变量没有值。
  • NULL 类型唯一可能的值就是 NULL。
  • 在下列情况下一个变量被认为是NULL:
    • 被赋值为 NULL。
    • 尚未被赋值。
    • 被 unset()。
  • 语法:NULL 类型只有一个值,就是大小写敏感的关键字 NULL。
<?php
$var = NULL;
?> 

4.5、数据类型转换

通过类型转换,可将变量值转换为另一类型。

<?php
$num=12;
$float=(float)$num;
echo gettype($num)."<br/>";
echo gettype($float);
/*
执行结果:
integer
double
*/
?>

允许强制转换的类型有:

  • int、integer:转换为整型。
  • bool、boolean:转换为布尔型。
  • float、double、real:转换为浮点型。
  • string:转换为字符串
  • array:转换为数组
  • object:转换为对象

使用函数进行转换: intval() floatval() strval()

<?php
$str = "123.9abc";
$int = intval($str);
$float = floatval($str);
$str = strval($float);
echo $str;
echo "<br>";
echo $int;
echo "<br>";
echo $float;
/*
执行结果:
123.9
123
123.9  
*/
?>  

4.6、检查数据类型的函数

在这里插入图片描述

4.7、PHP变量

  • 常量与变量是任何语言的基本构成
  • 用于表示各种值
  • 常量和变量用来存储数据,主要区别是常量一旦初始化就不能再发生改变

4.7.1、变量(用户自定义变量)

  • PHP 中一个美元符号$后面跟上一个变量名称,即表示一个变量。
  • 变量的名称是大小写敏感的。
  • 在 PHP 中设置变量的正确方法:$var_name = value;
  • 一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。
<?php
$var = "Bob";
$Var = "Joe";
echo "$var, $Var";
$_4site = 'not yet';
#$t#yte = 'mansikka';//无效变量名
#$4site = 'not yet';//不能以数字开始
echo "$_4site";
/*
执行结果:
Bob, Joenot yet
*/
?>

空格问题:

<?php
$var = "Bob";
$Var = "Joe";
#Bob,Joe
echo "$var,$Var"."<br>";
#Bob, Joe
echo "$var, $Var"."<br>";//逗号后面有一个空格
#Bob , Joe
echo "$var , $Var"."<br>";//这里逗号前后都有一个空格
#Bob , Joe
echo "$var  ,  $Var"."<br>";//这里,前有两个空格,逗号后面也有两个空格,但是输出结果是逗号前后一个空格,逗号后有一个空格。
#BobJoe
echo "$var$Var"."<br>";
#Bob Joe
echo "$var $Var"."<br>";//两个变量之间有一个空格
#Bob Joe
echo "$var   $Var"."<br>";//两个变量之间有两个空格,连续的两个空格出现相当于一个空格,输出结果就是只有一个空格将两个变量隔开。
$_4site = 'not yet';
#$t#yte = 'mansikka';//无效变量名
#$4site = 'not yet';//不能以数字开始
echo "$_4site";
/*
执行结果:
Bob,Joe
Bob, Joe
Bob , Joe
Bob , Joe
BobJoe
Bob Joe
Bob Joe
not yet
*/
?> 

两个变量之间有空格的时候,不管多少个空格,只要连续出现空格的时候,不管空格有多少,都会当成是一个空格

4.7.2、变量的命名规则

  • 变量名必须以字母或下划线 “_” 开头。
  • 变量名只能包含字母、数字字符以及下划线;英文字母区分大小写。
  • 不能使用保留字以及内置变的名称、内部函数的名称和内部对象的名称等。
  • 避免在内部范围使用与外部范围相同的名称,以免存取错误。
  • 变量名不能包含空格。如果变量名由多个单词组成,那么应该使用下划线进行分隔(比如 $my_string),或者以大写字母开头(比如 $myString)

注意:PHP中不需要在设置变量时声明变量的类型!根据变量的值,PHP自动将变量转换为正确的数据类型!

4.7.3、变量的赋值方式

两种赋值方式:=

  • 值赋值:值赋值直接把数值通过赋值表达式传递给变量;
  • 引用赋值:两个变量指向同一个内存地址。

值赋值:
创建一个存有字符串的变量,和一个存有数值的变量

<?php 
$txt = "Hello World!"; 
$number = 16;
$txt = $number;
echo $txt;
echo "<br>";
echo $number;
/*
执行结果:
16
16
*/
?>

引用赋值

<?php
$wo='baidu';//变量wo值是baidu
$ba=&$wo;//引用赋值  变量ba是wo的引用
$ba="web site is $ba";//ba值:web site is baidu
echo $wo;//ba与wo是同一个变量,值为:web site is baidu
echo "<br>";
echo $ba;
/*
执行结果:
web site is baidu
web site is baidu
*/
?>

两个变量指向同一个内存地址,不论修改哪一个变量,修改的是同一个内存地址中的数据。

4.7.4、预定义变量(PHP提供)

  • PHP提供了大量的预定义变量
  • 该类型变量在任何范围内都有效!
  • 自动全局变量或者超全局变量
  • PHP5开始,长格式的PHP预定义变量可以通过设置register_long_arrays来屏蔽

4.7.5、PHP超全局变量

  • $GLOBALS
    包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键标为全局变量的 名称。从 PHP 3 开始存在 $GLOBALS 数组。
  • $_SERVER
    变量由 Web 服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组 - $HTTP_SERVER_VARS 数组(依然有效,但反对使用)。
  • $_GET
    经由 HTTP GET 方法提交至脚本的变量。类似于旧数组 $HTTP_GET_VARS 数组(依然有效,但反对使用)。
  • $_POST
    经由 HTTP POST 方法提交至脚本的变量。类似于旧数组 $HTTP_POST_VARS 数组(依然有效,但反对使用)。
  • $_COOKIE
    经由 HTTP Cookies 方法提交至脚本的变量。类似于旧数组 $HTTP_COOKIE_VARS 数组(依然有效,但反对使用)。
  • $__FILES
    经由 HTTP POST 文件上传而提交至脚本的变量。类似于旧数组 $HTTP_POST_FILES 数组(依然有效,但反对使用)。
  • $_ENV
    执行环境提交至脚本的变量。类似于旧数组 $HTTP_ENV_VARS 数组(依然有效,但反对使用)。
  • $_REQUEST
    经由 GET,POST 和 COOKIE 机制提交至脚本的变量,因此该数组并不值得信任。
  • $_SESSION
    当前注册给脚本会话的变量。类似于旧数组 $HTTP_SESSION_VARS 数组(依然有效,但反对使用)。

4.7.6、PHP服务器变量

  • REQUEST_METHOD
    获得对应页面方法。如:get、post
  • QUERY_STRING
    获取对应页面的请求字符串。DOCUMENT_ROOT获得根目录。
  • HTTP_REFERER
    链接到当前页面的前一页面的 URL 地址
  • REMOTE_ADDR
    正在浏览当前页面用户的 IP 地址。

用法:$_SERVER[‘QUERY_STRING’]

<?php
echo PHP_VERSION."<br>";
echo $_SERVER['REQUEST_METHOD']."<br>";
echo $_SERVER['QUERY_STRING']."<br>";
echo $_SERVER['DOCUMENT_ROOT']."<br>";
echo $_SERVER['REMOTE_ADDR']."<br>";
?>

4.7.7、变量的作用范围

  • 在 PHP 中,可以在脚本的任意位置对变量进行声明。
  • 变量的作用域指的是变量能够被引用/使用的那部分脚本。
  • PHP 有三种不同的变量作用域:
    • local(局部)
    • global(全局)
    • static(静态)

4.7.8、变量(可变变量/动态变量)

  • 变量的名称被存放在另一个变量里
<?php
$pet="abc";
$clown="pet";
echo $clown; //显示pet;
echo "<br>";
echo ${$clown};//显示”abc”
/*
执行结果:
pet
abc
*/
?>

<?php
$a = 'hello';
$$a = 'world';
echo "$a ${$a}"; 	
echo "<br>";
echo "$a $hello";
/*
执行结果:
hello world
hello world
*/
?>

4.7.9、变量处理函数

在这里插入图片描述

  • isset检测变量是否设置,只能用于变量
    • 不存在,返回FALSE
    • 存在,值为NULL
    • 存在值不为空,返回TRUE
  • 变量在值非空的情况下,被unset()函数释放

函数应用:

<?php
$a=16;
echo empty($a);//$a不是NULL所以结果是false,结果为false不会返回,所以结果是没有东西输出的,第一个输出的就是后面的那一行的结果。
echo empty(0)."<br>";
echo intval(4.6)."<br>";
echo floatval('123.4ab')."<br>";
/*
执行结果:
1
4
123.4
*/
?> 

4.8、PHP常量

  • 常量是一个简单值的标识符(名字)。
  • 在程序脚本执行期间该值不能改变(除了魔术常量,它们其实不是常量),但是可以访问。
  • 常量默认为大小写敏感。
  • 按照惯例常量标识符总是大写的。
  • define() 函数来定义常量,语法如下:define(name,value[,case_insensitive])
  • 第一个参数表示常量名;第二个参数表示常量的值;可选的第三个参数规定常量名是否对大小写敏感。默认是 false,表示区分大小写。
  • 一个常量一旦被定义,就不能再改变或者取消定义。
  • 常量名遵循标识符命名规则;
  • 只能包含标量数据(boolean,integer,float 和 string)。

4.8.1、常量和变量不同

  • 常量前面没有美元符号($);
  • 常量只能用 define() 函数定义,而不能通过赋值语句;
  • 常量可以不用理会变量范围的规则,可以在任何地方定义和访问;
  • 常量一旦定义就不能被重新定义或者取消定义;
  • 常量的值只能是标量。

4.8.2、define()函数定义常量–大小写敏感

<?php
define("CONSTANT", "Hello world.");//常量名字,常量值
echo CONSTANT; // 输出"Hello world."
echo constant; //出错 大小写敏感
/*
执行结果:
Hello world.
Warning: Use of undefined constant constant - assumed 'constant' (this will throw an Error in a future version of PHP) in /box/script.php on line 4
constant
*/
?>

4.8.3、define()函数定义常量–不区分大小写

<?php
define("CONSTANT", "Hello world.",true);//常量名字,常量值,不区分大小写
echo CONSTANT; // 输出"Hello world."
echo constant; //输出"Hello world."
/*
执行结果:
Hello world.Hello world.
*/
?>

4.8.4、常量(预定义常量)

PHP 向它运行的任何脚本提供了大量的预定义常量,也称为魔术常量。

  • __LINE__ 文件中的当前行号。
  • __FILE__ 文件的完整路径和文件名。
  • __FUNCTION__ 函数名称(这是 PHP 4.3.0 新加的)。
  • __CLASS__ 类的名称(这是 PHP 4.3.0 新加的)。
  • __METHOD__ 类的方法名(这是 PHP 5.0.0 新加的)。
  • PHP_VERSION 当前 PHP 的版本
  • PHP_OS PHP所在的操作系统的名字,如 ‘WINNT’。
  • E_ERROR 这个常量指到最近的错误处。
  • E_WARNING 这个量数指到最近的警告处。
  • E_PARSE 本常量为剖析语法有潜在问题处。
  • E_NOTICE 这个常式为发生不寻常但不一定是错误处。例如存取一个不存在的变量。

值会随着它们的使用位置而改变!

4.9、PHP运算符

  • 算术运算符
  • 赋值运算符
  • 位运算符
  • 比较运算符
  • 错误控制运算符
  • 逻辑运算符
  • 字符串运算符
  • 运算符优先级 (以括号控制)

4.9.1、算术运算符

在这里插入图片描述
如果运算符左右两边有一个操作数或者两个操作数是string类型,PHP会将string中从左到右可以识别为数值的部分取出作为数值参与运算

<?php
$a =123+"101p1";//取出字符串中的数值部分进行计算,所以$a=123+101;
echo $a."<br>";
$a =123.456 +"101.1p1";//$a=123.456+101.1
echo $a."<br>";
$a =1+true;//true的值为1,所以是$a=1+1;
echo $a."<br>";
/*
执行结果:
224
224.556
2

*/
?>


4.9.2、字符串运算符

有两个字符串运算符:

  • “.”:返回其左右参数连接后的字符串。
$a = "Hello ";
$b = $a . "World!"; //  "Hello World!"
  • “.=”:它将右边参数附加到左边的参数后,重新赋值给左边参数。
$a = "Hello ";
$a .= "World!";     // "Hello World!" 

如果字符串运算符左右两边任何一个操作数或者两个以上的操作数不是string类型,PHP会将操作数转换为string再做运算。

<?php
#$a1 ="PHP".7;
$a2 =123 ."101p1";
$a3 =123.456 ."101p1";
$a4 =false ."101p1";
#echo $a1."<br>";
echo $a2."<br>";
echo $a3."<br>";
echo $a4."<br>";
/*
执行结果:
123101p1
123.456101p1
101p1

*/
?>

4.9.3、递增/递减运算符

在这里插入图片描述

4.9.4、比较运算符

在这里插入图片描述

4.9.5、位运算符

在这里插入图片描述

4.9.6、赋值运算符

  • 基本的赋值运算符是“=”。
  • 赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3。
<?php
$a = ($b = 4) + 5;
echo $a;//$a的值为9还是为4?
/*
执行结果:
9
*/
?>

在这里插入图片描述

<?php
$a = 3;
$a += 5; // 等效于$a=$a+5
$a-=5;
$a*=5;
$b = "Hello ";
$b .= "There!"; //  等效于 $b = $b . "There!"; 
echo $a."<br>";
echo $b;
/*
执行结果:
15
Hello There!
*/
?>


4.9.7、条件运算符

<?php
// 三目比较运算符
$a=5;
$b=6;
$action = ($a==$b)?'a等于b': 'a不等于b';
echo $action;
/*
执行结果:
a不等于b 
*/
?> 

4.9.8、错误控(抑)制运算符

  • PHP 支持一个错误控制运算符:@
  • 将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
  • @运算符只对表达式有效。
  • 使用规则:如果能从某处得到值,就能在其前面加上@运算符,可以放在变量、函数和include()调用、常量之前

在这里插入图片描述
在这里插入图片描述

4.9.9、执行运算符

执行运算符()执行shell命令

<!doctype html>
<html>
<head>
<mate charset="uft-8">
</head>
<body>
<?php
$a=`dir`;
echo "<pre>$a</pre>";
?> 
</body>
</html>

4.9.10、运算符的优先级

在这里插入图片描述
在这里插入图片描述

4.9.11、例子

求十只钢笔和20把尺子的总价钱。

<?php
define("PEN",20);    //定义钢笔每只20元
define("RULE",10);  //定义尺子每把10元

$pen_num=10;
$rule_num=20;

$totle_price=$pen_num*PEN+$rule_num*RULE;
echo "购买10只钢笔20把尺子一共要花:".$totle_price."元"."<br>";

$totle_price =number_format($totle_price,2);
echo "购买10只钢笔20把尺子一共要花:".$totle_price."元";
?> 
/*
执行结果:
购买10只钢笔20把尺子一共要花:400元
购买10只钢笔20把尺子一共要花:400.00元 
*/

5、流程控制和数组

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

主要语句:

  • 条件语句
  • switch语句
  • 循环语句
  • break和continue
  • exit()函数

5.1、条件语句

if(条件1)
{
 //代码
}
elseif(条件2)
{  //代码
}
else
{
  //代码
}
if ($a > $b)    echo “www.yiboit.com”;
if ($a > $b) {
    print “www.yiboit.com”;
        $b = $a;
        }
if ($a > $b) {    print “我们”; } 
else {    print “大家”;   }
if ($a ==1) {    print “一”;} 
else if($a==2){    print “二”;}
else if($a==3){    print “三”;} 
else {    print “未进前三”;}

5.2、switch语句

switch 语句和具有同样表达式的一系列的 IF 语句相似。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。

<?php
$i=1;
switch ($i) {
	case 0:
		print "i equals 0";
		break;
	case 1:
		print "i equals 1";
		break;
	default:
		print "i equals 2";
		break;
}
/*
执行结果:
i equals 1
*/
?>

<?php
$i=1;
if ($i == 0) {
	print "i equals 0";
} elseif ($i == 1) {
	print "i equals 1";
} elseif ($i == 2) {
	print "i equals 2";
}
/*
执行结果:
i equals 1
*/
?>

5.3、循环语句

  1. while 循环:最简单的循环类型,while 语句的基本格式是:
while (expr) 
{
statement;
}

只要while 表达式的值为 TRUE 就重复执行嵌套中的循环语句。如果 while 表达式的值一开始就是 FALSE,则循环语句一次都不会执行。

<?php
$a=1;
While($a<=5){
	echo $a++;   //依次输出1到5的值
}
/*
执行结果:
12345
*/
?>

  1. do-while 循环,基本格式是:
do
{
statement;
} while (expr)

与while语句基本一样,先执行循环体,再判断条件是否否满足。如果 while 表达式的值一开始就是 FALSE,循环语句也会执行一次。

<?php
  $a=1;
  do{
	  echo $a++;   //依次输出1到5的值
   } While($a<=5);
/*
执行结果:
12345
*/
?>

  1. for循环,最复杂的循环结构,基本格式是:
for(expr1;expr2;expr3)
{  statement;  }

与c相似,每个表达式都可以为空

<?php
 for($i=1;$i<10;$i++)      //输出九九乘法表
{
     for($j=1;$j<=$i;$j++)
       {
           echo "$i*$j=".$i*$j;
           echo "&nbsp";
       }
       echo "<br/r>";
}

/*
执行结果:
1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 
*/
?>

  1. foreach循环

这只是一种遍历数组简便方法。foreach 仅能用于数组,
两种格式:

foreach (array_expression as $value) 
statement  

当前单元的值赋给$value并且数组内部指针向前移动一步

foreach (array_expression as $key => $value)
statement

当前单元的键名会被赋值给变量$key;值会被赋给$value

<?php
$arr=array("one","two","three");
foreach ($arr as $value){
	echo"Values:$value<br /> \n";
}
/*
执行结果:
Values:one
Values:two
Values:three
*/
?>

<?php
$arr=array("one","two","three");
foreach ($arr as $key => $value){
	echo"Key:$key;Values:$value<br /> \n";

}
/*
执行结果:
Key:0;Values:one
Key:1;Values:two
Key:2;Values:three
*/
?>

5.4、break和continue

break 结束当前 for,foreach,while,do…while 或者 switch 结构的执行。 continue 在循环结构用用来跳过本次循环中剩余的代码并开始执行下一次循环。

<?php
$i=1;
while ($i<10) {
         $i++;
          if($i %4==0){
                 break; }
          echo "$i\t";
}

/*
执行结果:
2	3	
*/
?>

<?php
$i=1;
while ($i<10) {
         $i++;
          if($i %4==0){
                continue; }
          echo "$i\t";
}

/*
执行结果:
2	3	5	6	7	9	10	
*/
?>

5.5、exi()函数

  • exit()强制离开程序终止执行。
    • 当参数为字符串,终止程序并在页面上显示字符串
    • 参数为整数时,终止程序不显示信息。整数参数代表错误码
  • die()函数。

5.6、数组array

  • PHP 中的数组实际上是一个”有序映射”。把值映射到关键字上,属于关联数组。
  • 数组就是“关键字->值”的集合。
  • 语法:
    • 定义: array()
    • 可以用 array() 语言结构来新建一个 array。它接受一定数量用逗号分隔的 key => value 参数对: array( [key =>] value , ... )
    • key 可以是 integer 或者 string
    • 如果键名是一个 integer 的标准表达方法,则被解释为整数(例如 “8” 将被解释为 8,而 “08” 将被解释为 “08”字符串型)。
    • PHP 中数组下标的类型不会对数组造成影响,可以同时包含整型和字符串型的下标。
    • 值value可以是任何值,如果值又是一个数组,则可以形成多维数组的结构。
<?php
$arr =array("foo" => "bar",12 => true);
echo $arr["foo"]."<br>";// 值为bar
echo $arr[12];//值为1
/*
执行结果:
bar
1
*/
?>

多维数据:

<?php
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
echo $arr["somearray"][6]."<br>";// 5
echo $arr["somearray"][13]."<br>";// 9
echo $arr["somearray"]["a"];// 42
/*
执行结果:
5
9
42
*/
?>

数组注意事项:

  • 布尔数据作为数组的键,true转换为1,false转换为0;
  • NULL作为数组的键,转换为空字符串””;
  • 数组的键为常量或者变量时,不能加上单引号,否则PHP不会解析这个常量或者变量
  • 浮点类型数据作为数组的键,自动取整数部分。

转化为数组注意事项:

  • 将integer、float、boolean、string、resource等类型转换为数组时,得到包含一个元素的数组,元素的键为0,值为该数据;
  • NULL转换为数组,得到一个空数组
    将一个对象转化为数组,所得到数组的元素为该对象的属性(成员变量),键值为成员变量名

5.7、数组的初始化

方法1$arr=array("red"=>"regcolor","blue"=>"bluecolor");
方法2$arr=array(1,33,44,55); //省略key值,自动从0开始索引,如果key为整数,下一个产生的key将是目前的最大值加上1,如果指定的键已经有值,则新值会覆盖旧值。
方法3:使用[]的语法 $arrayName[key] =value

相关函数

- each($arr)函数生成一个由数组当前内部指针所指向的元素的键名和键值组成的数组,并把内部指针向前移动 。
- list() 一般与each()元素使用,将数组元素分解一系列的值。
- reset($arr) - 将数组的内部指针指向第一个单元
- count($arr); 获得数组的个数
- unset($arr[0]);删除数组中的元素。
- array_slice($arr,int offset,[int length]); 获得数组的子集 
- array_unshift($arr,key=>value);  向数组开头插入元素
- array_push($arr,key=>value);     向数组结尾插入元素
- array_values()函数将返回整个数组元素,并将元素中的键变为数值键。
- sort($arr)  按值正向排序
- asort ($arr) 按值正向排序,保持关键字和值的对应关系rsort($arr)反向排序
- arsort($arr)按值反向排序,保持关键字和值的对应关系ksort($arr)按照关键字排序,保持对应关系
- next($arr)将数组$arr的指针指向下一个并返回该值
- prev($arr)将数组$arr的指针指向上一个并返回该值
- end($arr)将数组$arr的指针指向最后一个并返回该值
<?php
$arr=array("one"=>"1","two"=>"9","three"=>"0","four"=>"7");
echo next($arr)."<br>";
echo next($arr)."<br>";
echo next($arr)."<br>";
echo prev($arr)."<br>";
echo reset($arr);
echo next($arr);
echo end($arr)."<br>";
echo ksort($arr)."<br>";
echo arsort($arr)."<br>";
echo rsort($arr)."<br>";
echo asort($arr)."<br>";
echo sort($arr)."<br>";
echo array_push($arr,"E"=>"5")."<br>";
echo array_unshift($arr,"ziro"=>"0");
echo array_slice($arr,1,3);
echo count($arr); 


/*
each($arr)函数生成一个由数组当前内部指针所指向的元素的键名和键值组成的数组,并把内部指针向前移动 。
list() 一般与each()元素使用,将数组元素分解一系列的值。
reset($arr) - 将数组的内部指针指向第一个单元
count($arr); 获得数组的个数
unset($arr[0]);删除数组中的元素。
array_slice($arr,int offset,[int length]); 获得数组的子集 
array_unshift($arr,key=>value);  向数组开头插入元素
array_push($arr,key=>value);     向数组结尾插入元素
array_values()函数将返回整个数组元素,并将元素中的键变为数值键。
sort($arr)  按值正向排序
asort ($arr) 按值正向排序,保持关键字和值的对应关系
rsort($arr)反向排序
arsort($arr)按值反向排序,保持关键字和值的对应关系
ksort($arr)按照关键字排序,保持对应关系
next($arr)将数组$arr的指针指向下一个并返回该值
prev($arr)将数组$arr的指针指向上一个并返回该值
end($arr)将数组$arr的指针指向最后一个并返回该值
*/
?> 

<?php
$arr=array("df","aa","bb");
 while($el=each($arr))
 {
   echo "<br>".$el["key"];
   echo "<br>".$el["value"];
 }
 while(list($a,$b)=each($arr))
 {
   echo "<br>".$a;
   echo "<br>".$b; 
 }

/*
执行结果:

0
df
1
aa
2
bb
*/
?>

<?php
$arr = array ("one","two", "three","four","stop", "five");
while (list (, $val) = each ($arr)) {
	if($val == "stop"){
		break;
           }
echo "$val<br>\n";
}
while (list ($key, $value) = each ($arr)) {
	if (!($key % 2)) { // 略过本次循环
	continue;
             }
echo "$value<br>\n";
}

/*
执行结果:
one
two
three
four
five
*/
?>

5.8、数组运算符

在这里插入图片描述

  • + 运算符把右边的数组元素(除去键值与左边的数组元素相同的那些元素)附加到左边的数组后面
  • 重复的键值不会被覆盖。
<?php
$a=array("a"=>"apple","b"=>"banana");
$b=array("a"=>"pear","b"=>"strawberry","c"=>"cherry");
$c=$a+$b;// Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);
$c=$b+$a;// Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
/*
执行结果:
Union of $a and $b: 
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}
Union of $b and $a: 
array(3) {
  ["a"]=>
  string(4) "pear"
  ["b"]=>
  string(10) "strawberry"
  ["c"]=>
  string(6) "cherry"
}
*/
?>

5.9、多维数组

  • 直接赋值
    例:$arr[1][“red”]=“玫瑰”;
  • 使用array()函数
    • 默认键值
    • 例:$arr=array(array(‘玫瑰’,’百合’,’兰花’), array(‘苹果’,’梨子’,’桔子’,’葡萄’));
      在这里插入图片描述
  • 使用array()函数
    • 自行赋值键值
    • 例:$arr=array(‘鲜花’=>array(‘玫瑰’,’百合’,’兰花’), ‘水果’=>array(‘苹果’,’梨子’,’桔子’,’葡萄’));
      在这里插入图片描述
<?php
$arr=array(array('玫瑰','百合','兰花'), array('苹果','梨子','桔子','葡萄'));
print_r($arr);
$arr1=array('苹果','梨子','桔子','葡萄');
print_r($arr1);
/*
Array
(
    [0] => Array
        (
            [0] => 玫瑰
            [1] => 百合
            [2] => 兰花
        )

    [1] => Array
        (
            [0] => 苹果
            [1] => 梨子
            [2] => 桔子
            [3] => 葡萄
        )

)
Array
(
    [0] => 苹果
    [1] => 梨子
    [2] => 桔子
    [3] => 葡萄
)




*/
?>


6、函数

6.1、自定义函数

  • 自定义函数,是由程序员自己创建的,语法下如:
function 函数名称(参数1,参数2.)[:return_type]//声明函数返回值类型,PHP7新增功能
{
   //代码块
   return  返回值;
}
  • 引用方法:
    • 函数名(参数):
    • $abc = 函数名(参数):
<html>
 <body>
 <?php 
    function writeMyName() 
   { 
     echo "David Yang"; 
    } 
    writeMyName(); 
 ?>
 </body>
 </html>

注意:PHP中的函数可以先使用再定义

6.2、条件函数

如果函数定义放在条件中,则必须在条件成立后才能调用该函数

<?php
$status =True;
//不能调用greeting函数;
If($status)
{
Function greeting()
{
Echo"欢迎光临PHP的世界";
}
}
//此处之后可以调用greeting函数
Greeting();
/*
执行结果:
欢迎光临PHP的世界
*/
?>

6.3、函数中的函数

PHP中的函数可以嵌套定义
嵌套定义:定义一个函数时,其函数体内又包含另一个完整的函数;这个内嵌的函数只能在包含它的函数被调用之后才会生效

<?php function foo() 
{
 	function bar() 
	{ echo "I don't exist until foo() is called.\n"; 
	}/* 现在还不能调用bar()函数,因为它还不存在 */ 
}	
foo(); /* 现在可以调用bar()函数了,因为foo()函数 的执行使得bar()函数变为已定义的函数 */ 
bar(); 
/*
执行结果:
I don't exist until foo() is called.
*/
?>

6.4、函数的参数

  • PHP支持按值传递参数
<?php
function change($string)
{
	$string ="改变以后";
}
$str="改变之前";
Change($str);
echo $str;

/*
执行结果:
改变之前
*/
?>

  • 传递引用
<?php
function change(&$string)
{
	$string ="改变以后";
}
$str="改变之前";
Change($str);
echo $str;

/*
执行结果:
改变以后
*/
?>

6.5、默认参数

<?php
function makecoffee ($type = "00")
{
	return "$type";
}
echo makecoffee ();
echo makecoffee ("222");

/*
执行结果:
00222
*/
?>

当参数中不全是默认参数时,把默认参数写在右侧。如:Functon fee( a , a, a,b=“hello”);

6.6、可变长参数列表

PHP5.5以前的版本中,运用func_get_args()、func_num_args();等函数处理可变长参数、PHP5.6以后,可以改用…符号来取代函数。

<?php
function tour(...$cities)
{
	foreach($cities as $n)
	echo $n.'<br>';
}
tour('北京','上海','广州');
/*
执行结果:
北京
上海
广州

*/
?>

<?php
function average()
{
 $sum=0;
 $all_args=func_get_args();//返回数组,包含所有参数
 $size=func_num_args();//返回参数的个数

 for($i=0;$i<$size;$i++)
 {
   $sum+=$all_args[$i];
   //$sum+=func_get_arg($i);//返回指定索引位置上的参数
 }
 return $sum/$size;
}
echo average(1,2,3,4,5,6);
/*
执行结果:
3.5
*/
?>

6.7、标量类型声明

PHP7新增了标量类型声明功能,可以在声明函数的同时指定参数的类型。

<?php
function sumofint(int...$ints)
{
	return  array_sum($ints);
}
Var_dump(sumofint(1,'4',4.8));
echo sumofint(1,1,4.8);
/*
执行结果:
int(9)
6
*/
?>

6.8、向函数传递数组

<?php
function takes_array($input)
{
	echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
$myArray=array(1,4);
takes_array($myArray);
/*
执行结果:
1 + 4 = 5
*/
?>

6.9、函数值的返回值

  • 所有函数都可以有返回值,也可以没有返回值;
  • 通过return语句返回
  • 任何类型都可以返回,包括列表和对象
  • 返回时,结束函数运行,将控制权传递回被调用的行
<?php
$num1=100;
$num2=200;
Echo max1($num1,$num2);
function max1($a,$b)
{
	if($a<$b) $a=$b;
	return $a;
}
/*
200
*/
?>

如果在全局范围中调用,则当前脚本文件中止运行。
如果在一个函数中调用,return() 语句立即结束此函数的执行并将它的参数作为函数的值返回。

<?php
 echo "aaa";
 return;
 echo "bbb"; 
 //结果:aaa
?> 

<?php
 function print_cc()
 {
	 echo "aaa";
	 if(true) 
		return;
	 echo "bbb"; 
 }
  print_cc();
  //结果:aaa
  ?> 
  

6.10、变量作用范围

  • 在 PHP 中,可以在脚本的任意位置对变量进行声明。
  • 变量的作用域指的是变量能够被引用/使用的那部分脚本。
  • PHP 有三种不同的变量作用域:
    • local(局部)
    • global(全局)
    • static(静态)
<?php
$a = 1; /* 全局变量 */
//写在函数里变量,均为局部变量,即使与函数外的全局变量同名!
//如果希望在函数里使用全局变量,可用 global 来声明。
function Test()
{
	echo $a; /* 这里的$a与上面的不是一个,在函数内定义的变量,被视为局部变量 所以下面调用该函数的时候没有输出结果*/
}
Test();
/*
执行结果:

*/
?>

函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。

在方法内,欲使用全局变量,需用global 来声明:

<?php
$a = 1;
$b = 2;
function Sum()
{
	global $a, $b; //使用global,定义了这两个变量为全局的
	$b = $a + $b;
}
Sum();
echo $b;
/*
执行结果:
3
*/
?>

<?php
$b;//b没有赋值,所以认为b没有被定义过!
function Sum()
{
   global $b;
    $b=200;
}
Sum();
echo $b;
/*
执行结果:
200
*/
?>

<?php
$b;//b没有赋值,所以认为b没有被定义过!
function Sum()
{
   //global $b;
     $b=200;//这里的$b是局部变量,不是上面的全局变量,
}
Sum();
echo $b;//输出的是全局变量,但是上面没有赋值,所以没有结果输出。
/*
执行结果:

*/
?>

6.11、变量($GLOBALS及类型判断)

使用 $GLOBALS 替代 global

<?php
    $a=1;
	$b=2;
	function Sum()
	{
	$GLOBALS["b"]=$GLOBALS["a"]+$GLOBALS["b"];
	}
	Sum();
	echo $b;

/*
执行结果:
3
*/
?>

6.12、静态变量

通常,当函数完成/执行后,会删除所有变量。如果需要不删除某个局部变量,首次声明变量时使用 static 关键词:

<?php
   function myTest() 
   { static $x=0; //声明为静态变量,函数执行完毕之后不删除该局部变量,下次调用函数时继续使用上一次调用完毕之后的值,而不是重新定义赋值为0.
     echo $x;
     $x++; 
   } 
    myTest(); echo "<br>";
    myTest(); echo "<br>"; 
    myTest(); echo "<br>"; 
    myTest(); echo "<br>"; 
    myTest();

/*
执行结果:
0
1
2
3
4
*/
?>

<?php
   function myTest() 
   { $x=0; //局部变量,函数执行完毕之后删除该局部变量,因此下次调用函数的时候重新定义,赋值为0
     echo $x;
     $x++; 
   } 
    myTest(); echo "<br>";
    myTest(); echo "<br>"; 
    myTest(); echo "<br>"; 
    myTest(); echo "<br>"; 
    myTest();

/*
执行结果:
0
0
0
0
0
*/
?>

6.13、匿名函数

Php5.3版本就开始支持匿名函数功能,允许程序设计人员在没有指定名称的情况下创建函数。

<?php
   $greeting = function($name)
{
	printf("Hello %s\r\n",$name);
};
$greeting("world!");
$greeting("PHP!");

/*
执行结果:
Hello world!
Hello PHP!
*/
?>

6.14、可变函数

Php支持可变函数的概念,可以动态设置函数的名称,用户可以在一个变量的后面添加圆括号(),这时php将寻找与变量值同名的函数,并执行它。
可以改变变量的值,来调用不同的函数。

<?php
   function see($your)
{
	echo "Ary you See";
	echo $your;
}
$aa="see";//变量值与函数同名
$aa("我是昨夜风");//通过变量$aa,调用see函数
/*
执行结果:
Ary you See我是昨夜风
*/
?>

<?php
  function CircleArea($r)
{
	echo"半径为$r"."圆面积为".($r*$r*3.14);
}
function SquareArea($a)
{
	echo"边长为$a"."正方形面积为".($a*$a);
}
$func = 'CircleArea';
$func(10);
$func = 'SquareArea';
$func(10);

/*
执行结果:
半径为10圆面积为314边长为10正方形面积为100
*/
?>

6.15、函数的嵌套调用

PHP中的函数可以嵌套调用和递归调用
嵌套调用:在调用一个函数的过程中调用另一个函数

<?php
$num1=100;
$num2=200;
myoutput($num1,$num2);
function myoutput($a,$b)
{
	echo"较大的是".maxNum($a,$b);
}
function maxNum($a,$b)
{
	if($a<$b) 
		$a=$b;
	return $a;
}
/*
执行结果:
较大的是200
*/
?>

PHP中的函数还可以递归调用,并且可以先使用后定义

<?php
res(5);
function res($a)
{
	if($a<=10)
	{
		echo "$a\t";
		res($a+1);	
	}
}

/*
执行结果:
5	6	7	8	9	10	
*/
?>

6.16、PHP内置函数-输出函数

(1)、echo
原型如下:

void echo(string arg1[.string argn])
echo(“hello”);
echo “aa”,”bb”;

(2)、print()
原型如下:

int print(string arg])
print(“aa”);
print “aa”;

二者功能类似,均可带括号,也可不带,一般习惯于略去。
(3)、print_r()
除打印字符串之外,主要用来打印数组。

$foot=array(‘苹果’,’午餐’,’世界’);
print_r($foot);

常用的内置函数:

  • isset(变量);
    isset用于判断一个变量是否设置,如果是,返回真值(true)。如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。
  • empty(变量);
    empty用于判断一个变量是否为空。对于字符串而言,“”表示空,对于数值而言为0表示空。
  • exit()/exit(错误内容)
    exit()还有另一种定法,即die()表示退出程序,后面如写错误内容,将显示在网页上。
<?php
$var = '';  //结果为 TRUE,所以后边的文本将被打印出来。
if (isset($var)) {
   print "This var is set set so I will print.";
}
//在后边的例子中,使用 var_dump 输出 isset() 的返回值。
$a = "test";
$b = "anothertest";
var_dump( isset($a) );// TRUE
var_dump( isset ($a, $b) ); // TRUE
unset ($a);
var_dump( isset ($a, $b) ); // FALSE
$foo = NULL;
var_dump( isset ($foo) );// FALSE

/*
执行结果:
This var is set set so I will print.bool(true)
bool(true)
bool(false)
bool(false)
*/
?>

6.17、date

在这里插入图片描述

6.18、mktime

在这里插入图片描述

<?php
echo(date("M-d-Y",mktime(0,0,0,12,36,2001)))."<br>"; 
echo(date("M-d-Y",mktime(0,0,0,14,1,2001)))."<br>"; 
echo(date("M-d-Y",mktime(0,0,0,1,1,2001)))."<br>"; 
echo(date("M-d-Y",mktime(0,0,0,1,1,99))); 
//自动校正越界的输入


/*
执行结果:
Jan-05-2002
Feb-01-2002
Jan-01-2001
Jan-01-1999
*/
?>

6.19、计算时间差

在这里插入图片描述
在这里插入图片描述

6.20、常用字符处理函数

  • 去除字符串的某些内容trim();
  • 格式化输出字符n12br();
  • 打印格式化输出printf();
  • 字母大小写转换函数;
  • 特殊字符处理函数addslaches()和stripslaches()

6.21、Trim,去掉字符串中的左右的某些内容

  • 定义:string trim ( string str [, string charlist])
    • str为在处理的字符串;
    • charlist为要去掉的内容。默认为去空格及\r \t \n。
  • " " (ASCII 32 (0x20)), an ordinary space.
  • “\t” (ASCII 9 (0x09)), a tab.
  • “\n” (ASCII 10 (0x0A)), 换行).
  • “\r” (回车)
<?php
 $str="\t\tMy name is China 9999     ";
  echo $str;       //My name is China 9999 
  echo trim($str);   //表示去掉空格以及\t \r \n
  echo trim(trim($str),"9");  //表示去掉\t\r \n以及9.

/*
执行结果:
		My name is China 9999     My name is China 9999My name is China 
*/
?>

<?php
$a="\ta\tbc d     ";
echo trim($a)."<br>";
echo $a."<br>";
/*
执行结果:
a	bc d
	a	bc d      
*/
?>

测试发现这个trim函数去掉的只是字符串前后的空格及\r \t \n;在字符串中间的空格和\r \t \n是去不掉的

6.22、字符串函数

在这里插入图片描述
在这里插入图片描述

6.22.1、Strlen,计算字符串长度

定义:int strlen ( string string)返回的是字节数。

<?php
 $str = 'abcdef';
echo strlen($str); // 6
$str = ' ab cd ';
echo strlen($str); // 7

/*
执行结果:
67
*/
?>

6.22.2、substr,截取字符串

<?php
//substr("字符串",开始截取的位置,截取长度)
$rest1 = substr("abcdef", 1);
$rest2 = substr("abcdef", 1,3);
$rest3 = substr("abcdef", 0,4);
$rest4 = substr("abcdef",0,8);
echo $rest1."<br>";
echo $rest2."<br>";
echo $rest3."<br>";
echo $rest4."<br>";
/*
执行结果:
bcdef
bcd
abcd
abcdef
*/
?>

6.22.3、strstr–截取字符串,采用子串—结尾方式

<?php
//strstr("字符串",'开始截取的字符')
$email = 'user@example.com';
$domain = strstr($email, '@');
echo $domain;// 输出 @example.com
	
/*
执行结果:
@example.com
*/
?>

6.22.4、explode–分割字符串,将字符串分成数组

<?php
// explode("选定分割的字符,比如下面的空格","字符串")
$pizza="piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2	
/*
执行结果:
piece1piece2
*/
?>

6.22.5、implode–将数组变成字符串

<?php
//implode("数组之间用啥隔开,比如下面的,和空格","数组")
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
echo $comma_separated; // lastname,email,phone
$comma_separated = implode(" ", $array);
echo $comma_separated; // lastname email phone
?> 

6.22.6、str_replace

<?php
$str=str_replace("要替换的旧词","替换成新词","要替换的字符串");
echo $str; 	
/*
执行结果:
要替换的字符串
*/
?>

7、网页之间传递信息

7.1、表单(form及get\post)

  1. php是服务器端语言,访问一个网站,是通过浏览器来进行的
  2. php是通过什么来和客户端进行通信的呢?
    php通过其预定义变量实现:主要是:$_POST $_REQUEST $_GET $_SERVER $_COOKIE
  3. 网址方式(get)值将显示在URL中,适合传输小量数据。
  4. 提交表单(post)值不显示在URL中,适合大量数据的传送。

提交表单:post方式
welcome.php页面:

<html>
<body>
Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old.

<!-- 执行结果:
Welcome 111.
You are 111 years old.
-->
</body>
</html>

sub.php页面:

<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>

在这里插入图片描述

测试:在sub.php页面的输入框中输入用户名和年龄并单击提交按钮,表单数据会被送往welcome.php这个文件。
在这里插入图片描述

输入网址:get方式
welcome2.php

<html>
<body>
Welcome <?php echo $_GET["name"]; ?>.<br />
You are <?php echo $_GET["age"]; ?> years old.

<!-- 
Welcome 222.
You are 222 years old.
-->
</body>
</html>

sub2.php

<html>
<body>
<form action="welcome2.php" method="get">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>

在这里插入图片描述

测试:当用户点击提交按钮时,发送的 URL 会类似这样:http://localhost:8088/test2/welcome2.php?name=222&age=222
在这里插入图片描述
“welcome2.php” 文件现在可以通过 $_GET 变量来获取表单数据了(请注意,表单域的名称会自动成为 $_GET 数组中的 ID 键)

7.2、获得网址信息

  1. $_GET 变量:获得GET方法提交的数据
  2. 由于GET方法提交的数据,显示在网址上,所以我们直接地称之为获得网址信息。
  3. $_GET变量是一个包含名称[name]和值[value]的数组(这些名称和值是通过HTTP GET方法发送的,且都可以利用)。
  4. 发送的信息量不能超过100个字符。
  5. 可以通过网址传递参数:http://localhost:8009/12/get.php?id=200
  6. 获得某一个参数:echo $_GET[“id”]; echo $_GET[“name”];
  7. 获得所有参数:foreach ($_GET as $key=>$value) echo $key.“---”.$value;

注意:指示?号以后的参数,即键值对。
上面的welcome2.php改变

<html>
<body>
Welcome <?php echo $_GET["name"]; ?>.<br />
You are <?php echo $_GET["age"]; ?> years old.<br/>

<?php
foreach($_GET as $key=>$value)
echo $key."----".$value."<br>";
?>

<!-- 
Welcome 222.
You are 222 years old.
-->
</body>
</html>

在这里插入图片描述

7.3、获得表单信息

  1. 由于POST方法提交的数据,不显示在网址上,是我们收集客户信息常用方法。
  2. $_POST变量是一个包含名称[name]和值[value]的数组。
  3. 输入框、单选、多选、密码框、文本框,均可由$_POST来接受。
  4. 获得某一个参数:echo $_POST[“username”];
  5. 获得所有参数:foreach ($_ POST as $key=>$value) echo $key.“---”.$value;
  6. 对于一个name一个value的情况,直接用$_POST取出。例如radio、select、输入框$_POST[“username”]
  7. 对于一个name多个value情况,如checkbox,将name后加[],如name=“hobby[]”,取法不变而$_POST[“hobby”] 为数组。

注意:在form中method=“post”,表单提交的数据没有大小限制,并且不显示在URL中。

Example:
姓名:<input name="username"><br>
密码:<input name="password"><br>
性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女">女
省份:<select name="city">
             <option value="">请选择</option>
             <option value="哈尔滨">哈尔滨</option>
             </select>爱好:<input type=“checkbox” name=“hobby[]” value=“文学”>文学 
 <input type=“checkbox” name=“hobby[]” value=“体育”>体育  
<input type=“checkbox” name=“hobby[]” value=“书法”>书法print_r($_POST[“hobby”]); // 得到是一个数组而不是一个值。

7.4、表单验证

  1. 应该在任何可能的时候对用户输入进行验证。
  2. 客户端的验证速度更快,并且可以减轻服务器的负载。
  3. 任何流量很高以至于不得不担心服务器资源的站点,也有必要担心站点的安全性。如果表单访问的是数据库,就非常有必要采用服务器端的验证。
  4. 在服务器验证表单的一种好的方式是,把表单传给它自己,而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。

PHP - 验证名字

//name 字段只包含字母和空格。如果 name 字段无效,则存储一条错误消息:
$name = $_POST["name"];
 if (!preg_match("/^[a-zA-Z ]*$/",$name))
      { $nameErr = "只允许字母和空格!"; }
//preg_match() 函数检索字符串的模式,如果模式存在则返回 true,否则返回 false

7.5、$_REQUEST(有$_GET$_POST的功能)

同时具有$_GET$_POST的功能,可以取得网址和表单的所有信息。 凡是出现$_GET$_POST的地方,均可用它代替。

7.6、环境变量–$_ENV

$_ENV 主要用来取得系统及环境相关信息。环境变量是否取出,取决于系统的安全设置。

foreach ($_ENV as $key=>$value)
{
	echo $key."........".$value,"<br>";
}
如:
$_ENV[OS];
参数:OS 系统类型,
如:Windows_NT
$_ENV[“SystemRoot ”];
参数:SystemRoot 系统目录
如:C:\WINDOWS

envsub.php

<html>
<body>
<form action="env.php" method="env">
ENV: <input type="text" name="name" />
<input type="submit" />
</form>
</body>
</html>

env.php

<html>
<body>
<?php
foreach($_ENV as $key=>$value)
echo $key."----".$value."<br>";
?>
</body>
</html>

如果打印输出 $_ENV 为空,可以检查一下 php.ini 的配置:variables_order = “GPCS”如果 variables_order 的配置中缺少 E ,则 PHP 无法接受环境变量表示 PHP 接受的外部变量来源及顺序,加上E即可EGPCS 是 Environment、Get、Post、Cookies 和 Server 的缩写

7.7、服务器变量–$_SERVER

$_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建,用法如下:$_SERVER[“参数”]

$_SERVER['PHP_SELF']
取得文件的路径:/12/server.php     
 __FILE__将取得:D:\ccopen\root\12\server.php
 “QUERY_STRING”        取得?号之后的参数:id=20&name=hello
 “REQUEST_URI”           访问此页面所需的 URI,域名后部分。12/server.php?id=20&name=hello 
 “REMOTE_ADDR”         正在浏览当前页面用户的 IP 地址。
 “DOCUMENT_ROOT”   当前运行脚本所在的文档根目录。D:/ccopen/root
 “SERVER_NAME”          当前运行脚本所在服务器主机的名称。
 “REQUEST_METHOD” 访问页面的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。
 “HTTP_REFERER”         链接到当前页面的前一页面的 URL 地址。
 “SERVER_ADDR”          当前运行脚本所在的服务器的 IP 地址。 
 遍历:
 foreach ($_SERVER as $key=>$value)
  echo $key."........".$value."<br>";

welcome2.php页面改成如下:

<html>
<body>
Welcome <?php echo $_GET["name"]; ?>.<br />
You are <?php echo $_GET["age"]; ?> years old.<br/>
<?php
echo "取得文件的路径:".$_SERVER['PHP_SELF']."<br>";
echo "__FILE__将取得:".$_SERVER['__FILE__']."<br>";
echo "取得?号之后的参数:".$_SERVER['QUERY_STRING']."<br>";
echo "访问此页面所需的 URI,域名后部分:".$_SERVER['REQUEST_URI']."<br>";
echo "正在浏览当前页面用户的 IP 地址:".$_SERVER['REMOTE_ADDR']."<br>";
echo "当前运行脚本所在的文档根目录:".$_SERVER['DOCUMENT_ROOT']."<br>";
echo "当前运行脚本所在服务器主机的名称:".$_SERVER['SERVER_NAME']."<br>";
echo "访问页面的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”:".$_SERVER['REQUEST_METHOD']."<br>";
echo "链接到当前页面的前一页面的 URL 地址:".$_SERVER['HTTP_REFERER']."<br>";
echo "当前运行脚本所在的服务器的 IP 地址:".$_SERVER['SERVER_ADDR']."<br>";
?>
<!-- 执行结果:
Welcome 222.
You are 222 years old.
取得文件的路径:/test2/welcome2.php
__FILE__将取得:D:\xiazai\software\xampp\htdocs\test2\welcome2.php
取得?号之后的参数:name=222&age=222
访问此页面所需的 URI,域名后部分:/test2/welcome2.php?name=222&age=222
正在浏览当前页面用户的 IP 地址:::1
当前运行脚本所在的文档根目录:D:/xiazai/software/xampp/htdocs
当前运行脚本所在服务器主机的名称:localhost
访问页面的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”:GET
链接到当前页面的前一页面的 URL 地址:http://localhost:8088/test2/sub2.php
当前运行脚本所在的服务器的 IP 地址:::1
-->
</body>
</html>

7.8、网页重定向

HTTP Header

  1. http header :网页重定向,用户名和密码认证等功能
  2. Request header:请求标头
  3. Response header:响应标头
  4. Header(string string[,bool replace][,int http_response_code])
  5. string string:设置传送的http Header
  6. bool replace:有相同类型时是否取代,默认为true,表示会取代
  7. int http_response_code:设置HTTP Response Code
<html>
<body>
<form method ="post" action = "myselect.php">
<select name="myselect" seze=1>
<option value="https://www.sina.com.cn/">新浪
<option value="http://www.jd.com/">京东商城
<option value="https://www.baidu.com/">百度
</select>
&nbsp;<input type = "submit" value = "GO!">
</form>
</body>
</html>
<?php
$URL=$_POST["myselect"];
header("Location:$URL");
exit();
?>

7.9、用户和密码认证

<html>
<body>
<form action="env.php" method="get">
UserName: <input type="text" name="username" />
Password: <input type="text" name="password" />
<input type="submit" />
</form>
</body>
</html>

<html>
<body>
<?php
if(!isset($_SERVER['PHP_AUTH_USER'])){
	header('www-Authenticate:Basic realm = "Happy Website"');
	echo "抱歉,您没有输入密码。";
	exit();	
}
else {
	echo "{$_SERVER['PHP_AUTH_USER']}您好!<br>";
	echo "您输入的密码为:{$_SERVER['PHP_AUTH_PW']}<br>";
}
?>

<!-- 
111您好!
您输入的密码为:111
-->
</body>
</html>

7.10、Cookie

  1. 保存在客户端硬盘里的一小段文本数据
  2. 当浏览器第一次连接到HTTP服务器时,服务器把Cookie通过HTTP头标(header)发给浏览器。
  3. 而在以后的连接中,浏览器会在每次连接时把这个Cookie的一个拷贝返回给服务器。
  4. Cookie通常用来验证或辨别一个用户

7.10.1、创建Cookie

  1. setcookie() 函数用于设置 cookie
    语法:setcookie(name, value, expire, path, domain);
    注意: setcookie() 函数必须出现在 标记前面.
<?php 
setcookie("user", "Alex Porter", time()+3600);
?>
<html>
<body></body>
</html>
  1. 访问:利用全局数组$_cookie
  2. 在单个Cookie里保存多个值(序列化):Serialize() Unserialize()

注:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之)。

7.10.2、$_COOKIE变量

获得cookie:
获得,是指从客户端浏览器的临时文件中读取。如果客户清空了浏览器的临时文件,cookie将不存在。

1、如其它全局变量一样,cookie是数组,所以,指定键值,可获得某一cookie值
如:$_COOKIE[“jyh”];
2、获得本域下的所有cookie:
print_r($_COOKIE);
cookie用来判断用户登陆、身份验证等信息,但它有着一定的安全隐患,因为它的信息是存在客户端的。

7.10.3、设置Cookie的生命周期

  1. 一般来说,Cookie在浏览器退出时就过期了。
  2. 我们可以通过设置Cookie的expire属性来控制它的生存周期。
  3. Cookie的终止时间是以UNIX的时标来表示的

7.10.4、如何取回 Cookie 的值

  1. PHP 的 $_COOKIE 变量用于取回 cookie 的值。
  2. 我们使用 isset() 函数来确认是否已设置了 cookie:
<html>
<body>
<?php
if (isset($_COOKIE["user"]))
  echo "Welcome " . $_COOKIE["user"] . "!<br />";
else
  echo "Welcome guest!<br />";
?>
</body>
</html>

7.10.5、Cookie 中的数组应用

<?php
setcookie('my_cookie[]', 1);
setcookie('my_cookie[]', 2);
print_r($_COOKIE);//Array ( [my_cookie] => Array ( [0] => 2 )
$my_cookie[] = 1;
$my_cookie[] = 2;
print_r($my_cookie);//Array ( [0] => 1 [1] => 2
?>

数组的值添加成功,不过索引没有变,后面的数据将前的数据覆盖! my_cookie[],默认指向数据的第一元素的位置,即索引为0 的位置.

7.10.6、删除cookie的方法

  1. 把过期时间设置为一个以前的时间
<?php 
// set the expiration date to one hour ago 
setcookie("user", "", time()-3600); 
?> 
  1. 客户端删除

7.10.7、Cookie缺点

  1. 如果浏览器不支持cookie,则cookie不上用场
  2. cookie存放在客户端,可能会被浏览器删除或者拒绝写入。
  3. cookie可能会造成安全上的威胁,导致个人信息被窃取。

7.11、会话session

  1. Session是用来记录客户端信息的
  2. 一个用户从访问网站到关闭网站这个过程,就是一个会话。
  3. 多个用户之间,是不会相关干扰的,因为它们是不同会话。
  4. php提供了管理会话的机制,让我们可以追踪访客的操作,用户信息被保存在服务器上的会话文件里。
  5. Session 的工作机制是:为每个访问者创建一个唯一的 id (SID),并基于这个 SID 来存储变量。SID 存储在 cookie 中,或通过 URL 进行传导。
  6. 会话文件的保存位置:php.ini中 session.save_path的值,使用session.save_path()函数可获得
  7. session信息也是临时存在的,当你离开这个网站时,他会被自动删除。
  8. 如果想永久保留这些信息,可以把它储存在数据库中。

7.11.1、启动会话

  1. 在将用户信息存入PHP Session之前,必须先启动Session
  2. 首选使用Session_start()函数,在页面开始处调用,然后会话变量被登记到数组$_session
  3. 关联数组:$_SESSION

7.11.2、SESSION使用

<?php
session_start();
$_SESSION['views']=2008;     //定义
?>
使用:
echo $_SESSION[“views”]; //2008
判断:
isset($_SESSION[“views”]); //判断一个session是否设置
清空:unset($_SESSION[‘views’];

在使用session之前,在最前面必有session_start()以打开session功能。

7.11.3、例子:开始 PHP Session

把用户信息存储到 PHP session 中之前,首先必须启动会话
注意:session_start()函数必须写在标签之前:

<?php 
session_start();
 ?>
<html>
<body>
</body>
</html>

上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 SID。

7.11.4、例子:存储 Session 变量

存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量

<?php 
session_start(); 
$_SESSION['views']=1; // store session data 
?> 
<html> 
<body> 
<?php 
//retrieve session data 
echo "Pageviews=". $_SESSION['views']; 
?> 
<!-- 输出:
Pageviews=1
-->
</body> 
</html> 

7.11.5、例子:view 计数器。

page-view 计数器,isset() 函数检测是否已设置 “views” 变量。如果已设置 “views” 变量,我们累加计数器。如果 “views” 不存在,则我们创建 “views” 变量,并把它设置为 1:

<?php
session_start();
if(isset($_SESSION['views']))
 $_SESSION['views']=$_SESSION['views']+1;
else
  $_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>

7.11.6、终止会话

  1. 释放指定的 session 变量 :unset()
<?php
unset($_SESSION['views']); 
?> 
  1. session_destroy() 函数彻底终结 session session_destroy() 将重置 session,您将失去所有已存储的 session 数据
<?php 
session_destroy(); 
?> 

8、目录和文件操作

8.1、路径与磁盘操作

  1. 操作文件的同时,一定会涉及到对路径的相关操作。
  2. 路径又分为相对路径和绝对路径
  3. 相对路径是以操作的文件所在目录为起点的路径
  4. 绝对路径是以当前文件所在盘符为起点的路径

函数:

  1. basename()函数:可以快速的获取指定文件的文件名部分
  2. pathinfo()函数,可以对指定的路径和文件名进行解析,并返回一个包含四个元素的字符串数组。
  3. realpath()函数,用来获取文件的绝对路径。
  4. glob()函数:可以根据指定的条件,来寻找与条件相符的文件或目录,并通过数组返回
  5. disk_free_space()函数可以根据文件系统和磁盘分区,返回指定目录当前可以使用的字节数。
  6. disk_total_space()函数可以根据文件系统和磁盘分区,返回指定目录的空间大小。
  7. is_dir(string filename) 指定路径存在且为文件夹则返回true;否则返回false
  8. is_file()函数,可以检测指定文件是否为文件
  9. file_exists()函数,检查指定目录或文件是否存在。
  10. is_executable()函数,可以检测指定文件是否为可执行文件
  11. is_readable()函数,如果测试文件可读将返回TRUE,否则返回FALSE
  12. is_writable()函数,测试指定文件是否可写。
  13. 打开和关闭目录句柄–@opendir($dir)/ closedir($dir_handle)
  14. 新建目录–@mkdir()
  15. 删除目录–@rmdir
  16. 改变当前目录–chdir()
  17. 取得当前工作目录–getcwd()
  18. 列出指定路径中的文件和目录–scandir($dir)
  19. 删除文件unlink()函数
  20. 复制文件copy()函数
  21. 移动、重命名文件或目录:rename()函数
  22. 打开文件fopen()函数
  23. 关闭文件fclose()函数
  24. 新建临时文件tmpfile()函数
  25. 新建唯一临时文件empnam()函数
  26. 写入文件fwrite()函数fputs()函数fputcsv()函数
  27. 将字符串写入文件file_put_contents()函数
  28. 文件的读取与指针file_get_contents()函数fread()函数
  29. 将整个文件读入到数组中file()函数
  30. 重置文件指针的位置rewind()函数
  31. 文件尾部指针feof()函数
  32. 获取文件统计信息stat()函数
  33. 临时文件保存到指定位置move_uploaded_file()函数
  34. 判断文件是否通过http post上传:is_uploaded_file()函数
  35. 上传文件变量$_FILES[“file”][“name”
  36. 读取文件到输出缓冲区:readfile()函数
  37. 将文件输出到缓冲区:fpassthru()函数

8.2、获取路径中的文件名部分–basename()函数

  1. PHP提供了basename()函数,可以快速的获取指定文件的文件名部分
  2. basename(string path [,string suffix])
<?php
   $filepath = "/htdocs/test2/env.php";
    //使用basename()函数获取路径中的文件名部分
    echo $filepath."中的文件名是:".basename($filepath)."<br>";
    echo $filepath."中的文件名是(不含后缀名):".
    basename($filepath,'php');

/*
/htdocs/test2/env.php中的文件名是:env.php
/htdocs/test2/env.php中的文件名是(不含后缀名):env.
*/
?>

8.3、获取文件路径的信息–pathinfo()函数

  1. pathinfo()函数,可以对指定的路径和文件名进行解析,并返回一个包含四个元素的字符串数组。
  2. pathinfo(string path)
<?php
$filepath = "/htdocs/test2/env.php";
//使用pathinfo函数获取变量
$result = pathinfo($filepath);
//遍历返回的数组
foreach($result as $key=>$value){
echo "$key=>$value<br>";
}
/*
dirname=>/htdocs/test2
basename=>env.php
extension=>php
filename=>env
*/

?>

8.4、获取绝对路径–realpath()函数

  1. realpath()函数,用来获取文件的绝对路径。
  2. realpath(string filename)
  3. filename为要获取绝对路径的文件,如果文件不存在,返回false;否则返回文件的绝对路径,
<?php
   $file_name="env.php";
   echo '当前网页的路径:'.realpath($file_name).'<br>';
/*
当前网页的路径:D:\xiazai\software\xampp\htdocs\test2\env.php
*/
?>

8.5、寻找与模式匹配的文件路径–glob()函数

glob()函数可以根据指定的条件,来寻找与条件相符的文件或目录,并通过数组返回

<?php

//使用glob()函数,返回phpl目录下,所有的.php文件
$result = glob("*.php");
//遍历返回的数组
foreach ($result as $filename) 
  if(!is_dir($filename))
    echo "$filename<br>";
/*
env.php
envsub.php
myselect.php
myselectform.php
sub.php
sub2.php
welcome.php
welcome2.php
*/

?>

8.6、显示当前目录中的文件/目录

<?php
header("Content-Type:text/html;charset=utf-8");
function tree($directory){
  $mydir=dir($directory);
  echo "<ul>";
  while($file=$mydir->read()){
     if((is_dir("$directory/$file")) AND ($file!=".") AND ($file!="..")){
    echo "<li><font color='#ff00cc'><b>$file</b></font></li>";
        tree("$directory/$file");
     }
     else{
        echo "<li>$file</li>";
    }
    }
echo "</ul>";
$mydir->close();
}
//start the program
echo "<h3>显示的目录为粉红色!</h2>";
tree(".");
?> 

8.7、获取目录中的可用空间–disk_free_space()函数

disk_free_space()函数可以根据文件系统和磁盘分区,返回指定目录当前可以使用的字节数。

<?php
//在Windows下,查看C分区的可用字节数
$freespace = disk_free_space("C:");
echo "c:可用字节数为:".$freespace;
//以M为单位显示磁盘可用空间
$m = $freespace/1024/1024;
echo "<br>c:可用空间为:".$m;
?>

8.8、获取一个目录的磁盘总大小–disk_total_space()函数

disk_total_space()函数可以根据文件系统和磁盘分区,返回指定目录的空间大小。

<?php
    //在Windows下,查看C分区的总字节数
    $totalspace = disk_total_space("C:");
    echo "c:盘的总字节数为:".$totalspace;
    //以M为单位显示磁盘大小
    $m = $totalspace/1024/1024;
    echo "<br>c:盘大小为:".$m."M";
?>

8.9、文件/目录操作的错误处理

  1. 在文件操作过程中,由于权限、路径、文件名等不确定的因素,文件系统函数在操作文件时,会产生错误
  2. 为了避免错误产生,应在操作文件之前,对文件进检测。

8.10、判断给定文件名是否是目录–is_dir()函数

  1. 由于文件与目录的操作函数是不能通用的,所以在不确定给定的变量是文件还是目录的情况下,使用is_dir()函数进行检测
  2. is_dir(string filename) 指定路径存在且为文件夹则返回true;否则返回false
  3. 如指指定名称,没有包含完整路径,则在当前的工作文件夹内寻找是否有指定的文件夹。

8.11、判断给定文件名是否是文件–is_file()函数

  1. 使用is_file()函数,可以检测指定文件是否为文件
  2. is_file(string filename)
  3. 如果是文件返回TRUE,否则返回FALSE

8.12、检查文件或目录是否存在–file_exists(string filename)函数

  1. 在使用文件系统函数时,除了权限问题可以引起错误外,要操作的文件或目录是否存在,也经常引发错误。
  2. 在PHP中,可以使用file_exists()函数,检查指定目录或文件是否存在。
  3. file_exists(string filename)
  4. 存在返回TRUE,否则返回FALSE

8.13、判断给定文件名是否可执行–is_executable()函数

  1. is_executable()函数,可以检测指定文件是否为可执行文件
  2. is_executable(string filename)
  3. 如果测试文件存在,并可以执行,函数将返回TRUE,否则返回FALSE,

8.14、判断指定文件是否可读–is_readable()函数

  1. 服务器端的脚本程序,访问文件系统时,使用的一般都是公共用户。
  2. 由于公共用户的权限会受到一些限制,当文件权限不确定的情况下,可以使用is_readable()函数
  3. is_readable(string filename)
  4. 如果测试文件可读将返回TRUE,否则返回FALSE

8.15、判断给定的文件名是否可写–is_writable()函数

  1. 当文件权限不确定的情况下,可以使用is_writable()函数,测试指定文件是否可写。
  2. is_writable(string filename)
  3. 如果 测试文件可写将返回TRUE,否则返回FALSE,

8.16、操作目录

  1. 目录:专业的术语把其解释成存储在磁盘上的文件及其他目录的索引,也可以将其视为一个文件夹,
  2. 在文件夹中,可以放置其他的文件或文件夹,从而使得计算机的文件系统井井有条。
  3. 最顶层的目录称为根目录,在PHP中用“/”或“\”代表。“.”代表当前目录,“…”代表上级目录。

8.17、打开和关闭目录句柄–opendir($dir)/ closedir($dir_handle)

目录和文件的访问,都是通过句柄实现的。

<?php
    header("Content-Type:text/html;charset=utf-8");
    $dir = "cookie";
    if($dir_handle = @opendir($dir)){    //执行目录操作
    echo "获取目录句柄成功!";
    closedir($dir_handle);     //释放句柄
    }
    else{        echo "打开目录错误";     }
?>

在使用完opendir()打开的目录句柄后,应使用closedir()进行关闭,以节省服务器资源,

8.18、新建目录–@mkdir()

新建和删除目录属于文件系统函数。
mkdir(string pathname,[int mode[,bool recursive]])

<?php
    //带有错误检测的新建目录
    if(@mkdir("temp", 0700)){
        echo "创建目录成功!";    }
    else{    echo "建目录失败! ";    }
?>

新建目录要注意的问题:

  1. Mode用来指定要创建的文件夹的权限模式,不想设置此参数,可以设置为NULL。
  2. recursive用来指定文件夹路径中的一个或多个文件夹不存在时是否一起创建,默认为false,不一起创建。

8.19、删除目录–@rmdir

rmdir删除要求的目录,但是目录必须为空并具有相应的权限。

<?php
    if(@rmdir("temp")){
        echo “删除目录成功”;
    }
    else{
        echo “删除目录失败”;
    }  
?>

删除目录要注意的问题:

  1. 以上代码尝试删除根目录下名为“temp”的目录。
  2. 目录删除成功将返回TRUE,如果删除失败将返回FALSE,并显示错误信息,可以使用“@”符号来抑制错误信息的输出。

8.20、取得当前工作目录–getcwd()

getcwd()获取当前的工作目录,通过对返回值的判断,确定当前操作的目录是否正确。

<?php
$path = getcwd();
if($path == false){
echo “取当前目录失败!”;
}else{
echo $path; //显示当前目录
     }
?>

获取当前工作目录时要注意的问题:

  1. 此函数运行时将返回一个字符串,记录当前目录情况。
  2. 失败将返回FALSE。

8.21、改变当前目录–chdir()

chdir()可以改变当前目录,以定位到可用资源,

<?php
	// 显示当前目录
	echo getcwd() . "<br>";
	//改变当前目录
	chdir('html’);
	// 显示当前目录
	echo getcwd()."<br>";
?>

在使用chdir()函数时,要注意以下问题:

  1. 本例中的chdir()将当前目录更改为“html”。
  2. 成功返回TRUE,失败将返false

8.22、列出指定路径中的文件和目录–scandir($dir)

scandir()函数列出指定路径中的文件和目录,并能按照参数对列出的目录进行排序,默认为升序,

<?php
$dir = ‘php1';
$dir1 = scandir($dir);
$dir2 = scandir($dir,1);
if($dir1 == false){
echo “读取目录失败!”;
}else{
print_r($dir1);
}
print_r($dir2);
?>

8.23、删除文件–unlink()函数

  1. 使用unlink()函数,可以删除程序运行时产生的临时文件
  2. unlink()函数有1个参数,即要删除文件的路径与文件名。
  3. 注意:使用unlink()函数删除文件时,如果删除成功,函数将返回TRUE值,如果删除失败,函数将返回FALSE值。
<?php
//定义一个变量,保存文件名
$file = “model.txt";
//删除参数指定的文件
unlink($file);
?>

8.24、复制文件–copy()函数

  1. 复制文件就是根据源文件的内容,建立一个拥有同样内容的新文件。
  2. 在不想破坏操作文件时,可以通过复制源文件,对新产生的文件进行操作。
  3. 复制文件使用copy()函数实现。
  4. 当目标文件存在时,旧文件将会被覆盖;
  5. 复制成功返回true,否则返回false
copy(string source, string dest)

8.25、移动、重命名文件或目录–rename()函数

  1. 使用rename()函数,可以移动、重新命名一个已经存在的文件或目录
  2. rename(string oldname, string newname)
  3. 重命名成功返回true,否则返回false

8.26、打开文件/关闭文件–fopen()函数/fclose()函数

  1. fopen() 函数用于在 PHP 中打开文件。
  2. 此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:
  3. fclose() 函数用于关闭打开的文件 :
<?php
    $handle = fopen('model.txt','w');
    fclose($handle);
?>

在这里插入图片描述

<?php
	$file=fopen("welcome.txt","r") or 
		exit("Unable to open file!");
?>

8.27、新建临时文件–tmpfile() 函数

  1. tmpfile() 函数以读写(w+)模式建立一个具有唯一文件名的临时文件。
  2. 文件会在关闭后(用 fclose())自动被删除,或当脚本结束后
<?php
	//建立一个临时文件句柄
	$temp_handle = tmpfile();
	//向临时文件内写入内容
	fwrite($temp_handle, "写入到临时文件");
	//指文件指针指向文件头
	fseek($temp_handle, 0);
	//读取从文件头开始的1024个字符并显示
	echo fread($temp_handle, 1024);
	//下边的操作将删除生成的临时文件
	fclose($temp_handle); 
?>

8.28、新建具有唯一文件名的文件–empnam()函数

  1. tempnam()函数与tempfile()函数的使用方法都是一样的,唯一区别的tempnam()函数将产生一个具有唯一文件名的文件。
  2. 如果该目录不存在,tempnam() 会在系统临时目录中生成一个文件,并返回其文件名。
<?php
//使用tempnam()函数建立一个具有唯一文件名的临时文件
$file = tempnam("html","tempnam");
//使用fopen()函数打开临时文件
$handle = fopen($tmpfname,"r+");
//使用fwrite()函数向临时文件写入内容
fwrite($handle, "这是tempnam()函数产生的文件");
//关闭文件包柄
fclose($handle);
?>

9、PHP访问MySQL数据库


9.1、PHP支持MySQL的方法

  • Php.ini 中修改:在Dynamic Extensions将需要使用的组件,开启!
    ;extension=php_mysql.dll为禁用状态
    extension=php_mysql.dll 为开启状态
  • 如何支持mysql
    1、extension=php_mysql.dll 设置为开启状态。
    2、将php_mysql.dll和libmysql.dll拷到system32目录中即可。

9.2、操作数据库

连接数据库

 1. mysqli_connect ();连接
 2. mysqli_connect_error( );连接错误信息

选择数据库

$conn = mysqli_connect('localhost', ‘root’,0000) ;
//选择数据库
mysqli_select_db($conn ,‘news_data');

PHP执行创建数据库语句:

mysqli_query($link,CREATE DATABASE my_db”) 
<?php
  $conn = @mysqli_connect(“localhost”,“root”,123) or die(‘Could not connect:. mysqli_connect_errno( )) ;//建立数据库连接
    if(mysqli_query($link,"create database my_db"))
            echo "database creat<br>";
     else echo "Error creating database.".mysqli_error($link);
  mysqli_close($conn);
/*@mysqli_connect是连接失败的时候不返回失败信息,而是直接结束程序*/
?>

关闭数据库

mysqli_close($link);关闭

获取数据库服务器错误信息函数

mysqli_connect_errno():返回最近一次调用mysqli_connect()函数所产生的错误代码
 mysqli_connect_error():返回最近一次调用mysqli_connect()函数所产生的错误信息
mysqli_errno(resource link):返回最近一次调用MySQL数据库所产生的错误代码
mysqli_error(resource link):返回最近一次调用MySQL数据库所产生的错误信息

获取数据库相关信息函数

MySQL 客户端函数库的版本:
mysqli_get_client_info() 
link 连接主机的相关信息:
mysqli_get_host_info(resource link);
link 资源变量的数据库协议的版本信息:
 mysqli_get_proto_info(resource link);   
$link 连接数据库的数据库服务器的版本信息:
mysqli_get_server_info(resource link); 
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值