PHP零基础入门笔记

表达式:任何有值的东西就是表达式

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系统,开源系统,安全性搞

相关推荐
JaguarJack5 小时前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo5 小时前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack1 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo1 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack2 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay3 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954483 天前
CTF 伪协议
php
BingoGo5 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack5 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo6 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php