php学习笔记
9unk Lv5

PHP 简介


PHP(全称:PHP:Hypertext Preprocessor,即“ PHP:超文本预处理器 ”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入 HTML 中使用。PHP 的主要目标是允许网络开发人员快速编写动态页面,但 PHP 也被用于其他很多领域。

PHP 的应用范围相当广泛,尤其是在网页程序的开发上。一般来说 PHP 大多运行在网页服务器上,透过运行 PHP 代码来产生用户浏览的网页。PHP 可以在多数的服务器和操作系统上运行,而且使用 PHP 完全是免费的。PHP 在 Windows 上有专门的官方移植编译项目,并且分多个 VC 编译器版本和线程安全特性来提供不同的版本支持。

历史


PHP 原本的简称为 Personal Home Page,是拉斯姆斯·勒多夫为了要维护个人网页,而用 c 语言开发的一些 CGI 工具程序集,来取代原先使用的 Perl 程序。最初这些工具程序用来显示拉斯姆斯·勒多夫的个人履历,以及统计网页流量。他将这些程序和一些窗体解释器集成起来,称为 PHP/FI。PHP/FI 可以和数据库连接,产生简单的动态网页程序。

拉斯姆斯·勒多夫在 1995 年 6 月 8 日将 PHP/FI 公开发布,希望可以透过社群来加速程序开发与查找错误。这个发布的版本命名为 PHP 2。

在 1997 年,任职于 Technion IIT 公司的两个以色列程序员:Zeev Suraski 和 Andi Gutmans,重写了 PHP 的语法分析器,成为 PHP 3 的基础,而 PHP 也在这个时候改称为 PHP: Hypertext Preprocessor。经过几个月测试,开发团队在 1997 年 11 月发布了 PHP/FI 2,随后就开始 PHP 3 的开放测试,最后在 1998 年 6 月正式发布 PHP 3。

Zeev Suraski 和 Andi Gutmans 在 PHP 3 发布后开始改写 PHP 的核心,这个在 1999 年发布的语法分析器称为 Zend Engine,他们也在以色列的 Ramat Gan 成立了 Zend Technologies 来管理 PHP 的开发。在 2000 年 5 月 22 日,以 Zend Engine 1.0 为基础的 PHP 4 正式发布

2004 年 7 月 13 日则发布了 PHP 5,PHP 5则使用了第二代的 Zend Engine。

2008 年时,PHP 5 成为了 PHP 唯一维护中的稳定版本。

2015 年 12 月 3 日开发完 PHP 7。

版本历程


颜色 代表意义
红色 过期版本;官方停止支持
黄色 当前版本;官方仅提供安全问题修复
绿色 当前版本;官方提供安全问题和一般问题的修复
蓝色 未来版本

版本 发布日期 结束支持日期 说明
1.0 1995 年 6 月 8 日 正式名称为”Personal Home Page Tools (PHP Tools)”,第一次使用了”PHP”的名字。
2.0 1996 年 4 月 16 日 针对PHP 1.0的改进版,速度更快、体积更小,更容易产生动态网页。
3.0 1998 年 6 月 6 日 2000 年 10 月 20 日 开发方式改成多人共同参与。Zeev Suraski 和 Andi Gutmans 为了这个版本重写了剖析引擎。
4.0 2000 年 5 月 22 日 2001 年 6 月 23 日 改成以 Zend 引擎作为语法分析器,具有两阶段剖析/标签剖析系统等先进功能。
4.1 2001 年 12 月 10 日 2002 年 3 月 2 日 加入”超全局变量”(superglobals)功能,包含了$_GET、$_POST、$_SESSION 等。
4.2 2002 年 4 月 22 日 2002 年 9 月 6 日 默认取消 register_globals 功能。从网络接收的数据将不会设置成全局变量,增加程序安全性。
4.3 2002 年 12 月 27 日 2005 年 3 月 31 日 加入命令行可执行文件,称为 CLI,用以补充 CGI
4.4 2005 年 7 月 11 日 2008 年 8 月 8 日 Added man pages for phpize and php-config scripts.
5.0 2004 年 7 月 13 日 2005 年 9 月 5 日 推出有着新的对象模型的 Zend Engine II。
5.1 2005 年 11 月 24 日 2006 年 8 月 24 日 在往重新设计的 PHP 引擎引入编译变量时做了性能提升。添加了PHP数据对象(PDO)作为访问数据库的统一接口。
5.2 2006 年 11 月 2 日 2011 年 1 月 6 日 默认打开”过滤”的扩展。本地的JSON支持。
5.3 2009 年 6 月 30 日 2014 年 8 月 14 日 支持名字空间;使用 XMLReader 和 XMLWriter 增强 XML 支持;支持 SOAP ,延迟静态绑定,跳转标签(有限的goto), 闭包,Native PHP archives。
5.4 2012 年 3 月 1 日 2015 年 9 月 3 日 支持 Trait、简短数组表达式。移除了 register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister(), magic_quotes 以及 session_is_registered()。加入了内建的 Web 服务器。增强了性能,减小内存使用量。
5.5 2013 年 6 月 20 日 2016 年 7 月 10 日 支持 generators,用于异常处理的 finally ,将 OpCache(基于 Zend Optimizer+)加入官方发布中。
5.6 2014 年 8 月 28 日 2018 年 12 月 31 日 支持常量标量表达式、可变参数函数、指数运算符,增加 phpdbg SAPI、统一的默认字符集。
6.x 未发布 不适用 取消掉的、从未正式发布的PHP版本。
7.0 2015 年 12 月 3 日 2018 年 12 月 3 日 Zend Engine 3 (性能提升并在 Windows 上支持 64-bit 整数),统一的变量语法, 基于抽象语法树编译过程。
7.1 2016 年 12 月 1 日 2019 年 12 月 1 日 void 返回值类型,类常量可见性修饰符
7.2 2017 年 11 月 30 日 2020 年 11 月 30 日
7.3 2018 年 12 月 6 日 未表明

吉祥物


PHP 项目的吉祥物名叫 “elePHPant”,PHP 的 logo 在一头蓝象的里面,由文森·庞蒂尔(Vincent Pontier)在 1998 年设计。

彩蛋


PHP 含有多个彩蛋,可以透过在域名的后面加上特殊字符串显示彩蛋。PHP 版本的不同,logo也会不同;不过该特性已经在 5.5 版本中被移除。

1
2
3
4
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 (PHP信息列表)
?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 (PHP的LOGO)
?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 (Zend LOGO)
?=PHPE9568F36-D428-11d2-A769-00AA001ACF42 (PHP LOGO 蓝色大象)

趣闻


PHP编程语言的官方文档中曾写过“PHP是世界上最好的语言,那其他的语言如何呢?”,因此其经常被华语圈的程序员调侃为是世界上最好的语言。

PHP 语法

PHP 标记


  • php 脚本可以放在文档中的任何位置。

  • php 脚本以 <?php 开始, 以 ?> 结束。

1
2
3
<?php
echo "hello word !";
?>

php-1.png

  • php 也允许使用短标记 <??> ,但是不建议使用。只有激活 php.ini 中的 short_open_tag 参数,php 才能使用短标记。
1
2
3
<?
echo "hello word !";
?>

php-2.png

php-3.png

  • 如果文件内容是纯 php 代码,最好在文件末尾删除 php 结束标记。避免在 php 结束标记后不小心加入空格或换行,导致 php 输出这些空白。

PHP 注释


PHP 代码中的注释不会被作为程序来读取和执行。它唯一的作用是供代码编辑者阅读。

注释用于:

  • 使其他人理解您正在做的工作 - 注释可以让其他程序员了解您在每个步骤进行的工作(如果您供职于团队)

  • 提醒自己做过什么 - 大多数程序员都曾经历过一两年后对项目进行返工,然后不得不重新考虑他们做过的事情。注释可以记录您在写代码时的思路。

1
2
3
4
5
6
7
8
9
10
11
<?php
// 这是单行注释

# 这也是单行注释

/*
这是多行注释块
它横跨了
多行
*/
?>

PHP 大小写敏感


在 PHP 中,所有用户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感。

1
2
3
4
5
<?php
echo "hello world!<br>";
ECHO "hello world!<br>";
Echo "hello world!<br>";
?>

php-4.png

不过在 PHP 中,所有变量都对大小写敏感。

1
2
3
4
5
6
<?php
$color="red";
echo "my car is " . $color ."<br>";
echo "my house is " . $COLOR . "<br>";
echo "my car is " . $Color . "<br>";
?>

php-5.png

PHP 分隔符


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

1
2
3
4
5
6
7
<?php
echo "This is a test";
?>

<?php echo "This is a test" ?>

<?php echo 'We omitted the last closing tag';

PHP echo/print


echo 和 print 是 php 中的输出语句。

echo 和 print 的区别:

  • echo:能够输出一个或多个字符串
  • print:只能输出一个字符串,并始终返回 1

注:因为 echo 不返回值,所以 echo 执行速度比 print 稍快一些。

1
2
3
4
<?php
echo 'a','b','c<br>'; // 同时输出多个字符串
print 'a'; // 只能输出一个字符串
?>

php-6.png

PHP 变量

基础


  • 变量用一个美元符号($)后面跟变量名来表示。
  • 变量名称必须以字母或下划线开头
  • 变量名称不能以数字开头
  • 变量名称只能包含字母数字字符和下划线(A-z、0-9、下划线,以及 ASCII 字符从 127 到 255)
  • 变量名是区分大小写的。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var"; // 输出 "Bob, Joe"

$4site = 'not yet'; // 非法变量名;以数字开头
$_4site = 'not yet'; // 合法变量名;以下划线开头
$i站点is = 'mansikka'; // 合法变量名;可以用中文
echo $4site;
echo "<br>";
echo $_4site;
echo "<br>";
echo $i站点is;
?>

phpvar-2.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var"; // 输出 "Bob, Joe"

///$4site = 'not yet'; // 非法变量名;以数字开头
$_4site = 'not yet'; // 合法变量名;以下划线开头
$i站点is = 'mansikka'; // 合法变量名;可以用中文
//echo $4site;
echo "<br>";
echo $_4site;
echo "<br>";
echo $i站点is;
?>

phpvar-3.png

创建变量(变量初始化)


1
2
3
4
5
6
7
8
9
10
11
<?php
//如果变量赋的值是字符串,需要用引号包围该值。
$txt="hello world!";
$x=5;
$y=10.5;
echo $txt;
echo "<br>";
echo $x;
echo "<br>";
echo $y;
?>

phpvar-1.png

php 变量的数据类型是不需要声明的,php 会根据它的值,自动把变量转换为正确的数据类型。

注:当你不初始化变量,变量会根据数据类型设置相应的默认值。例如:布尔值默认为 FALSE,整数和浮点数默认为 0,字符串为 null,数组为 empty array。

PHP 变量的作用域


在 php 中,可以在脚本的任意位置对变量进行声明。变量的作用域指的是变量的生效范围,变量能被哪些脚本调用。

PHP 有三种不同的作用域:

  • local(局部)
  • global(全局)
  • static(静态)

Local 和 Global 作用域


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

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

下面的例子测试了带有局部和全局作用域的变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$x=5; // 全局作用域

//我们可以在不同的函数中创建名称相同的局部变量,因为局部变量只能被在其中创建它的函数识别。

function myTest() {
$y=10; // 局部作用域
echo "<p>测试函数内部的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
}

myTest();

echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>

phpvar-4.png

注:

什么是函数?

函数是可以在程序中重复使用的语句块。简单来说就是把写的多行代码,整合在一起,变成一块代码,并为它设个名称。

PHP global 关键词


global 关键词用于在函数内访问全局变量,需要在(函数内部)变量前面使用 global 关键词:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$x=5;
$y=10;

function myTest() {
global $x,$y;
$y=$x+$y;
}

myTest();
echo $y; // 输出 15
?>

phpvar-5.png

PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。

上面的例子可以这样重写:

1
2
3
4
5
6
7
8
9
10
11
<?php
$x=5;
$y=10;

function myTest() {
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}

myTest();
echo $y; // 输出 15
?>

phpvar-6.png

PHP static 关键词


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

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

function myTest() {
static $x=0;
echo $x;
$x++;
}

myTest();
myTest();
myTest();

?>

phpvar-7.png

注:然后,每当函数被调用时,这个变量所存储的信息都是函数最后一次被调用时所包含的信息。该变量仍然是函数的局部变量。

可变变量


可变变量就是,一个变量的变量名可以动态的设置和使用。一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。

1
2
3
4
5
6
7
8
9
10
11
<?php
$a = 'hello'; // 普通变量
$$a = 'world'; // 可变变量
echo $a;
echo "<br>";
echo $hello;
echo "<br>";
echo "$a ${$a}";
echo "<br>";
echo "$a $hello";
?>

phpvar-8.png

要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]

