表达式:任何有值的东西就是表达式
php可以解析双引号,不可以解析单引号,双引号中引用变量可以输出引用变量的值,但是单引号不可以
1.变量和变量的销毁
unset(变量名) //销毁变量
变量是严格区分大小写的,在php中使用$符来定义变量
$变量名=变量值
$name $NAME $Name是不同的变量
字母或下划线开头
后面接任何数量的字母下划线
不可以使用数字开头
中间不可用空格空白符
unset():
<?php
$a='abcde';
unset($a); //销毁变量,这样就会echo为空或者报错变量不存在
echo $a;
?>
2.双变量解释
<?php
$abc='test'; //定义了一个变量$abc里面存了值test
$$abc='小白'; //分开看,$abc被赋值给test,然后$$abc也就是$test了
echo $abc.'<br>';
echo $$abc.'<br>';
echo $test;
?>
结果:
test
小白
小白
3.变量链接
<?php
$a=1000;
$b=&$a; //相当于链接起来$a和$b这样,操作其中任何一个,另一个都会被重新赋值
$b=20;
echo $a;
echo $b;
?>
结果为:
20
20
4.变量类型
<?php
$a=true;
var_dump($a);
echo $a.'<br>';
print($a);
var_dump显示类型用于调试
类型有true和false是bool类型(布尔)
//var_dump用于调试,会输出详细信息,和变量类型
//echo和print用于输出变量的值,不显示类型
?>
具体类型有:
字符型(string),数字型(int),浮点数(float),布尔型(bool)
########################################################
字符型使用单引号,双引号或者定界符来包裹的
$a='zifuchuan1';
$b="zifuchuan2";
$c=<<<aaa
zifuchuan3
aaa;
其中定界符是用3个小于号然后aaa或者其他任意字符中间包裹的内容
<<<aaaxxxxxaaa 定界符+标识符开始+字符+标识符结束
#################################################################
定界符例子:
<?php
$a=1000;
$b=<<<aaa
woshizifuchuanya
aaa;
var_dump($b)
?>
结果:
string(16) "woshizifuchuanya"
#############################################################
定界符中包裹变量:
<?php
$a=1000;
$b=<<<aaa
woshizifuc{$a}huanya
aaa;
var_dump($b)
?>
结果为;
string(20) "woshizifuc1000huanya"
定义空变量
<?php
$a=null; //大小写都可以
var_dump($a);
var_dump($b);
?>
结果:
NULL NULL
不定义变量值和等于null都会显示空
###################################################################
类型转换
$a='zifuchuan';
$b=(int)$a; //这个类型转换和py不一样,要注意以下
var_dump($b);
echo $b
5.常量
常量是一个简单值的标示符,如其名称所暗示的,在我们php脚本中执行期间,一个常量一旦被定义,就不能改变或者取消定义,常量的作用域是全局,常量只能包含bool,int,float,string类型的数据
常量用于临时存储的容器,变量也是
定义和使用
自定义常量:
自定义常量区分大小写
define('常量名称',常量值) //常量名称需要用单引号双引号等来包裹起来,常量的值要是字符串也要用单引号双引号包裹起来
define()函数来检查是否定义了某个变量
示例:
<?php
define('my_name','我的名字');
echo my_name; //调用常量,看my_name的值
?>
结果为:
我的名字
规则:和变量一样,只能包含数字字母下划线,且要字母和下划线开头,不可以用数字开头
常量的名称通常是大写的,可以不大写,标准是大写的
常量和变量区别:
常量不需要用$符,只可以用define定义
一旦定义不可以重新定义
<?php
define('my_name','我的名字');
define('my_name','新的名字');
echo my_name; //调用常量,看my_name的值
?>
结果
我的名字
常量的值只可以是bool,int,float,string类型
预定义常量:
预定义常量就是php内核预先给我们定义好的,其中有的预定义常量是两个下划线开头的,我们又叫它为魔术常量,例如:FILE
查看php所有的预定义常量
<?php
print_r(get_defined_constants());
//个人感觉print_r和var_dump差不多,官方说var_dump用于调试,print_r显示人类可读的变量信息
?>
结果: //太多了,所以就只复制了这些
array(1666) {
["E_ERROR"]=>
int(1)
["E_RECOVERABLE_ERROR"]=>
int(4096)
["E_WARNING"]=>
int(2)
["E_PARSE"]=>
int(4)
["E_NOTICE"]=>
int(8)
["E_STRICT"]=>
int(2048)
["E_DEPRECATED"]=>
int(8192)
["E_CORE_ERROR"]=>
int(16)
["E_CORE_WARNING"]=>
int(32)
["E_COMPILE_ERROR"]=>
int(64)
["E_COMPILE_WARNING"]=>
int(128)
["E_USER_ERROR"]=>
int(256)
["E_USER_WARNING"]=>
int(512)
["E_USER_NOTICE"]=>
int(1024)
["E_USER_DEPRECATED"]=>
int(16384)
["E_ALL"]=>
int(32767)
常用的预定义常量
都定义常量不区分大小写的
__FILE__: //输出当前文件的位置
<?php
echo __FILE__;
print_r(__FILE__);
var_dump(__FILE__);
print(__FILE__);
?>
##################################################
__LINE__: //当前文件中的行号
<?php
echo __LINE__; //输出当前__LINE__所在的行
?>
####################################################
运算符
说白了就是一些符号,认识 php常用的一些符号,这些符号可以将变量或者数据,指定某种运算
运算符对一个或者多个操作数(变量或者数值)执行某种运算的符号,也称为操作符
举例:
!true
!是运算符,true是操作数
$a+$b
+是运算符,$a和$b是操作数
true ? 1:0
?和:是运算符,true,1,0是操作数
根据操作的个数分为:一元运算符,二元运算符,三元运算符
一些情况下,两边加上空格会更美观
算数运算符
Matlab
+-*/%都是算数运算符
+的例子:
<?php
$a=1;
$b=2;
$c=$a+$b;
print($c);
?>
结果为:
3
######################################、
-的例子:
<?php
$a=1;
$b=2;
$c=$a-$b;
print($c);
?>
结果:
-1
########################################
取反:
<?php
$a=9;
echo -$a;
echo '<br>';
echo $a;
?>
结果:
-9
9
注意:说明取反的并没有影响到它本身
#########################################
*的例子:
<?php
$a=9;
$b=3;
$c=$a*$b;
echo $c;
?>
结果为:
27
###########################################
/的例子:
<?php
$a=9;
$b=3;
$c=$a/$b;
echo $c;
?>
结果为:
3
###########################################
%的例子:
<?php
$a=9;
$b=3;
$c=$a%$b;
$d=$b%2;
echo $c;
echo '<br>';
echo $d;
?>
结果为:
0
1
可以计算是奇数还是偶数
###########################################
++的例子:
<?php
$a=10;
++$a;
echo $a;
?>
结果
11
前++和后++的区别
前++ 前自增,不返回变量的值,直接自增
<?php
$a=10;
echo ++$a; //先返回$a,再a++,如同echo $a;echo $a++
echo '<br>';
echo $a;
?>
结果为:
11
11
后++ 后自增,先返回变量的值,再自增
<?php
$a=10;
echo $a++; //先返回$a,再a++,如同echo $a;echo $a++
echo '<br>';
echo $a;
?>
结果为
10
11
#################################################
--的例子
<?php
$a=10;
$a--;//$a=$a-1
--$a;//$a=$a-1
echo $a;
?>
前-- 前自减,直接自减
<?php
$a=10;
echo --$a; //先返回变量的值,然后自减,如同:echo $a; echo $a--
echo '<br>';
echo $a;
?>
结果为:
9
9
后-- 后自减,先返回变量的值,然后再执行自减
<?php
$a=10;
echo $a--; //先返回变量的值,然后自减,如同:echo $a; echo $a--
echo '<br>';
echo $a;
?>
结果为:
10
9
注意:不管是前++前--还是后++后--前后值都要是变量,不可以是4--或者4++或--4或++4
自增和自减是对于变量而言的
字符串运算符
字符串运算符只有一个就是.连接运算符
Matlab
连接运算符为.
<?php
$a='字符串1';
$b='测试连接';
echo $a.$b;
?>
结果为;
字符串1测试连接
##########################
赋值运算符;
把右边的值,赋值给左边的变量
赋值运算符
Matlab
二元运算符
左边的操作数必须是变量,右边可以是一个表达式,也可以是一个值,一个变量等等
作用:将右边表达式的值赋给左边变量
=
+=
-=
*=
/+
%=
.=
###########################
示例1-
<?php
$a=1;
$b=2;
$a+=$b;//就是$a=$a=$b
echo $a;
?>
结果为;
3
###########################
示例2-
<?php
$a=1;
$b=2;
$a-=$b;//就是$a=$a=$b
echo $a;
?>
结果为;
-1
###########################
往后的上同
比较运算符
对操作数(按照比较 运算符的要求,规则)进行比较
如果比较出的结果满足比较运算符的要求那么结果就是true(真,成立,满足),否则就是false(假,不成立,不满足)
php的若比较:运算符==
运算符为==,比较值是否相等,相等为true,否则为false
这里使用echo x,x为真,为true的话就返回1了,否则返回为空
使用var_dump可以看到详细信息,用于调试
<?php
$a=1;
$b=1;
echo $a==$b; //输出1
echo '<br>';
print_r($a==$b);//这里也输出1
echo '<br>';
var_dump($a==$b);//这里输出类型
?>
结果为:
1
1
bool(true)
使用var_dump来输出bool更详细
两个==是若比较
<?php
$a=1;
$b='1';
var_dump($a==$b);
?>
结果为:
bool(true)
这里一个是字符串一个是整数,比较结果为真,说明是弱比较,不比较类型
若比较会将另一个类型转换为相同的类型,比较
var_dump((int)$b);//使用int转换来看一下,这个就是转换后的
结果为:
int(1) 若比较就是这么转换的
php的强比较:运算符===
===是强比较,值要想等,类型也要相等
<?php
$a=1;
$b='1';
$c=1;
var_dump($a===$b); //因为是强类型,所以返回为false。类型不等
echo '<br>';
var_dump($a=$c);//类型和值都相等,返回为true
?>
结果为:
bool(false)
int(1)
不相等运算符:!=
如果两两边的操作数的值不相等那么就是true,相等为false
<?php
$a=1;
$b='1';
$c=2;
var_dump($a!=$b);
echo '<br>';
var_dump($a!=$c);
?>
结果为:
bool(false)
bool(true)
也不比较类型
不等运算符:运算符<>
这个同上,一模一样
强比较不等于:!==
这个属于强类型比较不相等
<?php
$a=1;
$b='1';
$c=2;
var_dump($a!==$b); //强比较,类型不同, 返回为 true
echo '<br>';
var_dump($a!==$c);
?>
结果为
bool(true)
bool(true)
其他运算符:<、>、<=、>=
这些比较简单,不做演示了
逻辑运算符
逻辑运算符用于执行布尔逻辑操作,它们在编程和数学中被用来组合或修改条件表达式的真假值。逻辑运算符通常用于构建更复杂的条件语句,以控制程序的流程。以下是三种基本的逻辑运算符
php中有值的都是表达式,对表达式尽心逻辑运算,运算结果无非就是true,false
要求:
参与运算符的表达式的值必须是bool类型的值,如果不是bool类型的值,会被转换为ibool类的值
逻辑与:&&或and
<?php
$a=true;
$b=true;
var_dump($a and $b);
echo '<br>';
var_dump($a && $b);
$c=false;
echo '<br>';
var_dump($a and $c);
?>
结果为;
bool(true)
bool(true)
bool(false)
逻辑与需要左右两边的表达式的值都为true的时候,运算结果就是true,否则只要其中任意一个为false,运算的结果为:false
变量类型简介:
以下类型为false,其他的值都是被认为是true
1.布尔值false
2.0
3.浮点型0.0
4.空白字符串和字符串0
5.没有成员的数组
6.NULL
逻辑或:or或者||
左右两边表达式的值有一个值为true,结果就是true
<?php
$a=false;
$b=true;
var_dump($a || $b);
?>
结果为:
bool(true)
逻辑异或:xor
左右两边的表达式的值不一样的时候,结果就是true, 否则为false
<?php
$a=false;
$b=true;
var_dump($a xor $b);
?>
结果为:
bool(true)
<?php
$a='asdgasdfgasd'; //它的布尔类型为true
$b='tasdgasgar5213e'; //它的布尔类型为true
var_dump($a xor $b);
?>
结果为:
bool(false)
两个值得布尔类型都是true,所以结果为false
逻辑非:!
将原来表达式得值否定掉,原来是true,转换为false
原来表达式为false,转换为true
<?php
$a=null; //这个为false
$b=false; //这个也是false
var_dump(!$a); //转换为了true
echo '<br>';
var_dump(!$b); //转换为了true
?>
结果为;
bool(true)
bool(true)
其他运算符
.三元运算符:
格式:表达式1 ? 表达式2 : 表达式3;
<?php
$a=true ? 10:20; //表达式1得值是true,所以返回表达式2,返回10,
echo $a;
?>
结果为:
10
<?php
$a=false ? 10:20; //表达式1为false,所以表达式2的值为20
echo $a;
?>
结果为:
20
反引号:··
可以把系统的命令放在里面执行,
<?php
$a=`dir`; //执行了windows的命令,执行linux命令也可以
echo $a;
?>
结果如下:
������ D �еľ��� ������
��������� D8CC-AA56
D:\phpstudy_pro\WWW ��Ŀ¼
2024/12/31 20:23 <DIR> .
2024/11/04 16:40 <DIR> ..
2024/12/01 19:58 24,614 hacker1.png
2024/12/31 20:10 <DIR> heart-1
2024/12/31 20:11 <DIR> heart-2
2024/12/31 14:35 246 index.html
2025/01/02 14:57 38 index.php
2024/12/31 20:22 13,072 ruyi.html
2024/12/18 18:30 <DIR> upload
2024/12/31 19:40 <DIR> xy
4 ���ļ� 37,970 �ֽ�
6 ��Ŀ¼ 223,594,254,336 �����ֽ�
屏蔽错误符号:@
抑制错误信息提示
<?php
echo @$a;
?>
结果为:
空白
运算符的优先级:
概念:通过优先级来定义先算哪个运算
左代表从左往右算,右代表从右往左算
1.[无]递增递减
2.[右]逻辑非
3.[左]乘,除,取余
4.[左]加,减,字符串
5.[无]包含大于号小于号的运算符
6.[无]不包含大于号或小于号的
平方根和上下取整
<?php
$var=48;
echo sqrt($var); //求算数平方根
echo '<br>';
$var1=floor(6.52); //向下取整
$var2=ceil(6.52); //向上取整
echo $var1;
echo '<br>';
echo $var2;
?>
结果为:
6.9282032302755
6
7
数字格式化:
函数number_format()
number_format(number,decimals,'decimalsep','thousandsep')
函数名 格式化数 小数位数 小数分隔符 千分位分隔符
<?php
$var=52012.5555;
$num=number_format($var,4,'*','#');
echo $num;
?>
结果为:
52#012*5555
字符串操作:
对字符串进行反转
<?php
$var=123456;
echo strrev($var);
?>
结果为:
654321
字符串大小写:
<?php
$a='windsor';
$b='duck of cambridge';
$c='prince';
$d='WWWWLSADFSDF';
echo ucfirst($a),' ',ucwords($b),' ',strtoupper($c),' ',strtolower($d);
//首字母大写 每个单词首字母大写 全部大写 全部小写
?>
ucrfirst() //首字母大写
ucwords() //每个单词首字母大写
strtoupper() //全部大写
strtolower() //全部小写
结果如下:
Windsor Duck Of Cambridge PRINCE wwwwlsadfsdf
字符串截取:
<?php
$var='hello, welcome to the world of php!';
echo substr($var,0,5),' ',substr($var,22,5),substr($var,-1);
//截取索引0-5,然后空格22往后推迟5,然后拼接-1,-1就是最后一个索引
?>
结果为:
hello world!
文本格式化:
文本格式化函数之printf()
使用printf进行格式化操作
<?php
$nboys=3;
$ngirls=5;
printf("%s boys and %s girls",$nboys,$ngirls);
//占位符占$nboys和$ngirls
?>
结果为:
3 boys and 5 girls
使用echo进行调用变量操作;
<?php
$nboys=3;
$ngirls=5;
printf("%s boys and %s girls",$nboys,$ngirls);
//占位符占$nboys和$ngirls
echo '<br>',"$nboys boys and $ngirls girls"; //这里要用双引号,否则php不解析
?>
结果为:
3 boys and 5 girls
文本格式化之sprintf():
sprintf('format',$firstvar,$secondvar,$lastvar)
函数名 格式 替换变量 替换变量2 替换变量n
用于把格式化字符写入到一个变量中
示例:
<?php
$a='字符串';
$b=5;
$c=sprintf("%s boys and %u girls",$a,$b); //这里是把变量a和b替换占位然后赋值到变量c
//占位符占$nboys和$ngirls
echo $c;
?>
结果为:
字符串 boys and 5 girls
抱团效应-数组:
数字索引数组
数值数组:
<?php
$user[1]='jim Green';
$user[2]='18';
$user[3]='male';
echo "<pre>";var_dump($user);echo '</pre>'; //pre标签定义被格式化的文本
?>
结果为:
array(3) {
[1]=>
string(9) "jim Green"
[2]=>
string(2) "18"
[3]=>
string(4) "male"
}
普通数组
<?php
$user=array("Volvo",'bwm','toyota');
echo $user[0]; //输出$user的索引0的值
?>
结果为:
Volvo
字符索引数组:
<?php
$name['name']='zhangsan';
$name['age']='18';
$name['zhushi']='注释';
echo '<pre>';var_dump($name);echo "</pre>";
?>
结果为:
array(3) {
["name"]=>
string(8) "zhangsan"
["age"]=>
string(2) "18"
["zhushi"]=>
string(6) "注释"
}
只提取name的索引值
<?php
$name['name']='zhangsan';
$name['age']='18';
$name['zhushi']='注释';
echo '<pre>';var_dump($name['name']);echo "</pre>";
?>
结果为:
string(8) "zhangsan"
使用数组直接赋值,字符串索引:
<?php
$name=array('suoyin'=>'suoyinzhi',
'age'=>'18',
'name'=>'mingzi'
);
echo '<pre>';var_dump($name);echo '</pre>';
?>
结果为:
array(3) {
["suoyin"]=>
string(9) "suoyinzhi"
["age"]=>
string(2) "18"
["name"]=>
string(6) "mingzi"
}
连续元素数组:
<?php
$range=range(2001,2012);
echo '<pre>';var_dump($range);echo '</pre>';
?>
定义起始值和结束值得所有索引
例如2001-2012生成了12个元素
结果为:
array(12) {
[0]=>
int(2001)
[1]=>
int(2002)
[2]=>
int(2003)
[3]=>
int(2004)
[4]=>
int(2005)
[5]=>
int(2006)
[6]=>
int(2007)
[7]=>
int(2008)
[8]=>
int(2009)
[9]=>
int(2010)
[10]=>
int(2011)
[11]=>
int(2012)
}
从a-z得所有数组
<?php
$range=range('a','z');
echo '<pre>';var_dump($range);echo '</pre>';
?>
结果为:
array(26) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
[7]=>
string(1) "h"
[8]=>
string(1) "i"
[9]=>
string(1) "j"
[10]=>
string(1) "k"
[11]=>
string(1) "l"
[12]=>
string(1) "m"
[13]=>
string(1) "n"
[14]=>
string(1) "o"
[15]=>
string(1) "p"
[16]=>
string(1) "q"
[17]=>
string(1) "r"
[18]=>
string(1) "s"
[19]=>
string(1) "t"
[20]=>
string(1) "u"
[21]=>
string(1) "v"
[22]=>
string(1) "w"
[23]=>
string(1) "x"
[24]=>
string(1) "y"
[25]=>
string(1) "z"
}
删除和修改数组的元素:
示例代码如下:
<?php
$userinfo['name']='Jim Green';
$userinfo['age']=18;
$userinfo['Gender']='Male';
echo '<pre>';var_dump($userinfo);echo '</pre>';
$userinfo['name']='xin yuansu'; //这里修改了元素的值
echo '<pre>';var_dump($userinfo);echo '</pre>';
unset($userinfo['name']); //这里销毁了索引name和它的值
echo '<pre>';var_dump($userinfo);echo '</pre>';
unset($userinfo); //这里销毁了变量userinfo
echo '<pre>';var_dump($userinfo); //编辑器里这里已经发红了
?>
结果为:
array(3) {
["name"]=>
string(9) "Jim Green"
["age"]=>
int(18)
["Gender"]=>
string(4) "Male"
}
array(3) {
["name"]=>
string(10) "xin yuansu"
["age"]=>
int(18)
["Gender"]=>
string(4) "Male"
}
array(2) {
["age"]=>
int(18)
["Gender"]=>
string(4) "Male"
}
NULL
条件与循环:
常用的判断函数:
isset() //判断指定对象是否已定义,若含有多个对象,则其中一个对象未定义,系统也会返回false,也就是判断对象是否存在并且非null
is_int() //判断指定对象是否为整形变量
is_array() //判断指定对象是否为数组
is_float() //判断指定对象是否为浮点型变量
is_string() //判断指定对象是否为字符串型变量
is_numeric() //判断指定对象是否为数字或数字型字符串
is_numm() //判断对象的值是否为0
正则表达式基础:
特殊字符 含义 例子 匹配字符 不匹配字符
^ 以....开始 ^e eing asdfasdg
$ 以....结束 m$ asdfm llen
. 任意字符 . up.great A.1
? 前一位字符可选 ger?m germ/gem gm
() 必含字符 g(er)m germ/ger gem/gel
[^] 不可选字符 g[^er]m fym/gum geam/rml
[] 可选字符|只选一 g[er]m gem/grm germ/gel
- 前后所有字符 ^[A-F]123 A123/C123 H123/I123
+ 前置项目多选 Shop[1-3]+ Shop1/Shop123/Shop321 Shop456
* 前置项目可重复 ge*m gm/geeem germ
{n} 前置项目必重复次数 ge{3}a geeea gea/geea
{n1,n2} 前置项目重复次数范围 ge{2,3}a geea/geeea gea
\ 后置项目不含特殊含义(转义) g\* g*m ggm,gem
(|) 可选字符 nishi(nan|nv) nishi(nan) nishi1234
nishi(nv)
简单条件句if...else...
<?php
$a='asdf';
$value1=1;
$value2='asdf';
switch($a){ //判断$a=value1还是value2,等于value1则返回(你好),等于value2返回(第二个)
case $value1:
echo "你好";
break;
case $value2:
printf('第二个');
default:
printf('都不满足');
}
?>
结果为:
第二个
判断时间:
<?php
$hour=date('H'); //date是获取时间,H是小时,我现在是16点,所以H是16,$hour=16
if ($hour>12){
echo "12点已经过去了,现在是$hour";
}else{
echo "现在还不到12点呢";
}
?>
结果为:
12点已经过去了,现在是17
检查是否为整形和是否为数字字符型:
数字型
<?php
$var=10;
if(is_int($var)){
echo '是一个整数';
}else{
echo '不是一个整数';
}
?>
结果为:
是一个整数
判断数字字符型
<?php
$var='10';
if(is_numeric($var)){
echo '是一个整数';
}else{
echo '不是一个整数';
}
?>
结果为:
是一个整数
条件判断和正则表达;
<?php
$reg="^e";
$str='ehello';
if(preg_match($reg,$str)){
echo '匹配到了';
}else{
echo '没有匹配到';
}
?>
结果为:
Warning: preg_match(): No ending delimiter '^' found in D:\phpstudy_pro\WWW\index.php on line 4
没有匹配到
这里第4行语法错误,改为如下使用//来表示匹配的开始和结束
<?php
$reg="/^e/";
$str='ehello';
if(preg_match($reg,$str)){
echo '匹配到了';
}else{
echo '没有匹配到';
}
?>
结果为:
匹配到了
另一个
<?php
$reg="/m$/";
$str='ehelm'; //如果这里不是m结尾是ehelmh就不会执行if语句了
if(preg_match($reg,$str)){
echo '以m结尾了,';
}else{
echo '没有匹配到';
}
?>
结果为:
以m结尾了,
总结:
<?php
$name='shanghai';
switch($name){
case 'beijing';
echo '北京';
break;
case 'tianjing':
echo '天津';
break;
case 'shanghai':
echo '上海';
break;
case 'chongqing':
echo '重庆';
break;
default:
echo '错误不存在';
break;
}
?>
结果为:
上海
自定义函数:
文字加粗函数:
<?php
function bold($string){
echo '<b>',$string,'</b>'; //函数中<b>作用就是加粗
}
bold('hello word');
?>
结果为:
hello word //这里复制过来看不出来了,实际是加粗了的
函数与返回值:
<?php
function bold($a,$b){
return $a/$b;
}
$c=bold(6,2);
var_dump($c);
?>
结果为:
int(3)
静态变量:
<?php
function x(){
static $a=5; //第一次调用返回15,第二次返回45,因为第一次调用后$a的值就是15了
$a=$a*3;
return $a;
}
$result1=x();
$result2=x();
var_dump($result1);
var_dump($result2);
?>
结果为:
int(15) int(45)
函数中引用全局变量:
<?php
function double($var){
$var=$var*2;
return $var;
}
var_dump(double(6));
?>
结果为:
int(12)
<?php
function double(&$var){ //&的作用是声明为全局变量,不再是局部变量了
$var=$var*4;
}
$var=10; //函数中的参数是全局变量了,这里给他值为10
double($var); //调用函数,使得$var*4
var_dump($var) //查看调用函数后$var的值
?>
结果为:
int(40)
php的web编程基础:
cookies技术:用于在用户浏览网页的时候,把用户需要的某些信息缓存到用户的浏览器上,提高用户的体验,
session技术:使用php编写网站的时候,可以通过session来将相关会话信息存放在服务器上
GET方法:在URL中以明文的形式呈现,是不加密的
POST方法:在URL中以密文的形式,是加密的
form提交表单交互:
#####################index.html#################
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>from表单提交数据
</title>
</head>
<body>
<!-- action=index.php是表单内容提交到index.php处理 -->
<form action="index.php" method="get" name="search-from">
<div class="ui action input">
<!-- 定义一个input输入框,里面有一个值为查询 -->
<input type="text" name="keyword">
<input type="submit" name="提交">
</div>
</form>
</body>
</html>
############################index.php#####################
<?php
$keyword=$_GET['keyword'];
if(preg_match('/^[a-e]/',$keyword)){
echo '你好呀';
}else{
echo '错误输入,请重试';
}
?>
验证结果:
提交后:
输入ming提交后
使用cookie缓存数据:
cookie数据不可靠,容易被用户删除
定义cookie的源码,然后超链接到cookie.php,cookie.php是存储cookie数据的
<?php
setcookie('name','cookie_value');
echo '<a href="./cookie.php">点击查看cookie</a>';
?> //这个文件是index.php
定义cookie来接收index.php的数据,然后存放在cookie.php中,访问cookie.php后会输出接收到的数据
<?php
echo $_COOKIE['name'];
?> //这个文件是cookie.php文件
**注销本地用户cookie文件:**在显示cookie的php文件中重定义一个setcookie就可以清cookie了
index.php
<?php
setcookie('name','cookieshiwo');
echo '<a href="./cookie.php">请点击</a>'
?>
结果为:
请点击
cookie.php
<?php
echo $_COOKIE['name'];
setcookie('name');
echo '<a href="./cookie2.php">请点击</a>'
?>
结果为:
点击后如下:
cookieshiwo请点击
出现了cookie,然后再次点击跳转到了cookie2.php,cookie被清空了
cookie2.php的源代码
<?php
echo $_COOKIE['name'];
?>
使用session保障数据安全:
index.php如下
<?php
session_start(); //只有在使用了session_start才可以只用$_SESSION变量
$_SESSION['Name']='john';
echo "<a href='session.php'>submit</a>"
?>
结果为:
submit
点击后如下
john
sessioin.php的源码如下:
<?php
session_start();
echo $_SESSION['Name'];
?>
销毁session:
index.php
<?php
session_start(); //只有在使用了session_start才可以只用$_SESSION变量
$_SESSION['Name']='john';
echo "<a href='session.php'>submit</a>"
?>
结果为:
submit
session.php
<?php
session_start();
echo $_SESSION['Name'];
session_destroy(); //销毁session链接
echo '<br><a href="./session2.php">点击</a>';
?>
结果为:
john
点击
session2.php
<?php
session_start();
echo $_SESSION['Name'];
?>
结果为:
空啥也没有
获取会话的ID:
数据安全性是通过sessionid来保护的,上面的代码 插入session_id来测试
使用表单上传文件:
index.html的 前端代码如下:
index.html的前端页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>php的文件上传</title>
</head>
<body>
<!-- enctype是用来定义内容如何编码的,这个属性也只可以用在post方法中 -->
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="uploaded_file">
<!-- buuton是定义可点击按钮,里面可以放置标签,是input做不到的 -->
<button type="submit">上传</button>
</form>
</body>
</html>
运行后如下:
创建一个index.php来处理index.html提交过来的请求数据
以下代码是获取一些信息,当提交上传的内容,会指定index.php的代码,获取文件的基本信息和保存的路径
<?php
echo "File name:",$_FILES['uploaded_file']['name']; //获取文件名字
echo "File size:",$_FILES['uploaded_file']['size']; //获取文件大小
echo "File type:",$_FILES['uploaded_file']['type']; //获取文件类型
echo "File tmp_name:",$_FILES['uploaded_file']['tmp_name']; //获取缓存路径
?>
结果为:
File name:HTML.png
File size:27634
File type:image/png
File tmp_name:C:\Windows\phpD40D.tmp
27634是字节大小
判断类型,存储到指定文件夹
我们通过$FILE['uploaded_file']['type']看到了图片的文件类型,是image,那么我们可以使用if语句来判断上传的是否是图片
代码如下:
<?php
echo "File name:",$_FILES['uploaded_file']['name'],'<br>'; //获取文件名字
echo "File size:",$_FILES['uploaded_file']['size'],'<br>'; //获取文件大小
echo "File type:",$_FILES['uploaded_file']['type'],'<br>'; //获取文件类型
echo "File tmp_name:",$_FILES['uploaded_file']['tmp_name'],'<br>'; //获取缓存路径
if(preg_match('/image/',$_FILES['uploaded_file']['type'])){
echo '这是一个图片';
}else{
echo '这不是一个图片';
}
?>
结果如下:
File name:hacker2.png
File size:108699
File type:image/png
File tmp_name:C:\Windows\php6C7C.tmp
这是一个图片
如果不是图片结果如下:
File name:2.py
File size:0
File type:text/plain
File tmp_name:C:\Windows\php20BA.tmp
这不是一个图片
临时文件移动:
index.html和上一个一样,php文件为:
<?php
echo "File name:",$_FILES['uploaded_file']['name'],'<br>'; //获取文件名字
echo "File size:",$_FILES['uploaded_file']['size'],'<br>'; //获取文件大小
echo "File type:",$_FILES['uploaded_file']['type'],'<br>'; //获取文件类型
echo "File tmp_name:",$_FILES['uploaded_file']['tmp_name'],'<br>'; //获取缓存路径
$destination=dirname(__FILE__).'\upload\\'.$_FILES['uploaded_file']['name']; //定义要保存的路径,$_FILES...是文件名字
if(preg_match('/image/',$_FILES['uploaded_file']['type'])){
echo '这是一个图片';
move_uploaded_file($_FILES['uploaded_file']['tmp_name'],$destination); //移动上传到缓存目录下的文件到指定目录下
}else{
echo '这不是一个图片';
}
echo $destination;
?>
第七行用了两个反斜杠,因为用一个反斜杠是转义的意思,所以要用两个
这来报错了,是因为忘记创建upload文件夹了,需要在同index.php文件下,创建一个upload文件夹
正常回显为:
upload目录下为:
数据的存取:
使用文本文件存取数据
fopen()函数支持的文本文件打开方式:
模式 打开方式 说明
r 只读 如果指定的文件不存在, 系统会返回一条错误提示
r+ 读写 如果指定文件不存在,系统会返回一条错误提示
w 只写 如果指定文件不存在,系统会尝试创建该文件,
如果文件存在,系统会尝试覆盖该文件
w+ 读写 如果指定的文件不存在,系统会尝试创建该文件
如果文件存在,系统会尝试覆盖该文件
a 追加 如果指定的文件不存在,系统会尝试创建该文件
如果指定的文件存在,系统会尝试在此文件末尾追加数据
a+ 读并追加 如果指定的文件不存在,系统会尝试创建该文件
如果指定的文件存在,系统会尝试再次文件末尾追加数据
例如使用w来写入内容,创建文件
<?php
$fh=fopen('file.php','w'); //创建文件
?>
查看目录是否创建成功
条件判断编辑文件-判断文件是否存在:
file_exists()函数用来检查文件或目录是否存在,确保在尝试读取写入或处理文件之前,该文件确实存在于服务器上
<?php
// $fh=fopen('file.php','w'); //创建文件
if(file_exists('file.php')){
fopen('file.php','r');
echo '文件存在!';
}else{
echo '文件不存在';
}
?>
结果:
文件存在!
判断目录是否存在:
<?php
if(is_dir('wenjianjia')){ //判断'wenjianjia'这个文件是否存在,存在返回false,否则true
echo '文件夹目录存在于当前目录';
}else{
echo '文件夹不存在当前目录';
}
?>
结果为:
文件夹不存在当前目录
写入文件内容:
<?php
$fwjj='upload';
$fwj='file.txt';
$path=$fwjj.'/'.$fwj;
$append='我是新写入的内容';
if(is_dir($fwjj)){ //判断文件夹是否存在
if(file_exists($path)){ //判断文件是否存在
$a=fopen($path,'a');
fwrite($a,$append); //写入数据
fclose($a);
}else{
echo '文件不存在';
}
}else{
echo '文件夹不存在';
}
?>
浏览器不会输出内容,但是会执行操作,写入内容到file.txt中
结果如下:
文件的读取:
<?php
$fwjj='upload';
$fwj='file.txt';
$path=$fwjj.'/'.$fwj;
$append='我是新写入的内容';
if(is_dir($fwjj)){
if(file_exists($path)){
$a=fopen($path,'r');
while (!feof($a)){ //!feof()检查文件指针是否到达文件末尾,文件没有到达末尾则返回true,因为有一个!字符
echo fgets($a),'<br>'; //fget()函数用于从文件指针中读取数据
}
}else{
echo '文件不存在';
}
}else{
echo '文件夹不存在';
}
?>
结果如下:
读取CSV文件:
<?php
$i=0;
if(file_exists('upload/text.csv')){
$fh=fopen('upload/text.csv','r');
while(!feof($fh)){ //文件指针指到不到末尾就继续循环读取
//返回是一个数组,所以要用索引来分离出来
$rline=fgetcsv($fh,1000,'\t'); //\t是分隔符
$fluser=$rline[0];
$fldata=$rline[1];
$flpinglun=$rline[2];
$i++; //判断有多少记录,有多少行
}
}
?>
array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\\" ]]]] )
$handle:必需。这是由 fopen() 打开的文件指针资源。
$length:可选。指定最长的行长度。如果省略,则默认没有限制。
$delimiter:可选。设置字段之间的分隔符,默认是逗号 ,。
$enclosure:可选。设置字段的包裹字符,默认是双引号 "。
$escape:可选。设置转义字符,默认是反斜杠 \。
php与操作系统
管理文件:
使用文件夹来管理文件是一件很有逻辑的事情
常见的文件管理函数:
ls_file('stuff.txt'):判断指定的对象是否为一个文件,而不是文件夹或其它特殊格式的文件 true|false
ls_dir('stuff.txt'):判断指定对象是否为一个文件夹,true|false
ls_executable('stuff.txt'):判断指定对象是否为一个可执行文件 true|false
ls_writable('stuff.txt'):判断指定对象是否可写,true|false
ls_readable('stuff.txt'):判断指定对象是否可读,true|false
fileatime('stuff.txt'):返回最近一次访问指定文件的时间,UNIX时间戳|false
filectime('stuff.txt'):返回创建该文件的时间, UNIX时间戳|false
filemtime('stuff.txt'):返回最近一次修改文件的时间,UNIX时间戳|false
filegroup('stuff.txt'):返回指定文件所属组的ID,代表文件组ID的整数|false
fileowner('stuff.txt'):返回指定文件的所有者ID 代表文件所有者ID的整数|false
filesize('stuff.txt'):返回指定文件的大小,单位为字节 代表文件大小的整数|false
filetype('stuff.txt'):返回指定文件的类型,代表文件类型的字符串|false
basename('/dir/stuff.txt'):返回指定路径中的文件名 输出:stuff.txt
dirname('/dir/stuff.txt'):返回指定路径中的路径,输出:/dir
基于对象的编程:
对象是基于一个类的实例化,基于对象和基于过程的编程例子如下
基于过程的编程例子;
<?php
$a=4;
$b=5;
echo "a+b=",$a+$b,'<br>';
echo "a-b=",$a-$b,'<br>';
echo "a*b=",$a*$b,'<br>';
echo "a/b=",$a/$b,'<br>';
?>
结果为:
a+b=9
a-b=-1
a*b=20
a/b=0.8
基于对象的编程
其实就是用类和方法来做的
index.php代码如下
<?php
class calc{
private $a;
private $b;
function init($a,$b){
$this->a=$a; //this->a中的a是类中的私有属性a
$this->b=$b;
}
function arr(){
return array($this->a,$this->b);
}
function jia(){
return $this->a+$this->b;
}
function jian(){
return $this->a-$this->b;
}
function cheng(){
return $this->a*$this->b;
}
function chu(){
return $this->a/$this->b;
}
}
?>
调用函数代码xxx.php如下:
<?php
require_once('index.php'); //包含index.php文件,只包含一次
$a=new calc();
// echo $a->jia(4,5); //错误示例,jia这个函数方法没有定义接收参数,我们要从入口init来传参,然后调用要用的函数
//入口函数init中的this->是接收a和b放入到init的参数中
$a->init(4,5);
echo "a+b=",$a->jia(),'<br>';
echo "a-b=",$a->jian(),'<br>';
echo "a*b=",$a->cheng(),'<br>';
echo "a/b=",$a->chu(),'<br>';
?>
结果为:
a+b=9
a-b=-1
a*b=20
a/b=0.8
关于面向对象的编程,会涉及到一些术语:
如下也是概念
属性:在类中定义的,是用来存放一些信息的变量。
方法:在类中定义的,用来执行某些操作的函数。
封装:将某脚本方法或使用该脚本的方法操纵的数据绑定在一起,相当于属性和方法封装成一个类
多态:对象的状态十多变的,一个对象相对于基于同一类的另一个对象来说,方法是相同的,但是状态时不同的
子类:子类可以有用父类的所有方法,同时也可以用于不同于父类的方法
继承:子类继承父类
实例:就是一个类的实例化
对象编程的例子:
<?php
class lei{
private $a=array();
function __get($b){
return $this->a[$b]; //可以看出是通过传入的$b的值来找数组中索引的值
}
function __set($b,$value){
$this->a[$b]=$value; //传入函数的参数存在于数组a,就给重新赋值,赋值为传入函数的第2个参数
}
function __isset($b){
return isset($this->a[$b]); //通过isset函数来检查是否存在并且非null
}
}
$instance=new lei();
//下两行代码触发了set方法,对数组进行了赋值操作
$instance->firstname='john'; //给私有属性的数组a放入key和value,key为firstname,value为john
$instance->lastname='tom'; // 调用 __set('firstname', 'John')
//这个echo语句中的?和:是三元运算符,如果22行返回true,运行23行的表达式返回值,如果22行为false,运行24行的表达式,返回值
echo $instance->__isset('lastname') ? //判断firstname这个key是否存在于类中的a数组中,存在执行23行的表达式,返回值
$instance->__get('lastname') //这个函数是获取firstname的值
:'找不到这个数组key';
?>
__get:在访问不存在或不可访问的属性时自动调用
__set:设置属性值时,自动调用,写入一个未定义或不可以访问的属性,自动调用
__isset:对未定义或不可以访问的属性使用isset或empty时调用
结果为:
john
判断是否是基于某个类和类是否存在实例,结合上一个实例使用看效果
if(class_exists('lei')){ //判断是否是一个类
echo is_a($instance,'lei')? //三元运算,判断对象是不是基于lei这个类的
'是基于这个类的' //这个相当于if
:'不是基于这个类的'; //这个相当于else
}
结果为:
tom是基于这个类的
常见开源php应用程序
wordpress是当今最受欢迎的基于php的博客系统,也是一种内容管理系统,用于组织促进共同内容创造的系统
Drupal是php语言编写的开源内容管理框架,全球最强大的CMS系统,开源系统,安全性搞