## PHP初识
### 为什么学php?
通过live serve 起的假的服务不能做逻辑处理 所以为了熟悉前后端交互 业务流程 学习php
### 什么是php?
PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。
PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
PHP 脚本在服务器上执行
### PHP 文件是什么?
PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
PHP 文件的默认文件扩展名是 ".php"
### PHP 能做什么?
PHP 可以生成动态页面内容
PHP 可以创建、打开、读取、写入、关闭服务器上的文件
PHP 可以收集表单数据
PHP 可以发送和接收 cookies
PHP 可以添加、删除、修改您的数据库中的数据
PHP 可以限制用户访问您的网站上的一些页面
PHP 可以加密数据
### 安装 phpstudy 包含两个内容
对于初学者建议使用集成的服务器组件,它已经包含了 PHP、Apache、Mysql 等服务,免去了开发人员将时间花费在繁琐的配置环境过程;
- Windows 系统可以使用phpStudy
- XAMPP
XAMPP 支持 Mac OS 和 Windows 系统,下载地址:https://www.apachefriends.org/zh_cn/index.html。
服务器 Apache 会在本地起一个本地服务 http://localhost/ (以后启动phpstudy 必须通过http://localhost/ 来访问 绝对不能通过live serve)
### 学习phpstudy 的注意事项
```
1. 每天打开电脑 第一件事 启动 phpstudy
2. 以后启动运行phpstudy 必须通过http://localhost/ 来访问 绝对不能通过live serve
3. http://localhost/ 起的服务的根目录 在 WWW (点击小图标 鼠标右键 网站根目录)
4. 以后我们写的所有php文件 必须放在 WWW 中
```
## PHP基础语法
### 怎增使用php
PHP 脚本可以放在文档中的任何位置。
PHP 脚本以 <?php 开始,以 ?> 结束:
```
<?php
// PHP 代码
?>
```
注意:
- php的语法比较严格 语句结束之后 一定要加";" 否则会报错;
- php 语法出错 会直接将错误输出到页面中(显示错误的 行号)
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
### php的输出语法
1. echo 可以输出一个或多个字符串(多个字符串之间用逗号分隔);
2. print 只允许输出一个字符串;
3. print_r() 打印数组和对象;
```
<?php
echo "hello","world","Today","is","Thursday","<br>";
print "你好php";
print_r([1,2,3,4])
?>
```
### php的注释
1. 单行注释 (//)
2. 多行注释 (/**/)
示例:
```
<?php
// 这是单行注释
/*
这是php多行注释
*/
?>
```
### php变量
#### PHP 变量规则:
PHP 变量规则:
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)
#### 创建(声明)PHP 变量:
PHP 没有声明变量的命令,变量在您第一次赋值给它的时候被创建:
```
<?php
$a =100;
$str = "hello world";
$bool = true;
?>
```
注:PHP 也是一门弱类型语言(会根据变量的值,自动把变量转换为正确的数据类型)
#### PHP 变量作用域
- global (全局作用域);
- local (局部作用域);
- parameter (参数作用域);
1. 在函数中声明的变量是局部变量,在函数外声明的变量是全局变量(全局变量和局部变量不会相互影响);
```
<?php
// 全局变量
$x = 5;
$y = 6;
$z = $x + $y;
echo $z;
echo "<br>";
// 在函数内声明的变量是局部变量
function fn(){
$x = 10;
$y = 20;
return $x+$y;
}
$result = fn();
echo $result;
?>
```
那么,如何将函数内的局部变量改为全局变量;
- 通过global 关键词 允许局部变量 访问全局变量
- 借助超级全局变量 $GLOBALS (类似js中的window) 访问全局变量
a. 通过global 关键词 允许局部变量 访问全局变量
```
<?php
$x = 5;
function fn(){
global $x; // 通过global 关键词 可以允许$x 访问全局的$x
$x = 10;
}
fn();
echo $x;
?>
```
b.借助超级全局变量 $GLOBALS (类似js中的window) 访问全局变量
注:PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量
```
<?php
$x = 5;
function fn(){
$GLOBALS["x"] = 10; //
}
fn();
echo $x;
?>
```
3. 参数作用域(形式参数也是局部变量)
```
<?php
$a = 10;
$b = 20;
function fn($a,$b){
$a = 100;
$b = 200;
echo $a."|".$b."<br>";
}
fn(100,200);
echo $a."|".$b;
?>
```
### php常量
常量是全局的
常量在定义后,默认是全局变量,可以在整个运行的脚本的任何地方使用。
定义方法:
1. 定义常量const
2. define(name,value,case_insensitive)
name 常量名
value 常量值
case_insensitive 大小写是否不敏感 true=>不敏感(不区分大小写) false =>区分大小写
```
<?php
const a = 100;
echo a;
define("a",100 , false);
echo a."<br>";
echo A;
?>
```
### PHP数据类型
1. php基本数据类型
String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值);
注:PHP var_dump() 函数返回变量的数据类型和值;
除此之外还有 is_string(),is_int(),is_float(),is_bool(),is_null(),is_array()
```
<?php
// 字符串
$str = "hello哈哈";
var_dump($str);
echo is_string($str);
// 整型
$int = 100;
var_dump($int);
echo is_int($int);
// 浮点型
$float = 100.50;
var_dump($float);
echo is_float($float);
// 布尔
$bool = true;
var_dump($bool);
echo is_bool($bool);
// null
$n = null;
var_dump($n);
echo is_null($n);
// 数组(一维数组)
$arr = array(1,2,3,4);
// var_dump($arr);
print_r($arr);
echo is_array($arr);
?>
```
### php运算符
1. 算术运算符
2. 关系运算符
3. 逻辑运算符
4. 赋值运算符
5. 三元运算符
6. 并置运算符(.)
### php选择
1. if语句
```
if( 条件1 ){
}else if( 条件2 ){
}else{
}
```
switch语句
```
switch( 数据1 ){
case 数据2:
break;
default:
}
```
### php 循环
1. for
```
for(初始值; 条件; 增量){}
```
2. foreach
```
foreach( $array as $value ){}
```
3. while
```
while(条件){}
```
4. do while
```
do{ }while(条件)
```
### php字符串拼接之 并置运算符
字符串拼接方式:
1. 借助 并置运算符(. 作用类似js中的+)
```
$str = $a." ".$b;
echo $str;
````
2. 可以直接在字符串中拼接变量(此方法仅适用于"" 的字符串 ''不行)
```
$str = "$a,$b"; 类似ES6字符串模板拼接
echo $str;
```
3. 对于数组类型的取值拼接 如果需要多注意(将对应取值使用 {} 包裹起来)
```
$str = $GLOBALS["a"].",".$GLOBALS["b"];
echo $str;
$str="{$GLOBALS["a"]},{$GLOBALS["b"]}";
echo $str;
```
### php字符串的方法
```
strlen() 函数返回字符串的长度(字节数)。
$str = "hello world!哈哈";
$len = strlen($str);
echo $len;
strpos() 函数 查找某个或某段字符第一次出现的位置 能查到返回对应的下标 查不到 返回false
$str = "good good study , day day up";
$index = strpos($str,"day");
echo $index;
explode() 用特定的字符 将字符串切割为数组 (类似split)
$str = "good good study , day day up";
$arr = explode(" ",$str);
print_r($arr);
implode() 用特定的字符 将数组拼接为字符串 (类似join)
join() implode() 的别名。
$arr = array("good","good","study",",","day","day","up");
// print_r($arr);
// $str = implode(" ",$arr);
$str = join(" ",$arr);
echo $str;
str_ireplace() 用新的字符串替换旧的字符串(忽略大小写)
str_replace() 用新的字符串替换旧的字符串(不忽略大小写)
$str = "good good study , day day up";
$newStr = str_replace("day","money",$str);
echo $newStr;
```
### php数组
在 PHP 中,有三种类型的数组:
- 数值数组 - 带有数字 ID 键的数组;
- 关联数组 - 带有指定的键的数组,每个键关联一个值;
- 多维数组 - 包含一个或多个数组的数组;
1. 数值数组
```
// 定义数组
$arr = array('a', 'b', 'c');
// 数量
$arrlength = count( $arr);
// 结构中显示键值
print_r($arr);
//遍历数组
for($x=0;$x<$arrlength;$x++){
echo $cars[$x];
echo "<br>";
}
```
2. 关联数组
```
// 关联数两种创建方式
//1.
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
//2.
$age = array();
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
print_r($array); // 结构中显示键值
//遍历关联数组
foreach($age as $x=>$x_value){ // $array as $key=>$val
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
```
3. 多维数组
```
$arr = array(
array(
"goodsId"=>"A001",
"goodsName"=>"Redmi K30",
"goodsMsg"=>"120Hz流速屏,全速热爱",
"goodsImg"=>"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/2c16238f786e4f93bdb175d7bf21aa47.jpg?thumb=1&w=250&h=250&f=webp&q=90",
"goodsPrice"=>1559,
"buyNum"=>1
),
array(
"goodsId"=>"A002",
"goodsName"=>"Redmi K30",
"goodsMsg"=>"120Hz流速屏,全速热爱",
"goodsImg"=>"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/2c16238f786e4f93bdb175d7bf21aa47.jpg?thumb=1&w=250&h=250&f=webp&q=90",
"goodsPrice"=>1559,
"buyNum"=>1
),
array(
"goodsId"=>"A003",
"goodsName"=>"Redmi K30",
"goodsMsg"=>"120Hz流速屏,全速热爱",
"goodsImg"=>"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/2c16238f786e4f93bdb175d7bf21aa47.jpg?thumb=1&w=250&h=250&f=webp&q=90",
"goodsPrice"=>1559,
"buyNum"=>1
),
array(
"goodsId"=>"A004",
"goodsName"=>"Redmi K30",
"goodsMsg"=>"120Hz流速屏,全速热爱",
"goodsImg"=>"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/2c16238f786e4f93bdb175d7bf21aa47.jpg?thumb=1&w=250&h=250&f=webp&q=90",
"goodsPrice"=>1559,
"buyNum"=>1
),
array(
"goodsId"=>"A005",
"goodsName"=>"Redmi K30",
"goodsMsg"=>"120Hz流速屏,全速热爱",
"goodsImg"=>"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/2c16238f786e4f93bdb175d7bf21aa47.jpg?thumb=1&w=250&h=250&f=webp&q=90",
"goodsPrice"=>1559,
"buyNum"=>1
),
);
```
### JSON
```
// json_decode() JSON字符串转为JSON对象
$str = '{"a":"你好", "b":"hello123"}';
$obj = json_decode($str);
var_dump($obj);
// json_encode() JSON对象转为JSON字符串
$obj = array(
"a"=>"你好",
"b"=>"hello123"
);
$str2 = json_encode($obj, JSON_UNESCAPED_UNICODE);
echo $str2;
```
### PHP数组的方法
#### 数组头尾新增和删除
array_unshift(); 头部新增
array_push(); 尾部新增
array_shift() 头部删除
array_pop() 尾部删除
```
$arr = array("x","y","z");
array_unshift($arr,1);
array_push($arr,4);
print_r($arr);
array_shift($arr);
array_pop($arr);
print_r($arr);
```
#### 数组增删改
array_splice() 任意位置增删改
```
$arr = array("x","y","z");
array_splice($arr,1,1);
array_splice($arr,1,0,"hello");
array_splice($arr,1,1,"hello");
print_r($arr);
```
#### 数组裁切
array_slice(startIndex,endIndex); [startIndex,endIndex]
```
$arr = array("x","y","z");
$newList = array_slice($arr,1,1);
print_r($newList);
```
#### 数组反转
array_reverse();
```
$arr = array("x","y","z");
array_reverse($arr);
print_r($arr)
```
#### 数组转字符串
join()/implode() 数组转字符串 (注 join() implode() 的别名)
```
$arr = array("x","y","z");
$str = join($arr,"");
$str = implode($arr,"");
echo $str;
```
#### 数组中是否存在某元素
in_array(item,$arr); // 存在返回true 不存在返回false
```
$arr = array("x","y","z");
$res = in_array(1,$arr);
echo $res;
```
#### 数组排序;
a.普通数组(数值数组)
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
```
//纯数字排序
$list = array(4,6,2,22,11);
sort($list);
// rsort($list);
print_r($list);
//非纯数字排序
$cars=array("Volvo","BMW","Toyota");
sort($cars);
print_r($cars);
```
b. 关联数组;
ksort() - 根据关联数组的键,对数组进行升序排列;
krsort() - 根据关联数组的键,对数组进行降序排列;
asort() - 根据关联数组的值,对数组进行升序排列;
arsort() - 根据关联数组的值,对数组进行降序排列;
```
$list=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
ksort($list);
// krsort($list);
// asort($list);
// arsort($list);
print_r($list);
```
### 超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用;
PHP 超级全局变量列表:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
#### PHP $GLOBALS
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
```
$a = 100;
$b = 200;
echo $$GLOBALS["a"] + $GLOBALS["b"];
```
#### PHP $_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
|属性|描述|
|---|---|
|$_SERVER['SERVER_ADDR']|当前运行脚本所在的服务器的 IP 地址。|
|$_SERVER['SERVER_NAME']|当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定|
|$_SERVER['SERVER_PROTOCOL']|请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。|
|$_SERVER['REQUEST_METHOD'] |访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。|
|$_SERVER['REQUEST_TIME']| 请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)|
|$_SERVER['QUERY_STRING']| query string(查询字符串),如果有的话,通过它进行页面访问。|
|$_SERVER['REMOTE_ADDR']| 浏览当前页面的用户的 IP 地址。|
|$_SERVER['REMOTE_HOST']| 浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。|
|$_SERVER['REMOTE_PORT']| 用户机器上连接到 Web 服务器所使用的端口号。|
```
|属性|描述|
|$_SERVER['SERVER_ADDR'] |当前运行脚本所在的服务器的 IP 地址。|
|$_SERVER['SERVER_NAME'] |当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定|
|$_SERVER['SERVER_PROTOCOL']|请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。|
|$_SERVER['REQUEST_METHOD'] |访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。|
|$_SERVER['REQUEST_TIME'] |请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)|
|$_SERVER['QUERY_STRING'] |query string(查询字符串),如果有的话,通过它进行页面访问。|
|$_SERVER['REMOTE_ADDR'] |浏览当前页面的用户的 IP 地址。|
|$_SERVER['REMOTE_PORT'] |用户机器上连接到 Web 服务器所使用的端口号。|
```
```
@header("content-type:text/html;charset=utf-8");
echo "服务器地址:"."{$_SERVER['SERVER_ADDR']}<br>";
echo "服务器的主机名:"."{$_SERVER['SERVER_NAME']}<br>";
echo "服务器的主机名的端口:"."{$_SERVER['SERVER_PORT']}<br>";
echo "请求页面时通信协议的名称和版本:"."{$_SERVER['SERVER_PROTOCOL']}<br>";
echo "访问页面使用的请求方法:"."{$_SERVER['REQUEST_METHOD']}<br>";
echo "请求开始时的时间戳:"."{$_SERVER['REQUEST_TIME']}<br>";
echo "query string(查询字符串):"."{$_SERVER['QUERY_STRING']}<br>";
echo "浏览当前页面的用户的 IP 地址:"."{$_SERVER['REMOTE_ADDR']}<br>";
echo "用户机器上连接到Web服务器所使用的端口号:"."{$_SERVER['REMOTE_PORT']}<br>";
```
#### PHP $_GET
$_GET 广泛接收以GET方式传递过来的数据 (form传递/ajax传递),我们可以使用超级全局变量 $_GET 来对应字段(键名)的数据
html页面结构
```
<form action="../php/get.php" method="GET">
<div>
<label for="user">用户名</label>
<input name="user" type="text">
<span class="user_span"></span>
</div>
<div>
<label for="pwd">密码:</label>
<input name="pwd" type="text">
<span class="pwd_span"></span>
</div>
<div>
<button id="logBtn">注册</button>
<input type="reset">
</div>
</form>
```
get.php
```
$user = $_GET["user"];
$pwd = $_GET["pwd"];
echo $user."=>".$pwd;
```
#### PHP $_POST
$_POST 广泛接收以POST方式传递过来的数据 (form传递/ajax传递),我们可以使用超级全局变量 $_POST 来对应字段(键名)的数据
html页面结构
```
<form action="../php/post.php" method="POST">
<div>
<label for="user">用户名</label>
<input name="user" type="text">
<span class="user_span"></span>
</div>
<div>
<label for="pwd">密码:</label>
<input name="pwd" type="text">
<span class="pwd_span"></span>
</div>
<div>
<button id="logBtn">注册</button>
<input type="reset">
</div>
</form>
```
post.php
```
$user = $_POST["user"];
$pwd = $_POST["pwd"];
echo $user."=>".$pwd;
```
#### PHP $_REQUEST
$_REQUEST 广泛接收以(get/post都可以)方式传递过来的数据 (form传递/ajax传递),我们可以使用超级全局变量 $_REQUEST 来对应字段(键名)的数据
html页面结构
```
<form action="../php/post.php" method="POST">
<div>
<label for="user">用户名</label>
<input name="user" type="text">
<span class="user_span"></span>
</div>
<div>
<label for="pwd">密码:</label>
<input name="pwd" type="text">
<span class="pwd_span"></span>
</div>
<div>
<button id="logBtn">注册</button>
<input type="reset">
</div>
</form>
```
post.php
```
$user = $_REQUEST["user"];
$pwd = $_REQUEST["pwd"];
echo $user."=>".$pwd;
```
```