PHP 常量

常量特点


  • 常量是单个值的标识符(名称)。在脚本中无法改变该值。
  • 有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。
  • 与变量不同,常量贯穿整个脚本是自动全局的。

设置 PHP 常量


使用 define() 函数定义常量,它使用三个参数:

  • 首个参数定义常量的名称
  • 第二个参数定义常量的值
  • 可选的第三个参数规定常量名是否对大小写不敏感。默认是 false。

示例


  • 对大小写敏感
1
2
3
4
<?php
define("GREETING", "Welcome to W3School.com.cn!");
echo GREETING;
?>

php-var1.png

  • 对大小写不敏感
1
2
3
4
<?php
define("GREETING", "Welcome to W3School.com.cn!", true);
echo greeting;
?>

php-var2.png

  • 常量是全局的
1
2
3
4
5
6
7
8
9
<?php
define("GREETING", "Welcome to W3School.com.cn!");

function myTest() {
echo GREETING;
}

myTest();
?>

php-var3.png

数据类型

布尔型(Boolean)

布尔类型只有两个值 true 或 false,即真与假的概念。两个值都不区分大小写,常用于条件测试。

1
2
3
4
5
6
7
<?php
$x=true;
$y=false;
var_dump($x);
echo "<br>";
var_dump($y);
?>

