PHP学习笔记
PHP简介
- PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。
- PHP 可免费下载使用。
第一个PHP程序
新建一个hello.php文件,输入一段代码,运行。
PHP基本代码格式为以 ‘<?php’ 开头,以 ‘?>’ 结尾,当php文件只是一个单独的文件并未嵌入到html页面中时,可以不用写?>结尾
<?php
echo "Hello world!"; //echo表示打印内容到控制台
?>
PHP的变量
变量以$开头加变量名称
<?php
$a = 1;
$b = 1;
echo $a + $b; //2
PHP 有四种不同的变量作用域:
- local 局部变量作用域,在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问
<?php
function myTest()
{
$y = 10; // 局部变量
}
- global 全局变量作用域,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 $GLOBALS[变量名]访问。
<?php
$x = 5; // 全局变量
function myTest()
{
$y = 10; // 局部变量
$GLOBALS['x'] = 10;
echo $GLOBALS['x']; //10
}
myTest();
- static 静态变量作用域,当一个函数完成时,它的所有变量通常都会被删除。然而,有时候希望某个局部变量不要被删除。声明变量时使用 static 关键字
<?php
function myTest()
{
static $x = 0;
echo $x;
$x++;
echo PHP_EOL; // 换行符
}
myTest(); //x=0
myTest(); //x=1
myTest(); //x=2
- parameter 参数变量作用域,参数是通过调用代码将值传递给函数的局部变量。
<?php
function myTest($x)
{
echo $x;
}
myTest(5);
PHP的输出语句
- echo
<?php
echo "hello"; //echo输出内容
<?php
print "hello"; //输出内容
printf("%d%s",25,"hello"); //对内容进行格式化输出
PHP数据类型
- String(字符串)
<?php
$a="hello";
- Integer(整型)
可以以0x,0开头指定输入的进制数,但是最终输出都会是十进制
<?php
$x = 5;
var_dump($x); //int(5)
echo "<br>";
$x = -3; // 负数 int(-3)
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数 int(140)
var_dump($x);
echo "<br>";
$x = 047; // 八进制数 int(39)
var_dump($x);
- Float(浮点型)
<?php
$x = 10.365; //float(10.365)
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x); //float(2400)
echo "<br>";
$x = 8E-5;
var_dump($x); //float(8.0E-5)
- Boolean(布尔型)
<?php
$x=true;
$y=false;
- Array(数组)
<?php
//数组定义
$arr1 = array("hello", "world", "!");
- Object(对象)
<?php
class Car //用class关键字声明车对象
{
var $color; //用var声明变量
function __construct($color = "green") //构造函数
{
$this->color = $color; //用->进行赋值和调用函数
}
function what_color()
{
return $this->color;
}
}
$car = new Car(); //用new创建对象
echo $car->what_color(); //调用对象的方法,输出green
- NULL(空值)
<?php
$x = null;
var_dump($x); //NULL
PHP常量
- const用于类成员变量,一经定义不可修改
- define用于全局常量,不可用于类成员变量的定义,const可在类中使用,define不能。
<?php
const CONSTANT = 'Hello World';
echo CONSTANT;
define("GREETING", "Hello");
echo GREETING;
PHP字符串
- 字符串的连接,使用“.”连接
<?php
header("Content-type:text/html;charset=utf-8");
$str1 = "hello";
$str2 = 'hello';
echo $str1 . ' ' . $str2 . "<br/>"; //hello hello
- 字符串的长度,mb_strlen()
<?php
$str5 = "hello world!";
echo $str5 . "的长度是" . mb_strlen($str5) . "个字符" . "<br/>";
//hello world的长度是11个字符
- strpos()函数,用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。 - strrpos()查找指定字符在字符串中最后一次出现的位置
<?php
echo strpos("Hello world!","world"); //6
echo strrpos("Hello world!","w"); //6
- substr()从指定位置截取字符串
<?php
$str8 = "Welcome to the king of the world!";
//从指定位置截取字符串
$str11 = substr($str8, 4, 10); //从索引4开始截取10个
echo $str11; //ome to the
- strstr()按指定字符开始截取字符串直到末尾
<?php
$str8 = "Welcome to the king of the world!";
//按指定字符开始截取字符串直到末尾
$str12 = strstr($str8, "m");
echo $str12 . "<br/>"; //me to the king of the world!
- str_replace()替换指定字符串在字符串中
<?php
$str8 = "Welcome to the king of the world!";
//替换指定字符串在字符串中
$rep = str_replace("o", "abc", $str8);
echo $rep . "<br/>"; //Welcabcme tabc the king abcf the wabcrld!
- trim()去除空格
<?php
$str8 = " Welcome to the king of the world! ";
//去除空格,如果指定字符的话就是去除指定字符从两边直到找不到指定字符
$str10 = trim($str8, 'W');
echo $str10 . "<br/>"; //elcome to the king of the world!
PHP条件语句
- if 语句
if (条件)
{
if 条件成立时执行的代码;
}
elseif (条件)
{
elseif 条件成立时执行的代码;
}
else
{
条件不成立时执行的代码;
}
- switch语句
<?php
switch (n)
{
case 1:
//如果 n=1,此处代码将执行;
break;
case 2:
//如果 n=2,此处代码将执行;
break;
default:
//默认执行
break;
}
?>
PHP数组
- 数组声明
<?php
//数组定义
$arr1 = array("hello", "world", "!");
var_dump($arr1);
//声明数组时可以修改索引值
$arr3 = array(
"lzl" => array("lzl", "18", 163),
"sgwe" => array("sgwe", "25", 154)
);
- implode()函数,连接数组的元素通过指定的字符
<?php
$arr = ["上官婉儿", "露娜"];
//连接数组的元素通过指定的字符
$str6 = implode("和", $arr);
echo $str6; //上官婉儿和露娜
//自动连接,就是直接连接,不加任何分隔符
$str7 = implode($arr);
echo $str7; //上官婉儿露娜
- explode()按指定字符将字符串分成数组
<?php
$str8 = "Welcome to the king of the world!";
//按指定字符将字符串分成数组
$str9 = explode(' ', $str8); //按空格分割
for ($i = 0; $i < count($str9); $i++) {
echo $str9[$i] . “ "; //Welcome to the king of the world!
}
- str_split()按指定长度将字符串分成数组
<?php
$str8 = "Welcome to the king of the world!";
//按指定长度将字符串分成数组
$arr1 = str_split($str8, 4);
for ($i = 0; $i < count($arr1); $i++) {
echo $arr1[$i] . "<br/>";
}
- foreach数组遍历
<?php
//数组定义
$arr1 = array("hello", "world", "!");
//数组遍历foreach
foreach ($arr1 as $key => $value) {
printf("第%d个元素是%s<br/>", $key, $value);
}
//第0个元素是hello
//第1个元素是world
//第2个元素是!
foreach ($arr1 as $value) {
printf($value . "<br/>");
}
echo "<hr>";
- for循环遍历,使用count()函数获取数组长度
<?php
//数组定义
$arr1 = array("hello", "world", "!");
//for循环遍历
for ($i = 0, $len = count($arr1); $i < $len; $i++) {
printf("%d号元素是%s<br/>", $i + 1, $arr1[$i]);
}
echo "<hr>";
//1号元素是hello
//2号元素是world
//3号元素是!
- list()方法可以获取数组元素
<?php
//数组定义
$arr1 = array("hello", "world", "!");
list($a, $b, $c) = $arr1;
echo $a . $b . $c;//helloworld!
- sort()数组排序,sort排序不保留下标,从小到大
- rsort()排序与sort()一样但是是从大到小
<?php
//数组排序
$arr4 = array(8, 6, -95, 4545);
//sort排序不保留下标小到大
sort($arr4);
print_r($arr4); //Array ( [0] => -95 [1] => 6 [2] => 8 [3] => 4545 )
//倒序排序不保留索引大到小
rsort($arr4); //Array ( [0] => 4545 [1] => 8 [2] => 6 [3] => -95 )
- asort()排序,保留索引,从小到大
<?php
//数组排序
$arr4 = array(8, 6, -95, 4545);
//asort排序保留下标小到大
asort($arr4);
print_r($arr4); // Array ( [3] => -95 [1] => 6 [2] => 8 [0] => 4545 )
- krsort()按索引排序,按索引大到小
<?php
//数组排序
$arr4 = array(8, 6, -95, 4545);
//按键排序排序保留索引大到小
krsort($arr4);
print_r($arr4);//Array ( [3] => 4545 [2] => -95 [1] => 6 [0] => 8 )
- shuffle()打乱数组,方法会使数组下标重排,不保留原来的下标
<?php
$arr = array(8, 5, 6, 4);
print_r($arr);
shuffle($arr);
print_r($arr);
打乱前
Array
(
[0] => 8
[1] => 5
[2] => 6
[3] => 4
)
打乱后
Array
(
[0] => 4
[1] => 5
[2] => 6
[3] => 8
)
- reset()取得数组的第一个值,指针重置到第一个元素
<?php
$arr = array(8, 5, 6, 4);
print_r($arr);
echo reset($arr); //8
- end取得数组的最后一个值,指针移到最后一个元素
<?php
$arr = array(8, 5, 6, 4);
print_r($arr);
echo end($arr); //4
- next取得下一个元素,指针下移一次,先下移再取值
<?php
$arr4 = array(8, 6, -95, 4545);
//next取得下一个元素,指针下移一次,
$nex = next($arr4);
echo $nex . "<hr>"; //6
- prev取得上一个元素,指针上移一次
<?php
$arr4 = array(8, 6, -95, 4545);
//prev取得上一个元素,指针上移一次
next($arr4);
$prev = prev($arr4);
echo $prev . "<hr>"; //8
- array_push()将元素压入数组
<?php
$arr4 = array(8, 6, -95, 4545);
//压栈操作
array_push($arr4, 85, 74);
print_r($arr4);
Array
(
[0] => 8
[1] => 6
[2] => -95
[3] => 4545
[4] => 85
[5] => 74
)
- array_pop()弹出数组元素
<?php
$arr4 = array(8, 6, -95, 4545);
//弹栈操作
echo array_pop($arr4) . "<hr>"; //4545
- array_shift()从数组开头弹出元素
<?php
$arr4 = array(8, 6, -95, 4545);
echo array_shift($arr4) . "<hr>"; //8
- array_unshift()从数组开头插入元素
<?php
$arr4 = array(8, 6, -95, 4545);
echo array_shift($arr4) . "<hr>";
array_unshift($arr4, 644);
print_r($arr4);
Array
(
[0] => 644
[1] => 6
[2] => -95
[3] => 4545
)
- array_reverse()数组反转
<?php
$arr4 = array(8, 6, -95, 4545);
//数组反转
print_r(array_reverse($arr4));
Array
(
[0] => 4545
[1] => -95
[2] => 6
[3] => 8
)
- in_array()判断元素存在
<?php
$arr4 = array(8, 6, -95, 4545);
//判断元素存在
var_dump(in_array(644, $arr4)); //bool(false)
PHP循环
- while循环
while (条件)
{
要执行的代码;
}
- for循环
for (初始值; 条件; 增量)
{
要执行的代码;
}
for ($i = 1; $i <= 5; $i++) {
echo "数字为 " . $i . PHP_EOL;
}
PHP函数
简单的加法函数
function 函数名(函数参数){
函数体
}
<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1 + 16 = " . add(1,16);
PHP面向对象
- 类的定义,类使用 class 关键字后加上类名定义。类名后的一对大括号({})内可以定义变量和方法。类的变量使用 var 来声明, 变量也可以初始化值。
<?php
//定义一个车类
class Car
{
var $color;
//构造函数,用来在创建对象时初始化对象, 为对象成员变量赋初始值
function __construct($color = "green")
{
$this->color = $color;
}
function what_color()
{
return $this->color;
}
}
$car = new Car(); //使用 new 运算符来实例化该类的对象
echo $car->what_color(); //使用该对象调用成员方法
- 类的继承
//定义一个图形类
class Graphics
{
public const PI = 3.14; //定义一个常量
//面积
public function area()
{
}
//构造方法
public function __construct()
{
}
}
//定义一个圆形
class Circular extends Graphics //使用extends继承父类
{
private $radius;
public function area()
//覆写父类的方法,使用->调用方法或者获取变量,使用::获取定义的常量
{
return pow($this->radius, 2) * $this::PI;
}
public function __construct($radius = 1) //定义构造函数
{
parent::__construct();//调用父类的构造方法
$this->radius = $radius;
}
}
$c1 = new Circular(5); //创建对象
echo $c1->area(); //调用对象的方法,输出78.5
-
访问控制
- public(公有):公有的类成员可以在任何地方被访问。
- protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
- private(私有):私有的类成员则只能被其定义所在的类访问。
-
接口
//使用interface关键字定义一个接口
interface UserService
{
//定义一个查找所有用户的方法
public function findAll();
//定义一个查找一个用户的方法
public function findOne($id);
}
//使用implements关键字实现接口
class UserServiceImpl implements UserService
{
//实现接口中的方法
public function findAll()
{
return "找到了所有用户";
}
//实现接口中的方法
public function findOne($id)
{
return "找到了id为" . $id . "的用户";
}
}
$userService = new UserServiceImpl();
echo $userService->findAll(); //找到了所有用户
echo $userService->findOne(12); //找到了id为12的用户
- 抽象类
//使用abstract关键字声明抽象类
abstract class User
{
private $userName;
private $password;
//声明抽象方法
abstract public function getUserName();
abstract public function getPassword();
}
//继承抽象类
class UserImpl extends User
{
public function __construct($userName, $password)
{
$this->userName = $userName;
$this->password = $password;
}
//实现抽象方法
public function getUserName()
{
return $this->userName;
}
public function getPassword()
{
return $this->password;
}
}
$user = new UserImpl("上官婉儿", "123456");
echo $user->getUserName();//调用方法,输出上官婉儿
echo $user->getPassword();//调用方法,输出123456
- static关键字
class Graphics
{
public static $PI = 3.14;
//面积
public function area()
{
}
}
echo Graphics::$PI; //static关键字定义的变量可以直接使用类名访问
PHP时间
<?php
date_default_timezone_set("Asia/Shanghai");//设置时区
$time = date("Y-m-d H:m:s");//格式化时间
echo $time;//2021-03-05 22:03:57
PHP文件包含
add.php:
<?php
function add($x, $y)
{
$total = $x + $y;
return $total;
}
hello.php:
<?php
include "./add.php"; //使用include关键字包含add函数
echo add(45, 85); //调用函数
PHP文件上传
- 单文件上传
文件上传的html页面
<!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>
<form action="fileUpload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" value="上传" />
</form>
</body>
</html>
fileUpload.php:
<?php
header("Content-type:text/html;charset=utf-8");
//文件上传功能的封装
/**
* @param1 array $file,需要上传的文件信息
* @param2 array $allow_type,允许上传的MIME类型
* @param3 string $path,存储的路径
* @param4 string &$error,如果出现错误的原因
* @param5 array $allow_format=array(),允许上传的文件格式
* @param6 int $max_size=2000000,允许上传的最大值
*/
function fileUpload($file, $allow_type, $path, &$error, $allow_format = array(), $max_size = 2000000)
{
//判断文件是否有效
if (!is_array($file) || !isset($file['error'])) {
//文件无效
$error = '不是一个有效的文件';
return false;
}
//判断文件存储路径是否有效
if (!is_dir($path)) {
//路径不存在
$error = $path . "不是一个目录或该目录不存在!";
return false;
}
switch ($error) {
case 1:
case 2:
$error = "文件大小超出服务器允许大小";
return false;
case 3:
$error = "文件上传过程中出现问题";
return false;
case 4:
$error = "用户未选择文件上传";
return false;
case 6:
case 7:
$error = "文件保存失败";
return false;
default:
break;
}
//判断MIME类型
if (!empty($allow_type) && !in_array($file['type'], $allow_type)) {
$error = "当前文件类型不允许上传,仅允许上传以下类型的文件:" . implode(",", $allow_type);
return false;
}
//判断后缀是否允许
$ext = pathinfo($file['name'])['extension'];
if (!empty($allow_format) && !in_array($ext, $allow_format)) {
$error = "当前文件的格式不允许上传";
return false;
}
//判断大小
if ($file['size'] > $max_size) {
$error = "文件过大!";
return false;
}
//移动到指定目录
if (!is_uploaded_file($file['tmp_name'])) {
$error = "文件上传错误!";
return false;
}
//产生随机字符串
$fullName = strstr($file['type'], "/", true) . date("Ymd");
for ($i = 0; $i < 4; $i++) {
$fullName .= chr(mt_rand(65, 90));
}
$fullName .= "." . $ext;
// echo $fullName;
if (move_uploaded_file($file['tmp_name'], $path . $fullName)) {
return $fullName;
} else {
$error = "文件上传失败!";
return false;
}
}
//测试
$file = $_FILES['image'];
$path = "D:/PHP_files/uploads/";
if ($fileName = fileUpload($file, array(), $path, $file['error'], array(), 200000000)) {
echo $fileName;
} else {
echo $file['error'];
}
上传成功,返回文件名,在upload文件夹中找到该文件: