PHP 是一种运行在服务器端的脚本语言、可以嵌入到 HTML 中
PHP 代码标记
在 PHP 历史发展中,可以使用多种标记来区分 PHP 脚本
-
ASP 标记:
<% php代码%>
-
短标记:
<?php代码?>
-
脚本标记:
<script language="php">php代码</script>
-
标准标记:
<?php php代码 ?>
(1、2 基本弃用)
PHP 注释
行注释://comment
、#comment
块注释:
/*
* @autor:
* @para:
* @version:
*/
@ 符号:阻止警告输出
PHP 语句分隔符
在 PHP 中,代码都是以行为单位,系统需要判定行的结束,通常以";"结束
-
PHP 中标记结束符?> 有自带语句结束符的效果,最后一行 PHP 代码可以没有";"
-
PHP 很多代码的书写不是嵌入到 HTML 中,而是单独存在,通常书写习惯就不建议使用结束标记符?>,PHP 会认为从开始到结尾都是 PHP 代码,从而解析
变量
删除变量:unset($var)
预定义变量
提前定义的变量,系统定义的变量,存储许多需要的数据(预定义变量都是数组)
$_GET:获取所有表单以 GET 方式提交的数据
$_POST:POST 提交的数据都会保存在此
$_REQUEST:GET 和 POST 提交的都会保存在此
$_GLOBALS:PHP 所有全局变量
$_SERVER:服务器信息
$_SESSION:session 会话数据
$_COOKIE:cookie 会话数据
$_ENV:环境信息
$_FILES:用户上传的文件信息
可变变量
可变变量:如果一个变量保存的值刚好是另外一个变量的名字,那么可以通过直接访问一个变量得到另外一个变量的值,在变量前面再加一个 $ 符号
$a = 'b';
$b = 'string';
echo $$a;
//——>string
php 变量命名规则:
-
变量以 $ 符号,其后是并变量
-
变量名称必须以字母或下划线开头
-
变量不能以数字开头
-
变量名称只能包含数字、字母和下划线
-
变量名称对大小写敏感
变量传值
把一个变量赋值给另外一个变量
-
值传递:a = b 将变量保存的值复制一份,将新的值给另外一个变量保存(两个变量没有关系)
-
引用传递:a = &b 将变量保存的值所在的内存地址,传递给另外一个变量;两个变量指向同一块地址空间
- 在内存中,通常有以下几个分区
栈区:程序可以操作的内存部分(不存数据),空间小但执行快
代码段:程序可以操作的内存部分(不执行)
数据段:存储普通数据(全局区和静态区)
堆区:存储复杂数据,(空间大效率低)
常量
常量一旦定义,通常数据不可改变
PHP5.3 后有两种定义方式
-
使用定义常量的函数:define('常量名','常量值');
-
5.3 之后:const 常量名=值;
命名规则:
-
不需要使用'$',一旦使用会认为是变量;
-
通常大写
-
常量命名的规则比变量松散,可以使用一些特殊字符,该方式只能用 define 函数定义
define()和 const 定义的常量有访问权限区别
- 特殊符号的常量不能直接访问,需要用到访问常量的函数;比如不能
define('-_-','smile');
echo -_-;
应为 echo constant('-_-');
系统常量
系统帮助用户定义的常量,可以直接使用
- 常用的系统常量
PHP_VERSION:PHP 版本
PHP_INT_SIZE:整型大小(字节数)
PHP_INT_MAX:整型最大值
- 特殊的常量,它们以双下划线开始 + 常量名 + 双下划线结尾,这种常量称之为系统魔术常量,它们的值会跟着环境变化,用户无法改变
__DIR__:当前被执行的脚本所在电脑绝对路径
__FILE__:当前被执行的脚本所在电脑绝对路径(带文件名)
__LINE__:当前所属行数
__NAMESPACE__:当前所属命名空间
__CLASS__:当前所属类
__METHOD__:当前所属方法
数据类型
PHP 是一种弱类型语言,变量本身没有数据类型
数据分为三大类八小类
-
简单数据类型
-
整型 4 字节
-
浮点型 8 字节
-
字符串型
-
布尔类型 true false
-
复合数据类型
-
对象类型
-
数组类型
-
特殊数据类型
-
资源类型:存放资源数据(PHP 外部资源,如数据库、文件)
-
空类型:值为 NULL(不能运算)
类型转换
-
自动转换:系统自动判定并转换
-
强制转换:在变量前增加一个(),然后在里面写上对应类型
- 其他类型转数值的说明
-
布尔 true 为 1,false 为 0
-
字符串转数值有自己的规则
-
以字母为开头的字符串永远为 0
-
艺术字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
函数
function functionName() {
code
}
-
函数名以字母或下划线开头
-
函数名对大小写不敏感
静态变量
function test() {
static $a=1;
$a++;
echo $a;
test();//1
test();//2
test();//3
}
-
在函数执行完后,变量值仍然保存
-
修饰属性或方法,可以通过类名访问,如果是修饰的是类的属性,保留值
内部变量与外部变量
- PHP 中的全局变量 global 和 $GLOBALS 的区别
- global
Global 的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括 include 或 require 的所有文件。
但是在函数体内定义的 global 变量,函数体内可以使用,在函数体外定义的 global 变量不能在函数体内使用,具体看下面示例。
- $GLOBALS
在 $GLOBALS
数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS
之所以在全局范围内存在,是因为 $GLOBALS
是一个超全局变量。注意GLOBALS 的写法,比如变量a1,写法为 $GLOBALS['a1']
。
- 不能在用 global 声明变量的同时给变量赋值。
<?php
$name = "why";
function changeName(){
$name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>
代码执行结果:my name is why
,因为函数体 changeName
内 $name
变量被缺省设置为局部变量,$name
的作用域就是在 changeName
内
修改代码:
<?php
global $name;
$name = "why";
function changeName(){
$name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>
return
function demo() {
return 1;
$a = demo();
echo $a;//1
}
引用传参方式
function demo(&变量名){}
引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的。
同理 跟变量引用的原理是一样的
数组
数组就是在内存里有一块连续的内存空间(堆空间),这里面可以保存多个数据,数据没有数据类型的限制。
- 基本语法
-
$arr = array(元素 1,元素 2,元素 3…); //数据类型一定是数组
-
arr[] = 元素1; //定义一个arr 变量,将元素 1 添加进来
arr[] = 元素2; //将元素2添加到arr 变量中
访问数组
数组本质是变量,访问的时候就是直接使用变量,但是因为数组元素有多个,而系统没有办法直接区分到底用户是访问的哪一个,所以需要用户在访问数组的时候,使用数组下标(键名)
语法:$ 数组变量[下标]
数值下标:$arr[数值]
字符串下标:$arr[‘字符串’]
$arr[]='a';
$arr[]='b';
$arr[]='c';
$arr[]='d';
var_dump($arr[1]);//string(1) "b"
echo $arr[2];//c
数组分类
根据数组的下标的不同进行分类
- 索引数组:当前数组的下标(键名)全是数字(整型)
定义方式:系统自动分配下标
定义方式:用户手动分配下标
系统分配所引方式
-
系统是 0 开始分配下标,依次递增 1
-
用户可以手动分配下标(下标不能重复:重复的效果就是覆盖)
-
如果用户在某一处指定了下标,那么后续元素自动分配的下标从前面的最大值(索引)开始
$arr1 = arry(0=>'a',1=>'b',2=>'c');
- 关联数组:当前数组的下标全是字符串(使用最多)
-
下标必须使用引号包含
-
下标不允许重复,重复会覆盖
$arr2['name'] = 'zhang';
$arr2['age'] = 'twenty';
$arr2['job'] = 'teacher';
$arr3 = array('name'=>'zhang','age'=>'twenty''job'=>'teacher');
-
混合数组:数组的下标既有数字又有字符串
-
count() 函数返回数组中元素的数目。
-
for 循环遍历索引数组
$arr[]='a';
$arr[]='b';
$arr[]='c';
$arr[]='d';
for($i=0;$i<count($arr);$i++) {
echo $arr[$i];//abcd
}
关联或索引数组遍历
-
如果数组是一个关联数组,那么就完全不能使用 for 循环来进行遍历。PHP 提供了一个 foreach 来实现对数组元素的遍历
-
语法:
foreach(数组 as 键值对$key => $value){
//使用$key当做当前元素的下标
//使用$value当做当前元素的值
}
循环原理
$array = array('name'=>'zhang','age'=>'20',;height'=>'120');
-
第一次进入 foreach,系统会通过变量 array 找到其对应的内存地址
-
找到当前数组的第一个元素,并把该元素取出来,元素包含两个部分:键和值(指针下移)
-
将键赋值给 key 变量,将值赋给 value 变量
-
执行循环体
-
找到当前已经被获取元素的下一个元素,将其对应的两个部分赋值给 key 和 value
-
执行循环体
.......重复执行 5 和 6,直到循环结束
each() 没有循环的指针
$arr = array('demo1'=> 'woaini','demo2'=> 2222,'demo3'=> 333,'demo4'=> 'vvvvv');
var_dump(each($arr)); //指针1
var_dump(each($arr)); //指针2
var_dump(each($arr));
var_dump(each($arr));
List 的用法
list($first,$second,$third) = array('1','2','3');
echo($first); //1
获取时间戳
time() //获取当前时间戳
date(format,timestamp) //时间戳转换日期时间
参数 | 描述 |
---|---|
format | 必需。规定时间戳的格式。 |
timestamp | 可选。规定时间戳。默认是当前时间和日期。 |
时间戳转日期
Y :年(四位数)大写
m : 月(两位数,首位不足补 0) 小写
d :日(两位数,首位不足补 0) 小写
H:小时 带有首位零的 24 小时小时格式
h :小时 带有首位零的 12 小时小时格式
i :带有首位零的分钟
s :带有首位零的秒(00 -59)
a:小写的午前和午后(am 或 pm)
var_dump(date('Y-m-d H:i:s', 1560416826));
var_dump(date('Y-m-d h:i:s', 1560416826));
打开或创建文件
- fopen() 的第一个参数包含被打开的文件名,第二个参数规定打开文件的模式。
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
参数 | 描述 |
---|---|
r | 打开文件为只读。文件指针在文件开头开始 |
w | 打开文件为只写。删除文件的内容或创建一个新的文件,如果文件不存在,文件指针在文件开头开始 |
a | 打开文件为只写,文件中的现有数据会被保留,文件指针在文件结尾开始。如果文件不存在,创建新的文件 |
x | 创建新文件为只写。如果文件已存在返回 FALSE 和错误 |
r+ | 打开文件为读/写,文件指针在文件开头开始 |
w+ | 打开文件为读/写,删除文件内容或创建新文件,如果文件不存在,文件指针在文件开头开始 |
a+ | 打开文件为读/写,文件中已有的数据会被保留,文件指针在文件结尾开始。如果不存在,创建新文件 |
x+ | 创建新文件为读/写,如果文件已存在返回 FLASE 和错误 |
读文件
Fgets($find) //读第一行文件,指针向后
Fread($find,获取字节) //指定获取内容
Filesize('./a.txt') // 获取文件字节
Fclose($find) //关闭资源
修改或添加内容
Fopen(./1.xx,“a+”);
Fwrite(‘文件’,’内容’);
Fclose(find);//关闭资源
- $ _GET 变量:通过 URL 参数传递给当前脚本的变量的数组。
预定义的 $ _GET 变量用于收集来自 method =“get”的表单中的值。
$_GET['数组键(索引)']
<?php
$a = $_GET['name'];
$file = fopen("./session.txt","w+");
fwrite($file,$a);
?>
这个脚本放在 localhost/demo 下,名为 a.php
在浏览器中输入 localhost/demo/a?name='String'
,$_GET 数组的值'String'会保存到当前目录下的 sessoin.txt 文件下
GET 和 POST 接收
POST
index.html
<form action="a.php" method="post">
<input type="text" name="username" placeholder="请输入">
<p>
<input type="submit" value="提交">
</p>
</form>
a.php
<?php
header("Content-type: text/html; charset=utf-8");
include_once './index.html';
echo $_POST['username'];
?>
在浏览器中填入字段,会显示该字段
三元运算符
-
empty(): 如果没有值则为真,有值则为假
-
isset(): 如果没有值则为假,有值则为真
if(isset($_GET['name'])) {
echo $_GET['name'];
}
- 条件式?值 1:值 2
如果条件式为 true,则为值 1,否则为值 2
$a = isset($_GET['name'])?echo $_GET['name']:
文件包含
<?php
include 'a.html';
?>
include_once 'a.html';会检查该文件(a.html)是否已经被包含,如果是则不再包含
PHP 操作 MYSQL 数据库
php7 以前的版本
- MySQL 扩展的开启
-
保证 Apache 读取了 php.ini 文件:PHPInDir php.ini 文件路径
-
php.ini 开启扩展 extension:php_mysql.dll
-
加载扩展路径:extension_Dir
-
重启 Apache
- PHP 充当 MySQL 连接的客户端
-
连接认证:
new mysqli('host','user','passwd');
-
主机地址:地址 + 端口:localhost:3306
-
用户名
-
用户密码
<?php
$link = new mysqli('localhost:3306','root','passwd');
var_dump($link);
?>
PHP7 已经不能使用 mysql_connect(),php7 没有 php_mysql 这个扩展
SESSION 和 COOKIE
session 默认不开启,可以通过 php.ini 查看 session.auto_start = 0
-
开启 session 机制:
session_start()
-
使用 session 数据:往 $_SESSION 数组添加元素
-
读取 session 数据:
var_dump($__SESSION)
-
销毁 session 数据:
session_destroy()
index.html
<form action="a.php" method="post">
<input type="text" name="username" placeholder="请输入">
<p>
<input type="text" name="password" placeholder="请输入">
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
a.php
<?php
session_start();
$username = empty($_POST['username'])?'s':$_POST['username'];
$password = empty($_POST['password'])?'s':$_POST['password'];
if(isset($_SESSION['username'])) {
echo '1';
}
elseif($username == 'admin' and $password == '123') {
echo 'sign in successfully';
$_SESSION['username'] = '1';
}
else {
include_once './index.html';
}
?>
Cookie 跨域
-
默认的,cookie 只能对当前域名(完整域名:有效的二级域名)有效。
-
cookie 跨域:指的是允许 cookie 在不同的二级域名之间共享。(一级域名一致)
PHP 设置 COOKIE
Setcookie(“名字”,值,有效时间,‘有效路径’,“有效域");
Setcookie("PHPSESSID", session_id(),time()+100,'/',"xss.cn");
文件上传
- 要在服务器端开启文件上传功能
php.ini
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
upload_tmp_dir ="D:/Wampserver/tmp"
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
- 文件上传的临时目录
upload_tmp_dir
post 默认提交字符流数据,不能提交二进制数据,如果需要提交二进制数据,需要给 form 表单额外增加一个属性:enctype="multipart/form-data"
文件上传到服务器的时候,会先存放在临时目录里,PHP 会用一组变量来保存临时文件,当脚本执行结束后,PHP 会释放全部所占内存,因此这部分文件会被操作系统回收,从而看不到临时文件,最终也没有实现文件上传
- 文件上传原理
删除文件
unlink
输出信息
echo
print_r
var_dump
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于