php-boolean.png

整型

整数是没有小数的数字。

整数规则:

  • 整数必须有至少一个数字(0-9)
  • 整数不能包含逗号或空格
  • 整数不能有小数点
  • 整数正负均可
  • 可以用三种格式规定整数:十进制、十六进制(前缀是 0x)、八进制(前缀是 0)或二进制(前缀是 0b)

注:二进制表达的 integer 自 PHP 5.4.0 起可用。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php 
$x = 5985;
var_dump($x);
echo "<br>";
$x = -345; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
echo "<br>";
$x = 0b11111111; // 二进制数
var_dump($x);
?>

php-int.png

浮点型

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

示例:

1
2
3
4
5
6
7
8
9
10
<?php 
$x = 10.365;
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x);
echo "<br>";
$x = 8E-5;
var_dump($x);
?>

php-float.png

字符串型

字符串是字符序列,比如 “Hello world!”。字符串可以是引号内的任何文本,可以使用单引号或双引号。

示例:

1
2
3
4
5
6
7
<?php 
$x = "Hello world!";
echo $x;
echo "<br>";
$x = 'Hello world!';
echo $x;
?>

php-string.png

数组

数组在一个变量中存储多个值。

示例:

1
2
3
4
<?php 
$cars=array("Volvo","BMW","SAAB");
var_dump($cars);
?>

php-array.png

对象

类:可以理解为类别。例如:人是一类、汽车是一类、电脑是一类。类还包含了属性、方法、对象。

  • 属性:就是人的特点,肌肉发达、头顶有点秃、WWE超级巨星
  • 方法:就是人会摔角、唱歌、表演等各种行为。
  • 对象:就是类里面的一个具体个体。例如:赵喜娜,就是一个具体的对象。

实例化:即把赵喜娜拉到你面前,让他确实存在。

在 PHP 中,首先我们必须声明类,然后将该类实例化为对象。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
class Person {

//人的成员属性

var $name; //人的名字

var $age; //人的年龄

//人的成员 say() 方法
function say() {

echo "I am:".$this->name."<br />";

echo "我的年龄是:".$this->age;

}

} //类定义结束

//实例化一个对象
$zxn = new Person();

//给 $zxn 对象属性赋值
$zxn->name = "赵喜娜";

$zxn->age = '30';

//调用对象中的 say()方法
$zxn->say();
echo "<br>";
// $zxn 的数据类型
echo gettype($zxn);
?>

php-object.png

NULL

特殊的 NULL 值表示一个变量没有值。NULL 数据类型,唯一可能的值就是 NULL 。

在下列情况下一个变量被认为是 NULL:

  • 被赋值为 NULL。
  • 尚未被赋值。
  • 被 unset()。

示例:

1
2
3
4
5
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>

php-null.png

PHP 运算符

PHP 算数运算符


运算符 名称 例子 结果
+ 加法 $x+$y $x 与 $y 求和
- 减法 $x-$y $x 与 $y 的差数
* 乘法 $x*$y $x 与 $y 的乘积
/ 除法 $x/$y $x 与 $y 的商数
% 取余 $x%$y $x 除以 $y 的余数

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$x=17;
$y=8;
echo ($x + $y); // 输出 25
echo "<br>";
echo ($x - $y); // 输出 9
echo "<br>";
echo ($x * $y); // 输出 136
echo "<br>";
echo ($x / $y); // 输出 2.125
echo "<br>";
echo ($x % $y); // 输出 1
?>

