PHP(Hypertext Preprocessor)即超文本预处理器,是在服务器中执行的脚本语言,WEB开发可以并入HTML,主要作用帮助开发人员快速开发动态网页。
WampServer作为已经配置完成的PHP集成环境
安装可百度安装
下载地址:https://www.wampserver.com/
右击language 选择中文
其中,可以访问的页面在www文件夹中,默认执行index.php文件
启动时可能会遇见的问题
因为wampserver的默认启动服务器是80,并且若本机上下载sql server 数据库时,这两个将会冲突
所以,出现冲突时,需要修改wampserver的端口号
具体如下,
找到根目录/l\wamp\bin\apache\apache2.4.9\conf环境下的httpd.conf文件
修改里面的参数 listen 和ServerName的端口号(默认80)改为所需的(默认8080)
启动~测试
出现此页面即可表示成功
<?php
//php代码块
?>
// 单行注释
# 单行注释
/*
多行注释
*/
php执行符 ;
格式
$name='abc';
<?php
$name ="abc";
echo $name;
?>
!
关于变量的定义,可以使用数字字母下划线(不能以数字开头)
$_ ="abc"; //可以使用
第一种情况
<?php
$a=1;
$b=$a;
echo $a;
echo $b;
?>
结果打印11
第二种情况
<?php
$a=1;
$b=&$a;
echo $a;
echo $b;
?>
结果打印11
在第一种情况下 将b值在等于a后再赋值
<?php
$a=1;
$b=$a;
$b=3;
echo $a;
echo $b;
?>
结果打印13
在第二种情况下 将b值在等于a后再赋值
<?php
$a=1;
$b=&$a;
$b=3;
echo $a;
echo $b;
?>
结果打印33
分析
第一种情况,分别指向各自的内存地址,所以当改变b的值时a不会改变
第二种情况,两条共同指向a的内存地址,所以当改变b的值时全部都会改变
变量嵌套使用
<?php
$name="hello";
$$name="world";
echo $hello;
?>
打印输出
$ n a m e = name = name=hello
变量定义域
<?php
$name="hello World";
function hs(){
echo $name;
}
hs();
?>
外部变量不能被内部方法访问
这个时候就需要global关键字,这个关键字用来获取全局变量
<?php
$name="hello World";
function hs(){
echo $GLOBALS["name"];
}
hs();
?>
打印结果成功获取
<?php
$name="hello World";
function hs(){
global $name;
echo $name;
}
hs();
?>
判断一个变量是否存在
isset | unset |
---|---|
是否存在 | 删除元素 |
<?php
$name="hello World";
var_dump(isset($name));
?>
<?php
$name="hello World";
var_dump(isset($names));
?>
删除元素
<?php
$name="hello World";
unset($name);
var_dump(isset($name));
?>
小案例
<?php
$name ="a123";
function hs(){
var_dump(isset($name));
}
hs();
?>
打印结果不存在
<?php
$name ="a123";
function hs(){
global $name;
var_dump(isset($name));
unset($name);
}
hs();
var_dump(isset($name));
?>
结果打印两个true
说明再方法内删除不了全局变量
static关键字可以将变量保存在内存当中
<?php
function hs(){
$sum=1;
$sum+=1;
return $sum.'<hr>';
}
echo hs();
echo hs();
?>
<?php
function hs(){
static $sum=1;
$sum+=1;
return $sum.'<hr>';
}
echo hs();
echo hs();
?>
使用了static关键字,就自动将被static修饰的变量储存起来
等待下一次调用的时候不执行,仅仅执行第一次
1.八进制转化为10进制
echo octdec(144); //8进制转换为10进制-结果100
2.十六进制转换为10进制
echo hexdec(144); //16进制转换为10进制-结果324
响应头,用来解决汉字编码问题
未添加响应头时
<?php
echo "PHP天下第一";
?>
此时页面显示
添加响应头
<?php
header("Content-type:text/html;charset=UTF-8");
echo "PHP天下第一";
?>
此时打印
正常显示
<?php
$str="<h1 style="color:red">PHP</h1>"
?>
比较常见的问题,双引号两两配对,导致出现问题
常见的解决方法
1.字符转义
<?php
$str="<h1 style=\"color:red\">PHP</h1>";
echo $str;
?>
2.边角定位
格式<<<php php;
<?php
$sst=<<<sst
<h1>web</h1>
<h2 style="color:green;">PHP</h2>
sst;
echo $sst;
?>
适用于多文本行输出
其中值得注意的是
两个标记符之间不能有空格,进一步说明
第一个sst标记符后面不能存在空格
第二个sst标记符前面不能存在空格
还有标识符号可以取除了关键字以外的所有字符,但必须保证上下标记符保持一致;
1、变量名长度
(strlen)=>strlen(字符串)
<?php
$str ="abcdefg";
echo strlen($str);
?>
打印结果为7;
打印汉字个数-(mb_strlen);
首先使用strlen函数
$str ="发大财干大饭";
echo strlen($str);
结果打印为18;因为汉字一个汉字三个字节;
所以我们需要实现个数时,就需要使用mb_strlen这个函数
<?php
header("Content-type:text/html;charset=UTF-8;");
$str ="发大财干大饭";
echo mb_strlen($str,"utf-8");
?>
结果打印为6;正好为汉字个数;
2.筛选去除函数
trim(变量名,待筛选去除字符(默认空格));
<?php
$str =" www.haojiahuo.com ";
echo strlen($str);
echo "<hr>";
echo strlen(trim($str));
?>
打印结果:
延伸函数,右去除和左去除
右侧去除 | 左侧去除 |
---|---|
rtrim() | ltrim() |
3.首字母大写
第一个首字母大写=》 ucfirst(string)
<?php
$stt="hello world";
echo ucfirst($stt);
?>
将首字母大写 结果打印Hello world
将所有单词首字母大写=》ucwords(string);
<?php
$stt="hello world";
echo ucwords($stt);
?>
结果打印 Hello World
4.分隔符
explode();根据字符分割返回数组
<?php
$str ="haojiahuo.com";
print_r(explode(".",$str));
?>
结果打印
分割成两个数组
implode(); 连接字符
<?php
$str =array("www","haojiahuo","com");
echo implode(".",$str);
?>
使用自定义连接符连接数组
结果打印 www.haojiahuo.com;
6.分割
substr();
<?php
$str ="php.web";
echo substr($str,0,3);
?>
结果打印php
打印汉字个数
mb_substr();
<?php
header("Content-type:text/html;charset=UTF-8;");
$str ="耗子尾汁";
echo mb_substr($str,0,2,"UTF-8");
?>
结果打印 耗子;
常量的定义有两种方法
1.define()
2.const
define(“变量名称”,“变量值”,区分大小写(true or false))
define("NAME","PHP");
echo NAME;
const
const SEX= "男";
echo SEX;
其中变量名一般都应为大写,
判断一个常量是否被定义
defined
echo defined("SEX");
结果打印为1,说明已经存在,符合
var_dump(defined("SEX_s"));
结果打印false;不存在
echo true? 1:2;
真=》输出1
假=》输出2
@符可以表示忽略警告
@(20/0);
这样输出会出现警告,当加上@符时,系统自动屏蔽警告
include引入与require引入
<?php
include 'decc.html';
?>
2.require引入
require("decc.html");
两者区别
使用include引入时,当引入出现错误的可以继续向下加载,反知使用require引入时,必须完全加载成功才可以向下运行;一般建议以require进行引入;
include_once 和 require_once 控制一次加载
例如
function.php
<?php
function show(){
echo "php";
}
?>
1.php
<?php
include 'function.php';
echo show();
?>
test.php
<?php
include '1.php';
include 'function.php';
echo show();
?>
每一次引入,相当于一次复制 ,假如test需要两个php文件的引入,但是两个文件有相同的方法,这样就会造成重复创建函数,导致错误
这样就需要include_once 来约定只能加载一次
同理require_once 也是只有一次;
这需要php版本大于5.60
function sum(...$number){
return array_sum($number);
}
echo sum(1,2,3,4,5);
declare(strict_types=1);
数组改变键以及值的大小写
<?php
return [
'HOST'=> 'localhost',
'poRt'=>3306,
'uSEr'=>'root',
'CAche'=>[
'hoST'=>'12.13.14.156',
'USer'=>'localname',
],
];
?>
递归变为大写
<?php
$database=include '1.php';
//转换为大写
function hd_array_change_value_case(array $data,$type){
foreach($data as $key=>$value):
$action=$type==CASE_UPPER?'strtoupper' : 'strtolower';
unset($data[$key]); //相当于返回再后面追加,所以要去除原有的k 暂时蒙
$data[$action($key)]=is_array($value)?hd_array_change_value_case($value,CASE_UPPER):$value;
endforeach;
return $data;
}
print_r(hd_array_change_value_case($database,CASE_UPPER));
?>
递归变为小写
<?php
$database=include '1s.php';
//转变为小写
function hd_array_change_value_case(array $data,$type){
foreach($data as $key=>$value):
$action=$type==CASE_UPPER?'strtoupper':'strtolower';
$data[$key]=is_array($value)?hd_array_change_value_case($value,$type):$action($value);
endforeach;
return $data;
}
print_r(hd_array_change_value_case($database,CASE_LOWER));
?>
array_walk_recursive方法进入下一层,相当于遍历下一个数组
array_walk_recursive(array,callback,custom)
<?php
$database =include '1s.php';
function hd_change_value(array $data,$type){
array_walk_recursive($data,function(&$value,$key){
$value=strtoupper($value);
});
return $data;
};
print_r(hd_change_value($database,CASE_LOWER));
?>
进一步使用自定义函数
<?php
$database=include '1s.php';
function hd_change_value(array $data,$type){
array_walk_recursive($data,function(&$value,$key,$type){
$action =$type==CASE_LOWER?'strtoupper':'strtolower';
$value=$action($value);
},$type);
return $data;
}
print_r(hd_change_value($database,CASE_UPPER));
?>
<?php
//使用serialize序列化储存以及var_export()转为php合法字符
$database=include '1s.php';
print_r($database);
var_export($database);
?>
区别:上:print_r或者var_export()
<?php
//serialize序列化
$database=include '1s.php';
$data=serialize($database);
echo $data;
echo "<br>";
$dataser=unserialize($data);
print_r($dataser);
?>
序列化将数组转为php可以识别的合法格式。
反序列化是将上述转变回来
<?php
//文件存储与获取
//存 file_put_content()
function cache($name,$data=null){
$file='cache'.'/'.md5($name).'.php';
if($data==null){
//取出数据
$contents=is_file($file)?:null;
return unserialize($contents);
}else{
//存入数据
return file_put_contents($file,serialize($data));
}
}
$database =include '1s.php';
cache('database',$database);
?>
运行之后,在cache文件夹下就会出现
取数据操作
<?php
//文件存储与获取
//存 file_put_contents()
//取 file_get_contents()
function cache($name,$data=null){
$file='cache'.'/'.md5($name).'.php';
if($data==null){
//取出数据
$contents=is_file($file)?file_get_contents($file):null;
return unserialize($contents);
}else{
//存入数据
return file_put_contents($file,serialize($data));
}
}
$database =include '1s.php';
print_r(cache('database'));
?>
date_default_timezone_set(‘PRC’); //设置时区
date_default_timezone_get(); //获取时区
PRC中国国内时区
echo date(‘Y-m-d H-i-s’); 年月日 时分秒
指从1970年1月1日到现在的秒数
<?php
//记录脚本执行时间。
//设置时区
date_default_timezone_set('PRC');
//封装函数
function runtime($starttime=null,$endtime=null){
static $cache=[];
if(is_null($starttime)){
return $cache;
}elseif(is_null($endtime)){// 说明我要设置值
return $cache[$starttime]=microtime(true);
}else{
$endtime=$cache[$endtime]?:microtime(true);
print_r($cache);
return $endtime-$cache[$starttime];
}
}
runtime('start');
for($i=0;$i>200000000;$i++){
$i++;
}
runtime('end');
echo runtime('start','end');
sleep(2);
runtime("s1");
$a=0;
while($a>200000){
$a++;
}
runtime('s2');
echo "<hr>",runtime('s1',"s2");
echo "<hr>",runtime('start',"s2");
?>
一般计时(time()) 微妙=》microtime();
其中在microtime中,microtime(true)则开启小数点,例如上图结果。
<?php
date_default_timezone_set("PRC");
//获取时间戳
echo strtotime('2021-04-18 19:19:19');
echo "<hr>";
echo date("Y-m-d H:i:s",strtotime("+1 year"));
?>
<?php
header('Content-type:text/html;charset=utf-8');
date_default_timezone_set("PRC");
$time1=new DateTime();
$time2=new DateTime("2020-08-18 12:15:20");
$time=$time1->diff($time2);
// $format='距离你的幸运日还有%a天';
$format='距离你的幸运日还有%m月%d天%H时%M分%s秒,一共%a天';
echo $time->format($format);
?>
->diff()差值
值 | 描述 |
---|---|
%Y | 年 |
%m | 月 |
%d | 日 |
%H | 小时 |
%M | 分钟 |
%s | 秒数 |
%a | 总天数 |
add增加值
<?php
$time1= new DateTime();
$time2= new DateInterval('P2DT3H2M');
echo $time1->format('Y-m-d H:i:s');
echo '<hr>';
$time1->add($time2);
echo $time1->format('Y-m-d H:i:s');
?>
函数 | 描述 |
---|---|
ceil() | 向上取整,列如10.2->11 |
floor() | 向下取整,例如10.2->10 |
max(value1,value2) | 最大值 |
min(value1,value2) | 最小值 |
round() | 四舍五入 |
mt_rand(min,max) | 取得在范围内值 |
<?php
function code($str){
$randcode='1234567890abcdefghigklmnopqrstuvwxyz';
$code='';
for($i=0;$i<$str;$i++){
$index=mt_rand(0,strlen($randcode)-1);
$code.=strtoupper($randcode[$index]);
}
return $code;
}
echo code(5);
?>
验证码随机生成
preg_match(‘/\d/’,‘a1234’);
<?php
//文件的r模式
$filename='cache/abc.txt';
$inclu=fopen($filename,'r'); //打开文件
echo fread($inclu,filesize($filename)),'<br/>';
echo fseek($inclu,4); //光标移动到第5个
echo fread($inclu,filesize($filename));
?>
方法 | 描述 |
---|---|
fopen($filename,操作) | 打开一个文件 |
fread(V1打开的文件,V2文件读取介绍位置) | 读取文件内容 |
fseek(V1打开的文件,V2光标移动位置) | 光标移动 |
() | 向下取整,例如10.2->10 |
| max(value1,value2) | 最大值 |
| min(value1,value2) | 最小值 |
| round() | 四舍五入 |
| mt_rand(min,max) | 取得在范围内值 |
<?php
function code($str){
$randcode='1234567890abcdefghigklmnopqrstuvwxyz';
$code='';
for($i=0;$i<$str;$i++){
$index=mt_rand(0,strlen($randcode)-1);
$code.=strtoupper($randcode[$index]);
}
return $code;
}
echo code(5);
?>
验证码随机生成
preg_match(‘/\d/’,‘a1234’);
<?php
//文件的r模式
$filename='cache/abc.txt';
$inclu=fopen($filename,'r'); //打开文件
echo fread($inclu,filesize($filename)),'<br/>';
echo fseek($inclu,4); //光标移动到第5个
echo fread($inclu,filesize($filename));
?>
方法 | 描述 |
---|---|
fopen($filename,操作) | 打开一个文件 |
fread(V1打开的文件,V2文件读取介绍位置) | 读取文件内容 |
fseek(V1打开的文件,V2光标移动位置) | 光标移动 |