php
这里默认有HTML,JavaScript基础咯。
一、基础
1、客户端和服务端
客户端(用户端):享受服务的【前端,客户端运行代码】
服务端(远程):提供服务的【后端,服务端运行代码】
2、什么是php
PHP(全称:以前叫Personal Home Page,现在改名为Hypertext Preprocessor,即"PHP:超文本预处理器"),是一种通用开源脚本语言。
PHP是服务器端的语言,对于web开发(html),非常友好,能嵌入在html文档里面;可以跟html,css和JavaScript代码融合在一起,弥补它们做不了的事情。
3、XAMPP的安装
xampp官网:https://www.apachefriends.org/index.html
下载自己所需要的版本。安装即可。
开启xampp中的Apache后,在浏览器中打开localhost,即可看到htdocs(html文档)根目录下的index.php对应的页面。
4、PHP能干什么
几乎能干后端一切能干的事情
- 独立网站
- 网络爬虫
- 开发后台管理系统
- 机器学习等人工智能相关
- 提供app、小程序、web等等数据服务
- ……
php简单、好学、上手快。
5、一个好用的php集成工具——phpStudy
首先在官网(https://www.xp.cn/)下载对应的版本,然后解压,安装。
安装后,启动phpStudy中的服务器,在localhost中,即可以看到WWW根目录下的index.php对应的页面。
二、PHP基本语法
1、php标记
当解析一个文件时,PHP会寻找起始和结束标记,也就是<?php ?> , 这告诉PHP开始和停止解析二者之间的代码。此种解析方式使得PHP可以被嵌入到各种不同的文档中,而任何起始和结束标记之外的部分都会被PHP解析器忽略。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 嵌入到html文件中 -->
<?php echo "hello,php"?>
</body>
</html>
注意,访问的文档如果不是默认的index.php,则需要在访问时,加入路径进行访问。
比如想访问的是basic.php,那么需要访问的URL是localhost/basic.php
如果文件内容是纯PHP代码,最好在文件末尾删除PHP结束标记。这可以避免在PHP结束标记之后,万一意外加入空格或者换行符,会导致PHP开始输出这些空白,而脚本中此时并无输出意图。
<?php
echo "hello,php";
echo "last statement";
2、指令分隔符
PHP需要在每个语句后用分号结束指令; ,一段PHP代码中的结束标记隐含表示了一个分号,在一个PHP代码段中的最后一行可以不用分号结束。
3、注释
4、变量
PHP中变量用一个$ 后加变量名来表示。变量名区分大小写。(变量、常量、php配置文件php.ini区分大小写,其他不分)
$var = 'Bob';
$Var = 'Joe';
$4site = 'not yet';
$_4site = 'not yet';
$this = 'Nikon';
5、赋值
(1)传值赋值(默认)
使用“=”将赋值表达式的值赋给另一个变量(单独分配房间),互不干扰。
$name = "tom";
$myname = $name;
(2)引用赋值
将赋值表达式内存空间的引用赋给另外一个变量,简单地将一个& 符号加到将要赋值的变量前(共享一个房间),改变其中一个变量的值会影响另一个变量。
$foo = 'Bob';
$bar = &$foo;
6、可变变量
变量的名字可以动态改变,用$$ 符号表示。
$a = 'hello';
$$a = 'world';
7、常量
常量是一个简单值的标识符(名字),在脚本执行期间该值不能改变。默认大小写敏感,一般来讲常量标识符总是大写的,用define()函数关键词再定义。
常量只能包含标量数据(boolean, integer, float, string),注意没有$ 符号。
define('NAME', 'Tom');
echo NAME;
注意:
和使用define()定义常量不同的是,使用const关键字定义常量必须处于最顶端的作用域,因为此方法是在编译时定义的。这就意味着不能在函数中,循环内以及if语句中使用const来定义常量。
8、魔术常量(预定义常量)
9、变量作用域
(1)变量法则
- 超全局变量,任何地方都可以访问
- 常数,一般是全局性,函数内外都可以访问
- 全局变量(一般声明在函数外面),函数内不可以访问
- 函数内可以通过global关键词就可以访问全局变量(其实是同一个变量)
- 在函数中创建的静态变量,函数外无法访问,但是这个变量的值一直保留
- 在函数中创建的局部变量,函数外是无法访问的,并且在函数执行结束后失效
(2)内置超全局变量
在程序的任何地方都可以访问到,由php预先定义好的。
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
<?php
$a = 100;
$b = 200;
function add() {
$GLOBALS['c'] = $GLOBALS['a'] + $GLOBALS['b'];
}
add();
echo "<h1>$c</h1>";
(3)全局变量
全局变量一般声明在函数外的变量,代码间可以访问,函数内不可以访问。
<?php
$a = 100;
function output() {
echo "<h1>$a</h1>";
}
output();
可以在函数中使用global关键字,对全局变量进行访问。
<?php
$a = 100;
function output() {
global $a;
echo "<h1>$a</h1>";
}
output();
(4)静态变量
静态函数只是在函数体内,在函数外无法访问。但是执行后,其值保留,等待下次函数执行。
function add() {
static $c = 500;
$c++;
echo "<h1>$c</h1>";
}
add();
add();
(5)变量销毁
php一般有自动垃圾回收机制,但是也可以通过收到销毁,用函数unset()。
$a = 100;
$b = $$a;
unset($a);
echo $b;
10、数据类型
(1)整型
$a = 1234;
$a = -123;
$a = 0123;
$a = 0x1A;
$a = 0b11111111;
(2)浮点型
NAN属于浮点数
(3)字符串型
(4)布尔型
不区分大小写
(5)NULL
表示一个变量没有值。以下三种情况,变量可能为NULL:
(6)数组型
php中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。
array( key => value, …) 键key可以是一个整数integer或字符串string 值value可以是任意类型的数
$a = array(
"a" => "abc",
"b" => "ddd"
);
$b = [
"a" => "abc",
"b" => "ddd"
];
var_dump($a);
var_dump($b);
key的强制转换:
- 字符串: 如果包含合法整型值,会被转换为整型。如
"8" 实际被储存为8,但是"08" 则不会强制转换,因为其不是一个合法的十进制数值。 - 浮点数: 会被转换成整型,且转换时直接舍弃小数部分。如
8.7 实际被存储为8。 - 布尔值: 会被转换成整型,true为1,false为0。
- Null: 会被转换为空字符串,即
"" 。 - NaN: 会被转换为空字符串。
- 数组和对象: 不能被用作key,会出现警告:
Illegal offset type 。
重复的key会进行覆盖:
如果在数组定义中,多个单元都使用了同一个key,则最后一个出现的单元会将前面的覆盖。
$a = array(
1 => "abc",
"b" => "ddd",
1.5 => "ccc"
);
var_dump($a);
key为可选项:
如果未指定key,php将自动使用之前用过的最大integer键名加上1作为新的键名。
$b = ["abc", "ddd", "aaa"];
$d = array(1, 2, 3, 4);
$e = [
"a",
"b",
4 => "c",
"d"
];
var_dump($e);
注意这里的变量$e ,其中"d" 对应的键名为5,正是因为之前使用过的最大键名为4。
数组的访问:
$array[key] (大括号{} 的访问方法已经不再支持了)
$a = [1, 2, 3, 4];
echo $a[0];
$b = [
"a" => 1,
"b" => 2,
3
];
echo $b[0];
数组元素的修改与新增:
数组单元可以通过array[key] 来进行修改或新增;如果想要删除某键值对,对其调用unset() 函数。
$arr = array(5 => 1, 12 => 2);
$arr[] = 15;
unset($arr[5]);
var_dump($arr);
(7)对象型
对象是复合型的数据类型,php中任何对象可以拥有特征(属性)和行为(方法)。
class Stu
{
public $university = "PeKing";
public $major;
public function __construct($m)
{
$this->major = $m;
}
public function wugong()
{
echo "wugong";
}
}
$zhang = new Stu("CS");
var_dump($zhang);
echo $zhang->major;
Resource资源类型:
比如打开一个文件,或者链接一个数据库等。
$fp = fopen("test.txt", "r");
var_dump($fp);
fclose($fp);
11、类型转换
(1)(type) 强制转换
(int)、(integer) :转换为整型(float)、(double)、(real) :浮点型(string) :字符型(bool)、(boolean) :布尔型(array) :数组型(object) :对象
$a = "12.2";
var_dump((float)$a);
(2)intval()、floatval()、strval()
$a = "12.2";
var_dump(floatval($a));
(3)setype()函数
$a = "12.2";
settype($a, "float");
var_dump(floatval($a));
注意,前两种转换方式都不会改变原数据的类型,即$a 还是string类型。但第三种方式会改变原数据类型,也就是直接将$a 的类型转变为float类型。
(4)Integer整型(类型转换)
如果给定的数超出integer范围,将会被解释为float类型。
echo PHP_INT_MAX;
var_dump(PHP_INT_MAX + 1);
将resource转换成integer时,结果会是PHP运行时,给resource分配的唯一资源号。
$fp = fopen("test.txt", "r");
var_dump($fp);
var_dump((int)$fp);
NAN将转换为0。
echo (int)NAN;
字符串转换为数值:
如果该字符串没有包含'.','e'或'E' 并且其数字值在整型的范围之内,该字符串将被当成integer来取值,其他所有情况下为PHP_INT_MAX。
该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
$a = "1249857576676879778766767793";
var_dump((int)$a);
$b = "123aljfeioj";
var_dump((int)$b);
$c = "5.8";
var_dump((int)$c);
$d = "jflj320jljk";
var_dump((int)$d);
$e = 1.5e+10;
var_dump((int)$e);
(5)Boolean布尔类型(类型转换)
当转换为布尔值时,以下值被认为是FALSE:
- 布尔值FALSE本身
- 整型值0
- 浮点型值0.0
- 空字符串(字符串里有空格不算空字符串),以及字符串
"0" - 不包含任何元素的数组
- 特殊类型NULL(包括尚未赋值的变量)
其他所有的值都被认为是TRUE(包括任何资源 和 NAN)
$a = NAN;
var_dump((bool)$a);
$b = " ";
var_dump((bool)$b);
$c = "";
var_dump((bool)$c);
(6)String字符串(类型转换)
转换规则:
- 布尔值TRUE转换成
"1" ,FALSE转换成"" (空字符串) - 整型和浮点型转换为数字的字面样式的string
- 数组array总是转换成字符串
"Array" - NULL转换为空字符串
- 资源resource转换为
"Resource id #1" 这种结构的字符串
$a = NAN;
var_dump((string)$a);
$b = true;
var_dump((string)$b);
$fp = fopen("test.txt", "r");
var_dump((string)$fp);
fclose($fp);
(7)Array数组(类型转换)
对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为0,该元素即为此标量的值。
$a = 12.33;
var_dump((array)$a);
如果一个对象object类型转换为array,则结果为一个数组,其单元为该对象的属性,键名将为成员变量名。
class Age
{
public $age1 = 100;
private $age2 = 200;
protected $age3 = 300;
}
$s = new Age();
var_dump((array)$s);
注意这里,对象内的属性类型不同,转换为数组时,键名也会有所不同。public、private以及protected有所区别。
(8)Object对象(类型转换)
array转换成object将键名成为属性并具有相对应的值。
$obj1 = (object) array(1 => "foo");
var_dump($obj1);
var_dump($obj1->{1});
var_dump(isset($obj1->{1}));
注意,当键名为数字时,一定要使用大括号包裹键名。
对于其他值,会包含进成员变量名scalar。(scalar是标量的意思)
$obj = (object) "hao";
var_dump($obj);
var_dump($obj->scalar);
12、运算符
(1)赋值运算符=
(2)算术运算符
+ - * / % ++ -- **(指数)
intdiv() 整除
(3)字符串运算符
连接运算符. :
返回其左右参数连接后的字符串。
$a = "hello ";
$b = "php";
$c = $a.$b;
echo $c;
(4)逻辑运算符
与&&(AND)、或||(OR)、非!、异或xor
优先级从高到低:&&、||、=、AND、OR
$a = true && false;
var_dump($a);
$b = true and false;
var_dump($b);
一般情况下,AND 和&& 等价,但是要注意它们的优先级是不同的,and的优先级比较低,低于赋值运算符,所以$b 通过赋值运算符,直接等于了true。
平时使用时,建议使用&& 来替代AND ,否则优先级容易出问题。
短路运算:
$a = false && foo();
var_dump($a);
$b = false and foo();
var_dump($b);
$c = true || foo();
(5)比较运算符
== 和=== 等于和全等运算符:和JavaScript相同。
<> 和!= 不等。
!== 不全等。
<=> 太空船运算符(组合比较符):当$a 小于、等于、大于$b 时,分别返回一个小于、等于、大于0的integer值。php7开始提供。
$a = 9 <=> 10;
var_dump($a);
$b = 10 <=> 9;
var_dump($b);
$c = 9 <=> 9;
var_dump($c);
?? NULL合并操作符:从左往右第一个存在且不为NULL的操作数。如果都没有定义,则返回NULL。php7开始提供。
$a = $b ?? $c;
var_dump($a);
$d = $b ?? 10;
var_dump($d);
(6)位运算
位运算符允许对整型数中指定的位进行求值和操作。
var_dump(3 & 1);
var_dump(3 | 1);
var_dump(3 ^ 1);
var_dump(~3);
var_dump(3 << 1);
var_dump(3 >> 1);
(7)错误处理
$php_errormsg = "error";
$my_file = @file('non_existent_file') or
die("Failed opening file: error wa '$php_errormsg'");
(8)数组运算符
合并运算符+ :
$arr = [
"a" => "apple",
"b" => "banana"
];
$arr1 = [
"a1" => "apple1",
"b1" => "banana1",
"a" => "apple",
"c" => "apple"
];
$a = $arr + $arr1;
var_dump($a);
相等运算符== 和=== :
$arr = [
"a" => "apple",
"b" => "banana"
];
$arr1 = [
"b" => "banana",
"a" => "apple"
];
var_dump($arr == $arr1);
var_dump($arr === $arr1);
双等运算符主要看键值对是否一致,不管顺序。三等运算符需要考虑键值对的顺序。
$arr = ["apple", "banana"];
$arr1 = [
"1" => "banana",
"0" => "apple"
];
var_dump($arr == $arr1);
var_dump($arr === $arr1);
(9)执行运算符
php支持一个执行运算符:反引号(``)。php将尝试将反引号中的内容作为shell命令来执行,并将其输出信息返回。
$output = `ipconfig`;
echo "<pre>$output</pre>";
13、流程控制
(1)if/else
$a = 12;
$b = 13;
if ($a > $b) {
echo "a > b";
} elseif ($a < $b) {
echo "a < b";
} else {
echo "a == b";
}
php还提供了一些替代语法:
使用: 替代{ ;使用endif 替代} 。
if ($a > $b) :
echo "a > b";
elseif ($a < $b) :
echo "a < b";
else :
echo "a == b";
endif;
(2)while/do-while
同样有替代语法,: 和endwhile 。
(3)for
endfor
(4)foreach
foreach语法结构提供了遍历数组的简单方式,foreach仅能用于数组和对象。
$arr = ["a", "b", "c", "d"];
foreach ($arr as $key=>$val) {
echo "<h1>$key - $val</h1>";
}
endforeach
(5)break 和 continue
break结束当前for、foreach、while、do-while或者switch结构的执行,后面可以跟一个参数,表示跳出几层循环,默认为1层。
$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];
foreach ($arr1 as $key1=>$val1) {
foreach ($arr2 as $key2=>$val2) {
if ($val1 == "b1" && $val2 == "b2") {
echo "--------";
break;
}
echo "<h1>$val1 - $val2</h1>";
}
}
此时就是break一层的情况,输出结果为:
如果改为break 2 :
$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];
foreach ($arr1 as $key1=>$val1) {
foreach ($arr2 as $key2=>$val2) {
if ($val1 == "b1" && $val2 == "b2") {
echo "--------";
break 2;
}
echo "<h1>$val1 - $val2</h1>";
}
}
continue在循环中用来跳过本次循环中剩余代码的执行,用法跟break差不多,也可以跟参数。
|