phpsf-1.png

PHP 赋值运算符


PHP 赋值运算符用于向变量写值。

赋值 等同于 描述
x=y x=y 右侧表达式为左侧运算数设置值。
x += y x = x + y
x -= y x = x - y
x *= y x = x * y
x /= y x = x / y
x %= y x = x % y 模数

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php 
$x=17;
echo $x; // 输出 17
echo "<br>";
$y=17;
$y += 8;
echo $y; // 输出 25
echo "<br>";
$z=17;
$z -= 8;
echo $z; // 输出 9
echo "<br>";
$i=17;
$i *= 8;
echo $i; // 输出 136
echo "<br>";
$j=17;
$j /= 8;
echo $j; // 输出 2.125
echo "<br>";
$k=17;
$k %= 8;
echo $k; // 输出 1
?>

phpsf-2.png

PHP 字符串运算符


运算符 名称 例子 结果
. 串接 $txt1 = “Hello” $txt2 = $txt1 . “ world!” 现在 $txt2 包含 “Hello world!”
.= 串接赋值 $txt1 = “Hello” $txt1 .= “ world!” 现在 $txt1 包含 “Hello world!”

示例:

1
2
3
4
5
6
7
8
9
<?php
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出 Hello world!
echo "<br>";
$x="Hello";
$x .= " world!";
echo $x; // 输出 Hello world!
?>

phpsf-3.png

PHP 递增/递减运算符


运算符 名称 描述
++$x 前递增 $x 加一递增,然后返回 $x
$x++ 后递增 返回 $x,然后 $x 加一递增
–$x 前递减 $x 减一递减,然后返回 $x
$x– 后递减 返回 $x,然后 $x 减一递减

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$x=17;
echo ++$x; // 输出 18
echo "<br>";
$y=17;
echo $y++; // 输出 17
echo "<br>";
$z=17;
echo --$z; // 输出 16
echo "<br>";
$i=17;
echo $i--; // 输出 17
?>

phpsf-4.png

PHP 比较运算符


PHP 比较运算符用于比较两个值(数字或字符串)

运算符 名称 例子 结果
== 等于 $x == $y 如果 $x 等于 $y,则返回 true。
=== 全等(完全相同) $x === $y 如果 $x 等于 $y,且它们类型相同,则返回 true。
!= 不等于 $x != $y 如果 $x 不等于 $y,则返回 true。
<> 不等于 $x <> $y 如果 $x 不等于 $y,则返回 true。
!== 不全等(完全不同) $x !== $y 如果 $x 不等于 $y,或它们类型不相同,则返回 true。
> 大于 $x > $y 如果 $x 大于 $y,则返回 true。
< 小于 $x < $y 如果 $x 小于 $y,则返回 true。
>= 大于或等于 $x >= $y 如果 $x 大于或者等于 $y,则返回 true.
<= 小于或等于 $x <= $y 如果 $x 小于或者等于 $y,则返回 true。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$x=17;
$y="17";

var_dump($x == $y);
echo "<br>";
var_dump($x === $y);
echo "<br>";
var_dump($x != $y);
echo "<br>";
var_dump($x !== $y);
echo "<br>";

$a=17;
$b=8;

var_dump($a > $b);
echo "<br>";
var_dump($a < $b);
?>

phpsf-5.png

PHP 逻辑运算符


运算符 名称 例子 结果
and $x and $y 如果 $x 和 $y 都为 true,则返回 true。
or $x or $y 如果 $x 和 $y 至少有一个为 true,则返回 true。
xor 异或 $x xor $y 如果 $x 和 $y 有且仅有一个为 true,则返回 true。
&& $x && $y 如果 $x 和 $y 都为 true,则返回 true。
! !$x 如果 $x 不为 true,则返回 true。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

// --------------------
// foo() 根本没机会被调用,被运算符“短路”了

$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());

// --------------------
// "||" 比 "or" 的优先级高

// 表达式 (false || true) 的结果被赋给 $e
// 等同于:($e = (false || true))
$e = false || true;

// 常量 false 被赋给 $f,true 被忽略
// 等同于:(($f = false) or true)
$f = false or true;

var_dump($e, $f);
echo "<br>";
// --------------------
// "&&" 比 "and" 的优先级高

// 表达式 (true && false) 的结果被赋给 $g
// 等同于:($g = (true && false))
$g = true && false;

// 常量 true 被赋给 $h,false 被忽略
// 等同于:(($h = true) and false)
$h = true and false;

var_dump($g, $h);
?>

phpsf-6.png

PHP数组运算


PHP 数组运算符用于比较数组

运算符 名称 例子 结果
+ 联合 $x + $y $x 和 $y 的联合(但不覆盖重复的键)
== 相等 $x == $y 如果 $x 和 $y 拥有相同的键/值对,则返回 true。
=== 全等 $x === $y 如果 $x 和 $y 拥有相同的键/值对,且顺序相同类型相同,则返回 true。
!= 不相等 $x != $y 如果 $x 不等于 $y,则返回 true。
<> 不相等 $x <> $y 如果 $x 不等于 $y,则返回 true。
!== 不全等 $x !== $y 如果 $x 与 $y 完全不同,则返回 true。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// a,b,c,d为键,apple等为值
$x = array("a" => "apple", "b" => "banana");
$y = array("c" => "orange", "d" => "peach");
$z = $x + $y; // $x 与 $y 的联合
var_dump($x);
echo "<br>";
var_dump($y);
echo "<br>";
var_dump($z);
echo "<br>";
var_dump($x == $y);
echo "<br>";
var_dump($x === $y);
echo "<br>";
var_dump($x != $y);
echo "<br>";
var_dump($x <> $y);
echo "<br>";
var_dump($x !== $y);
?>

phpsf-7.png

PHP位运算符


运算符 名称 例子 结果
& 按位与 $a & $b 将把 $a 和 $b 中都为 1 的位设为 1。
| 按位或 $a | $b 将把 $a 和 $b 中任何一个为 1 的位设为 1。
^ 按位异或 $a ^ $b 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ 按位取反 ~ $a 将 $a 中为 0 的位设为 1,反之亦然。
<< 左移 $a << $b 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
>> 右移 $a >> $b 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

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

PHP错误控制运算符


PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

如果用 set_error_handler() 设定了自定义的错误处理函数,仍然会被调用,但是此错误处理函数可以(并且也应该)调用 error_reporting(),而该函数在出错语句前有 @ 时将返回 0。

如果激活了 track_errors 特性,表达式所产生的任何错误信息都被存放在变量 $php_errormsg 中。此变量在每次出错时都会被覆盖,所以如果想用它的话就要尽早检查。

示例:

1
2
3
4
5
6
7
8
9
10
11
<?php
/* Intentional file error */
$my_file = @file ('non_existent_file') or
// die 函数指定一个错误消息,并退出当前执行语句
die ("Failed opening file: error was '$php_errormsg'");

// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.

?>

phpsf-8.png

注: @ 运算符只对表达式有效。对新手来说一个简单的规则就是:如果能从某处得到值,就能在它前面加上 @ 运算符。例如,可以把它放在变量,函数和 include 调用,常量,等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。

警告: 目前的“@”错误控制运算符前缀甚至使导致脚本终止的严重错误的错误报告也失效。这意味着如果在某个不存在或者敲错了字母的函数调用前用了“@”来抑制错误信息,那脚本会没有任何迹象显示原因而死在那里。

PHP执行运算符


PHP 支持一个执行运算符:反引号(``)。PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。

示例:

1
2
3
4
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>

phpsf-9.png

PHP 条件语句


在 PHP 中,可以使用以下条件语句:

  • if 语句:如果指定条件为真,则执行代码
  • if…else 语句:如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码
  • if…elseif….else 语句:根据两个以上的条件执行不同的代码块
  • switch 语句:选择多个代码块之一来执行

if 语句

if 语句用于在指定条件为 true 时执行代码。


语法

1
2
3
if (条件) {
当条件为 true 时执行的代码;
}

实例

1
2
3
4
5
6
7
<?php
$t=date("H");

if ($t<"20") {
echo "Have a good day!";
}
?>

phpif-1.png

if…else 语句

if….else 语句在条件为 true 时执行代码,在条件为 false 时执行另一段代码。


语法

1
2
3
4
5
if (条件) {
条件为 true 时执行的代码;
} else {
条件为 false 时执行的代码;
}

实例

1
2
3
4
5
6
7
8
9
<?php
$t=date("H");

if ($t<"20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
?>

phpif-2.png

if…elseif…else 语句

if….elseif…else 语句来根据两个以上的条件执行不同的代码。


语法

1
2
3
4
5
6
7
if (条件) {
条件为 true 时执行的代码;
} elseif (condition) {
条件为 true 时执行的代码;
} else {
条件为 false 时执行的代码;
}

实例

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$t=date("H");

if ($t<"10") {
echo "Have a good morning!";
} elseif ($t<"20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
?>

phpif-3.png

switch 语句

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


语法

1
2
3
4
5
6
7
8
9
10
11
switch (expression)
{
case label1:
expression = label1 时执行的代码 ;
break;
case label2:
expression = label2 时执行的代码 ;
break;
default:
表达式的值不等于 label1 及 label2 时执行的代码;
}

phpif-3.png

工作原理:

  1. 对表达式(通常是变量)进行一次计算
  2. 把表达式的值与结构中 case 的值进行比较
  3. 如果存在匹配,则执行与 case 关联的代码
  4. 代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
  5. 如果没有 case 为真,则使用 default 语句

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$favfruit="orange";

switch ($favfruit) {
case "apple":
echo "Your favorite fruit is apple!";
break;
case "banana":
echo "Your favorite fruit is banana!";
break;
case "orange":
echo "Your favorite fruit is orange!";
break;
default:
echo "Your favorite fruit is neither apple, banana, or orange!";
}
?>

PHP 循环


在 PHP 中有以下循环语句:

  • while - 只要指定条件为真,则循环代码块
  • do…while - 先执行一次代码块,然后只要指定条件为真则重复循环
  • for - 循环代码块指定次数
  • foreach - 遍历数组中的每个元素并循环代码块

while循环

只要指定条件为真,while 循环就会执行代码块


语法

1
2
3
while (条件为真) {
要执行的代码;
}

实例

1
2
3
4
5
6
7
8
9
// 首先把变量 $x 设置为 1($x=1)。然后执行 while 循环,只要 $x 小于或等于 5。循环每运行一次,$x 将递增 1
<?php
$x=1;

while($x<=5) {
echo "这个数字是:$x <br>";
$x++;
}
?>

while.png

do…while循环

do…while 循环首先会执行一次代码块,然后检查条件,如果指定条件为真,则重复循环。


语法

1
2
3
do {
要执行的代码;
} while (条件为真);

实例

1
2
3
4
5
6
7
8
9
// 首先把变量 $x 设置为 1($x=1)。然后,do while 循环输出一段字符串,然后对变量 $x 递增 1。随后对条件进行检查($x 是否小于或等于 5)。只要 $x 小于或等于 5,循环将会继续运行
<?php
$x=1;

do {
echo "这个数字是:$x <br>";
$x++;
} while ($x<=5);
?>

do-while.png

for循环

指定代码块循环执行的次数


语法

1
2
3
for (; test counter; increment counter) {
code to be executed;
}

参数:

  • init counter:变量初始化值
  • test counter:: 每次循环开始前求值。如果值为 TRUE,继续循环。如果它的值为 FALSE,循环结束。
  • increment counter:增加循环计数器的值

实例

1
2
3
4
5
6
// 从 0 循环到 10,并输出每次循环的结果
<?php
for ($x=0; $x<=10; $x++) {
echo "数字是:$x <br>";
}
?>

for.png

foreach 循环

foreach 循环只适用于数组,并用于遍历数组中的每个键/值对。


语法

1
2
3
4
// 每进行一次循环,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。
foreach ($array as $value) {
code to be executed;
}

实例

1
2
3
4
5
6
7
<?php 
$colors = array("red","green","blue","yellow");

foreach ($colors as $value) {
echo "$value <br>";
}
?>

foreach.png

PHP 函数

用户自定义函数

函数是可以在程序中重复使用的语句块,PHP 可以创建自定义函数。页面加载时函数不会立即执行,只有在被调用时才会执行。

  • 函数名能够以字母或下划线开头(而非数字)。

  • 函数名对大小写不敏感。


语法

1
2
3
4
5
6
// 用户定义的函数声明以单词 "function" 开头:

function functionName() {
被执行的代码;
}

实例

1
2
3
4
5
6
7
8
// 在下面的例子中,创建了一个 sayHi() 的函数 "{" 指的是函数代码的开始,"}" 指的是函数的结束。此函数输出 "hello world!"
<?php
function sayHi() {
echo "Hello world!";
}

sayhi(); // 调用函数
?>

php1.png

函数参数

PHP 可以通过参数向函数传递信息,参数类似变量。

参数被定义在函数之后的括号中。括号中可以添加任意多个参数,只要用逗号隔开就行。


实例

1
2
3
4
5
6
7
8
9
10
11
12
// 下面的例子中的函数有一个参数($fname)。当调用 familyName() 函数时,我们同时要传递一个名字(例如 Bill),这样会输出不同的名字,但是姓氏相同:
<?php
function familyName($fname) {
echo "$fname Zhang.<br>";
}

familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
?>

php2.png

1
2
3
4
5
6
7
8
9
10
// 下面的例子中的函数有两个参数($fname 和 $year)
<?php
function familyName($fname,$year) {
echo "$fname Zhang. Born in $year <br>";
}

familyName("Li","1975");
familyName("Hong","1978");
familyName("Tao","1983");
?>

php3.png

默认参数

1
2
3
4
5
6
7
8
9
10
11
// 下面的例子展示了如何使用默认参数。如果我们调用没有参数的 setHeight() 函数,它的参数会取默认值:
<?php
function setHeight($minheight=50) {
echo "The height is : $minheight <br>";
}

setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>

php4.png

函数返回值


1
2
3
4
5
6
7
8
9
10
11
// 使用 return 语句,使函数返回值。
<?php
function sum($x,$y) {
$z=$x+$y;
return $z;
}

echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>

php5.png

可变函数

PHP 支持可变函数的概念。可变函数就是:如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。


实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 下面的例子中,定义了 3 个函数,并使用 $func() 来调用这些函数

<?php
function foo() {
echo "In foo()<br />\n";
}

function bar($arg = '') {
echo "In bar(); argument was '$arg'.<br />\n";
}

// 使用 echo 的包装函数
function echoit($string)
{
echo $string;
}

$func = 'foo';
$func(); // 调用 foo()

$func = 'bar';
$func('test'); // 调用 bar()

$func = 'echoit';
$func('test'); // 调用 echoit()
?>

php6.png

PHP 数组

数组的类型

  • 索引数组 - 带有数字索引的数组
  • 关联数组 - 带有指定键的数组
  • 多维数组 - 包含一个或多个数组的数组

创建数组

在 PHP 中, array() 函数用于创建数组:

1
array();

索引数组

PHP 有两种创建索引数组的方法:

  1. 索引是自动分配的(索引从 0 开始):
1
$cars=array("porsche","BMW","Volvo");
  1. 索引是手动分配的
1
2
3
$cars[0]="porsche";
$cars[1]="BMW";
$cars[2]="volvo"

实例

1
2
3
4
5
// 创建名为 $cars 的索引数组,为其分配 3 个元素,然后输出包含数组值的一段文本
<?php
$cars=array("porsche","BMW","volvo");
echo "I like" . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

phpsz-1.png

获取数组长度

count() 函数用于返回数组的长度

实例

1
2
3
4
<?php
$cars=array("porsche","BMW","Volvo");
echo count($cars);
?>

phpsz-2.png

遍历索引数组

使用 for 循环遍历并输出索引数组的所有值

实例

1
2
3
4
5
6
7
8
9
<?php
$cars=array("porsche","BMW","Volvo");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++) {
echo $cars[$x];
echo "<br>";
}
?>

phpsz-3.png

关联数组

关联数组就是给数组的索引值指定相应的值。你可以把它们想象为一组卡片,每张卡片上半部分是索引而下半部分是数值。关联数组的索引值可以是任意非空值,而且关联数组的元素没有特定的顺序。

有两种创建关联数组的方法:

1
$age=array("Bill"=>"35","Steve"=>"37","Elon"=>"43");

或者:

1
2
3
$age['Bill']="63";
$age['Steve']="56";
$age['Elon']="47";

实例

1
2
3
4
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
echo "Elon is " . $age['Elon'] . " years old.";
?>

phpsz-4.png

遍历关联数组

使用 foreach 循环遍历并输出关联数组的所有值

实例

1
2
3
4
5
6
7
8
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");

foreach($age as $x=>$x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>

phpsz-5.png

reference


PHP

关闭PHP Credits和隐藏的GUID图片Logo彩蛋的显示

Php彩蛋

w3school php 教程

PHP 官方手册

php:对象(object)数据类型实例详解

  • 本文标题:php学习笔记
  • 本文作者:9unk
  • 创建时间:2020-01-19 11:24:10
  • 本文链接:https://9unkk.github.io/2020/01/19/php-xue-xi-bi-ji/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!