首页
留言
友情链接
标签页
Search
1
如何使用JavaScript获取和设置CSS root变量值
1,070 阅读
2
中国历史朝代顺序图
675 阅读
3
那些顶级不落俗套的“美好祝福”
545 阅读
4
春和 《江海共余生》
525 阅读
5
hyperf常用命令
410 阅读
分享
Web前端
html&css
javascript
Vue
shopify
shoplazza
后端
ThinkPHP
YII2
服务器端
软件安装
问题合集
故事
诗词
生活
学习
学科
语文
数学
英语
物理
化学
生物
政治
历史
地理
自然
其他
抖音
快手
小视频
随笔
易经
书摘
登录
/
注册
Search
标签搜索
一年级语文
sunshine
累计撰写
161
篇文章
累计收到
15
条评论
首页
栏目
分享
Web前端
html&css
javascript
Vue
shopify
shoplazza
后端
ThinkPHP
YII2
服务器端
软件安装
问题合集
故事
诗词
生活
学习
学科
语文
数学
英语
物理
化学
生物
政治
历史
地理
自然
其他
抖音
快手
小视频
随笔
易经
书摘
页面
留言
友情链接
标签页
搜索到
160
篇与
的结果
2022-10-11
PHP面向对象(1)
1.1 目标了解面向对象的基本概念;了解面向对象和面向过程的区别;掌握面向对象的基本语法:封装类;掌握类成员的基本使用:定义和访问;掌握访问修饰限定符的作用和实际运用;掌握$this的概念和使用;掌握构造方法的和析构方法的目的和触发时间;了解对象存储和访问的内存原理;了解对象比较的方式;掌握对象与类在内存在依赖关系;1.2 面向对象介绍1.2.1 介绍面向对象是一个编程思想。编程思想有面向过程和面向对象面向过程:编程思路集中的是过程上面向对象:编程思路集中在参与的对象以去饭馆吃饭为例: 面向过程:点菜——做菜——上菜——吃饭——结账——收拾 面向对象:服务员,厨师,客人1.2.2 面向对象的好处多人合作方便减少代码冗余,灵活性高代码的可重用性发挥到极致可扩展性强多学一招: OOP:面向对象编程(Object Oriented Programming,面向对象编程) OOA: 面向对象分析(Object-Oriented Analysis,OOA) OOD: 面向对象设计(Object-Oriented Design,OOD)1.3 类和对象1、对象是具体存在的事物,对象是由属性(变量)和方法(函数)组成的 2、类是具有相同属性和行为的一组对象的集合分析:做菜动作——厨师对象——厨师类结论:我们在开发的时候,先写类,通过类创建对象,然后调用对象的属性和方法实现功能。 类——对象——调用成员注意:一个类可以创建多个对象小结:1、对象是由属性和方法组成的2、类是所有对象的相同属性和方法的集合3、在开发的时候先写类,通过类创建对象,通过对象调用方法和属性4、一个类可以创建多个对象1.4 在PHP中实现类和对象1.4.1 创建类语法:class 类名{ //属性 //方法 //常量 } 类是由属性、方法、常量组成的,也可以说 类成员有:属性、方法、常量 类名的命名规则:以字母、下划线开头,后面跟的是字母、数字、下划线不能用PHP关键字做类名类名不区分大小写(变量名区分,关键字、类名不区分大小写)类名用帕斯卡命名法(大驼峰 单词的首字母大写)<?php class Student { }1.4.2 对象实例化通过new关键字来实例化对象。<?php //定义类 class Student { } //实例化对象 $stu1=new Student(); $stu2=new Student; //小括号可以省略 var_dump($stu1,$stu2); //object(Student)#1 (0) { } object(Student)#2 (0) { } 1.4.3 对象的比较注意:对象的传递是地址传递相等:结构和保存的值一样就相等全等:指向同一个对象才是全等。<?php //定义类 class Student { } //实例化对象 $stu1=new Student(); $stu2=new Student; $stu3=$stu2; //对象传递的是地址 //var_dump($stu1,$stu2,$stu3); //object(Student)#1 (0) { } object(Student)#2 (0) { } object(Student)#2 (0) { } //对象比较 var_dump($stu1==$stu2); //bool(true) ,比较对象的结构 echo '<br>'; var_dump($stu1===$stu2); //bool(false) $stu1和$stu2是否是同一个对象 echo '<br>'; var_dump($stu2===$stu3); //bool(true) $stu2和$stu3是同一个对象1.5 属性属性本质就是变量通过->调用对象的成员 对象名->属性名 对象名->方法名()<?php //定义类 class Student { public $name; //属性 public $add='地址不详'; //属性 } //实例化对象 $stu=new Student(); //print_r($stu); //Student Object ( [name] => [add] => 地址不详 ) //操作属性 //1、给属性赋值 $stu->name='tom'; $stu->add='北京'; //2、获取属性的值 echo '姓名:'.$stu->name,'<br>'; //姓名:tom echo '地址:'.$stu->add,'<br>'; //地址:北京 //3、添加属性 $stu->age=20; print_r($stu); //Student Object ( [name] => tom [add] => 北京 [age] => 20 ) echo '<br>'; //4、删除属性 unset($stu->add); print_r($stu); //Student Object ( [name] => tom [age] => 20 ) 1.6 方法方法的本质就是函数<?php class Student { //定义方法 public function show() { echo '这是show方法<br>'; } //public可以省略,如果省略,默认就是public function test() { echo '这是test方法<br>'; } } $stu=new Student; $stu->show(); //调用方法 $stu->test();多学一招:1、方法前面public是可以省略的,如果省略,默认就是public的。2、属性前面的public不能省略1.7 访问修饰符用来控制成员的访问权限修饰符描述public(公有的)在类的内部和外部都能访问private(私有的)只能在类的内部访问protected(受保护的)在整个继承链上访问多学一招:一般来说,属性都用私有的,通过公有的方法对私有的属性进行赋值和取值。作用:保证数据的合法性<?php //访问修饰符 class Student { private $name; //私有属性 private $sex; //私有属性 //通过公有的方法对私有的属性进行赋值 public function setInfo($name,$sex) { if($sex!='男' && $sex!='女'){ echo '性别必须是男或女'; exit; } $this->name=$name; //$this表示当前对象 $this->sex=$sex; } //显示信息 public function getInfo() { echo '姓名:'.$this->name,'<br>'; echo '性别:'.$this->sex,'<br>'; } } //实例化 $stu=new Student; $stu->setInfo('tom','男'); $stu->getInfo(); echo '<hr>'; $stu2=new Student; $stu2->setInfo('berry','女'); $stu2->getInfo();提示:$this表示调用当前方法的对象运行结果1.8 类和对象在内存中的分布对象的本质是一个复杂的变量类的本质是一个自定义的复杂数据类型栈区:运行速度快,体积小,保存基本类型堆区:运行速度稍慢,体积大,保存复杂类型实例化的过程就是分配内存空间的过程对象保存在堆区,将堆区的地址保存到栈区。分析如下代码的结构<?php class Student { public $name; public $sex; public function show() { } } $stu1=new Student; $stu2=new Student; $stu1->show();示意图1.9 封装封装就是有选择性的提供数据通过访问修饰符来实现封装1.10 构造方法1.10.1 介绍构造方法也叫构造函数,当实例化对象的时候自动执行。语法:function __construct(){ } 注意:前面是两个下划线例题<?php class Student { public function __construct() { echo '这是构造方法<br>'; } } new Student(); //这是构造方法 new Student(); //这是构造方法注意:在其他语言里,与类名同名的函数是构造函数,在PHP中不允许这种写法。class Student { //和类名同名的方法是构造方法,PHP中不建议使用 public function Student() { echo '这是构造方法<br>'; } } /* Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Student has a deprecated constructor in F:\wamp\www\6-demo.php on line 2 这是构造方法 */1.10.2 构造函数作用:初始化成员变量<?php class Student { private $name; private $sex; //构造函数初始化成员变量 public function __construct($name,$sex) { $this->name=$name; $this->sex=$sex; } //显示信息 public function show() { echo "姓名:{$this->name}<br>"; echo "性别:{$this->sex}<br>"; } } //实例化 $stu=new Student('tom','男'); $stu->show(); //运行结果 /* 姓名:tom 性别:男 */注意:构造函数可以带参数,但不能有return。1.11 析构方法1.11.1 介绍当对象销毁的时候自动调用语法function __destruct(){ }脚下留心:析构函数不可以带参数例题<?php class Student { private $name; //构造方法 public function __construct($name) { $this->name=$name; echo "{$name}出生了<br>"; } //析构方法 public function __destruct() { echo "{$this->name}销毁了<br>"; } } //测试 $stu1=new Student('tom'); $stu2=new Student('berry'); $stu3=new Student('ketty'); echo '<hr>';运行结果1.11.2 计算机的内存管理计算机内存管理方式:先进先出,先进后出先进先出的内存管理方式一般用在业务逻辑中,比如秒杀、购票等等先进后出是计算机的默认内存管理方式1.11.3 思考题思考题1<?php class Student { private $name; //构造方法 public function __construct($name) { $this->name=$name; echo "{$name}出生了<br>"; } //析构方法 public function __destruct() { echo "{$this->name}销毁了<br>"; } } //测试 $stu1=new Student('tom'); $stu2=new Student('berry'); $stu3=new Student('ketty'); unset($stu2); echo '<hr>'; /* tom出生了 berry出生了 ketty出生了 berry销毁了 ketty销毁了 tom销毁了 */思考题2<?php class Student { private $name; //构造方法 public function __construct($name) { $this->name=$name; echo "{$name}出生了<br>"; } //析构方法 public function __destruct() { echo "{$this->name}销毁了<br>"; } } //测试 new Student('tom'); new Student('berry'); new Student('ketty'); /* tom出生了 tom销毁了 berry出生了 berry销毁了 ketty出生了 ketty销毁了 */思考题3<?php class Student { private $name; //构造方法 public function __construct($name) { $this->name=$name; echo "{$name}出生了<br>"; } //析构方法 public function __destruct() { echo "{$this->name}销毁了<br>"; } } //测试 $stu=new Student('tom'); $stu=new Student('berry'); $stu=new Student('ketty'); /* tom出生了 berry出生了 tom销毁了 ketty出生了 berry销毁了 ketty销毁了 */1.12 继承1.12.1 继承介绍继承使得代码具有层次结构子类继承了父类的属性和方法,实现了代码的可重用性。使用extends关键字实现继承父类和子类是相对的语法class 子类 extends 父类{ }例题<?php //父类 class Person { public function show() { echo '这是人类<br>'; } } //子类继承父类 class Student extends Person { } //测试 $stu=new Student; $stu->show(); //这是人类执行过程:第一步:在Student类中查找show(),如果找到就调用,找不到就到父类中查找第二步:在Person类中查询show()1.12.2 子类中调用父类成员<?php //父类 class Person { public function show() { echo '这是人类<br>'; } } //子类 class Student extends Person { public function test() { //方法一; /* $person=new Person(); $person->show(); //这是人类 */ //方法二 $this->show(); //这是人类 } } //测试 $stu=new Student; $stu->test();小结:1、方法一:通过实例化父类调用父类的成员2、方法二:通过$this关键字调用父类的成员1.12.3 protectedprotected:受保护的,在整个继承链上使用例题://例题一: <?php class A { protected $num=10; //在整个继承链上访问 } class B extends A { public function getNum() { echo $this->num; } } //测试 $obj=new B(); //整个继承链上有A和B $obj->getNum(); //10 //例题二: <?php class A { public function getNum() { echo $this->num; } } class B extends A { protected $num=10; } //测试 $obj=new B(); //整个继承链上有A和B $obj->getNum(); //10 //例题三: <?php class A { public function getNum() { echo $this->num; } } class B extends A { protected $num=10; } //测试 $obj=new A(); //整个继承链上只有A $obj->getNum(); //Notice: Undefined property: A::$num 1.12.4 继承中的构造函数规则:1、如果子类有构造函数就调用子类的,如果子类没有就调用父类的构造函数。 2、子类的构造函数调用后,默认不再调用父类的构造函数通过类名调用父类的构造函数类名::__construct()例题<?php class Person { //父类的构造函数 public function __construct() { echo '这是父类<br>'; } } class Student extends Person { //子类的构造函数 public function __construct() { Person::__construct(); //通过父类的名字调用父类的构造函数 parent::__construct(); //parent表示父类的名字 echo '这是子类<br>'; } } //测试 new Student();注意:parent关键字表示父类的名字,可以降低程序的耦合性例题:给父类传递参数<?php class Person { protected $name; protected $sex; //父类的构造函数 public function __construct($name,$sex) { $this->name=$name; $this->sex=$sex; } } class Student extends Person { private $score; //子类的构造函数 public function __construct($name,$sex,$score) { parent::__construct($name,$sex); //调用父类构造函数并传递参数 $this->score=$score; } //显示信息 public function getInfo() { echo "姓名:{$this->name}<br>"; echo "性别:{$this->sex}<br>"; echo "成绩:{$this->score}"; } } //测试 $stu=new Student('tom','男',88); $stu->getInfo(); /* 姓名:tom 性别:男 成绩:88 */1.12.5 $this详解$this表示当前对象的引用,也就是是或$this保存的当前对象的地址<?php class A { public function __construct() { var_dump($this); } } class B extends A { } new A(); //object(A)#1 (0) { } echo '<br>'; new B(); //object(B)#1 (0) { } 1.12.6 多重继承PHP不允许多重继承,因为多重继承容易产生二义性如何实现C继承A和B,使用继承链
2022年10月11日
97 阅读
0 评论
1 点赞
2022-10-11
PHP基础(5)
1.1 目标了解文件编程的作用;掌握指定目录的文件遍历;掌握文件内容的读写操作;掌握表单传值方式GET和POST的区别;掌握PHP接收表单传递数据的方式;理解复选框表单的设计思路;掌握PHP实现文件上传的方案;掌握PHP单文件上传函数的封装;1.2 文件操作1、将字符串写入文件<?php $str="床前明月光,\r\n疑是地上霜。\r\n举头望明月,\r\n低头思故乡。"; file_put_contents('./test.txt',$str); //将字符串写到文本中小结:1、 所有的“写”操作都是清空重写2、在文本中换行是\r\n\r:回车 光标移动到当前行的最前面 \n:换行 将光标下移动一行 按键盘的回车键做了两步,第一步将光标移动到当前行的最前面,第二步下移一行。3、\r\n是特殊字符,必须放在双引号内2、将整个文件读入一个字符串//方法一: echo file_get_contents('./test.txt'); //将整个文件读入一个字符串 //方法二: readfile('./test.txt'); //读取输出文件内容 //注意:echo file_get_contents()==readfile()3、打开文件并操作fopen(地址,模式) 打开文件 模式: r:读 read w:写 write a:追加 append例题://3.1、打开文件写入 /* $fp=fopen('./test.txt','w'); //打开文件返回文件指针(文件地址) //var_dump($fp); //resource(3) of type (stream) for($i=1;$i<=10;$i++) fputs($fp,'关关雎鸠'."\r\n"); //写一行 fclose($fp); //关闭文件 */ //3.2 打开文件读取 /* $fp=fopen('./test.txt','r'); //打开文件读取 while($line=fgets($fp)){ echo $line,'<br>'; } */ //3.3 打开文件追加 $fp=fopen('./test.txt','a'); //打开文件追加 fputs($fp,'在河之洲'); //在文件末尾追加小结:1、打开文件,返回文件指针(文件指针就是文件地址),资源类型2、打开文件写、追加操作,如果文件不存在,就创建新的文件3、打开文件读操作,文件不存在就报错4、fputs()写一行,fgets()读一行,fclose()关闭文件5、追加是在文件的末尾追加4、是否是文件【is_file()】echo is_file('./test.txt')?'是文件':'不是文件';5、判断文件或文件夹是否存在【file_exists()】echo file_exists('./test.txt')?'文件存在':'文件不存在';6、删除文件【unlink】$path='./test.txt'; if(file_exists($path)){ //文件存在 if(is_dir($path)) //如果是文件夹用rmdir()删除 rmdir($path); elseif(is_file($Path)) //如果是文件用unlink()删除 unlink($path); }else{ echo '文件夹或文件不存在'; }7、二进制读取【fread(文件指针,文件大小)】文件的存储有两种:字符流和二进制流二进制流的读取按文件大小来读的。$path='./face.jpg'; $fp=fopen($path,'r'); header('content-type:image/jpeg'); //告知浏览器下面的代码通过jpg图片方式解析 echo fread($fp,filesize($path)); //二进制读取多学一招:file_get_contents()也可以进行二进制读取header('content-type:image/jpeg'); echo file_get_contents('./face.jpg');小结:1、文本流有明确的结束符,二进制流没有明确的结束符,通过文件大小判断文件是否读取完毕2、file_get_contents()既可以进行字符流读取,也可以进行二进制读取。1.3 表单提交数据的两种方式1.3.1 两种方式1、get2、post<form method="post" action=""></form> <form method="get" action=""></form>1.3.2 区别1、外观上看 get提交在地址上可以看到参数 post提交在地址栏上看不到参数2、安全性 get不安全 post安全3、提交原理 get提交是参数一个一个的提交 post提交是所有参数作为一个整体一起提交4、提交数据大小 get提交一般不超过255个字节 post提交的大小取决于服务器// 在php.ini中,可以配置post提交的大小 post_max_size = 8M5、灵活性 get很灵活,只要有页面的跳转就可以传递参数 post不灵活,post提交需要有表单的参与1、 html跳转 <a href="index.php?name=tom&age=20">跳转</a> 2、JS跳转 <script type="text/javascript"> location.href='index.php?name=tom&age=20'; location.assign('index.php?name=tom&age=20'); location.replace('index.php?name=tom&age=20'); </script> 3、PHP跳转 header('location:index.php?name=tom&age=22')小结: GETPOST外观上在地址上看到传递的参数和值地址栏上看不到数据提交数据大小提交少量数据,不同的浏览器最大值不一样,IE是255个字符提交大量数据,可以通过更改php.ini配置文件来设置post提交数据的最大值安全性低高提交原理提交的数据和数据之间在独立的将提交的数据变成XML格式提交灵活性很灵活,只要有页面的跳转就可以get传递数据不灵活1.4 服务器接受数据的三种方式通过名字获取名字对应的值$_POST:数组类型,保存的POST提交的值 $_GET:数组类型,保存的GET提交的值 $_REQUEST:数组类型,保存的GET和POST提交的值例题:HTML页面<body> <!--表单提交数据--> <form method="get" action="./2-demo2.php"> 语文: <input type="text" name="ch"> <br /> 数学: <input type="text" name="math"> <br /> <input type="submit" name="button" value="提交"> <br><br> </form> <!--超链接提交数据--> <a href="2-demo2.php?ch=77&math=88">跳转</a> <br><br> <!--js提交数据--> <input type="button" value="点击" onclick="location.href='2-demo2.php?ch=66&math=55'"> <br><br> <input type="button" value="点击" onclick="location.assign('2-demo2.php?ch=11&math=22')"> </body>PHP页面<?php //post数组中不为空 if(!empty($_POST)) { echo '这是post提交的数据<br>'; echo '语文:'.$_POST['ch'],'<br>'; echo '数学:'.$_POST['math'],'<br>'; } echo '<hr>'; //获取get提交的数据 if(!empty($_GET)){ echo '这是get提交的数据<br>'; echo '语文:'.$_GET['ch'],'<br>'; echo '数学:'.$_GET['math'],'<br>'; } echo '<hr>'; //既能获取get又能获取post提交的数据 echo $_REQUEST['ch'],'<br>'; echo $_REQUEST['math'];思考题在一个请求中,既有get又有post,get和post传递的名字是一样的,这时候通过$_REQUET获取的数据是什么?答:结果取决于配置文件request_order = "GP" # 先获取GET,在获取POST值例题<?php if(!empty($_POST)){ echo '姓名:'.$_REQUEST['username'],'<br>'; } ?> <form method="post" action="?username=berry"> 姓名: <input type="text" name="username"><br /> <input type="submit" name="button" value="提交"> </form> 分析:先获取GET的username,再获取post的username,后面的将前面的值覆盖小结:1、在开发的时候,如果明确是post提交就使用$_POST获取,如果明确get提交就用$_GET获取2、request获取效率低,尽可能不要使用,除非提交的类型不确定的情况下才使用。1.5 参数传递1.5.1 复选框值的传递复选框的命名要注意带'[]'。<body> <?php if(isset($_POST['button'])) { print_r($_POST['hobby']); } ?> <form method="post" action=""> 爱好: <input type="checkbox" name="hobby[]" value='爬山'>爬山 <input type="checkbox" name="hobby[]" value='抽烟'>抽烟 <input type="checkbox" name="hobby[]" value='喝酒'>喝酒 <input type="checkbox" name="hobby[]" value='烫头'>烫头 <input type="submit" name="button" value="提交"> </form> </body>小结:1、表单提交到本页面需要判断一下是否有post提交2、数组的提交表单元素的名字必须带有[]。1.5.2 例题<body> <?php if(isset($_POST['button'])) { echo '姓名:'.$_POST['username'].'<br>'; echo '密码:'.$_POST['pwd'].'<br>'; echo '性别:'.$_POST['sex'].'<br>'; echo '爱好:',isset($_POST['hobby'])?implode(',',$_POST['hobby']):'没有爱好','<br>'; echo '籍贯:'.$_POST['jiguan'],'<br>'; echo '留言:'.$_POST['words']; } ?> <form method="post" action=""> 姓名: <input type="text" name="username"> <br /> 密码: <input type="password" name="pwd"> <br /> 性别: <input type="radio" name="sex" value='1' checked>男 <input type="radio" name="sex" value='0'>女 <br /> 爱好: <input type="checkbox" name="hobby[]" value='爬山'>爬山 <input type="checkbox" name="hobby[]" value='抽烟'>抽烟 <input type="checkbox" name="hobby[]" value='喝酒'>喝酒 <input type="checkbox" name="hobby[]" value='烫头'>烫头 <br /> 籍贯: <select name="jiguan"> <option value="021">上海</option> <option value="010">北京</option> </select> <br> 留言: <textarea name="words" rows="5" cols="30"></textarea> <br /> <input type="submit" name="button" value="提交"> </form> </body>运行结果1.6 文件上传开发中需要上传图片、音乐、视频等等,这种上传传递是二进制数据。1.6.1 客户端上传文件文件域<input type="file" name="image">表单的enctype属性 默认情况下,表单传递是字符流,不能传递二进制流,通过设置表单的enctype属性传递复合数据。enctype属性的值有:application/x-www-form-urlencoded:【默认】,表示传递的是带格式的文本数据。multipart/form-data:复合的表单数据(字符串,文件),文件上传必须设置此值text/plain:用于向服务器传递无格式的文本数据,主要用户电子邮件单词multipart:复合 form-data:表单数组1.6.2 服务器接受文件超全局变量$_FILES是一个二维数组,用来保存客户端上传到服务器的文件信息。二维数组的行是文件域的名称,列有5个。1、$_FILES[][‘name’]:上传的文件名2、$_FILES[][‘type]:上传的类型,这个类型是MIME类型(image/jpeg、image/gif、image/png)3、$_FILES[][‘size’]:文件的大小,以字节为单位4、$_FILES[][‘tmp_name’]:文件上传时的临时文件5、$_FILES[][‘error’]:错误编码(值有0、1、2、3、4、6、7)0表示正确$_FILES[][‘error’]详解值错误描述0正确1文件大小超过了php.ini中允许的最大值 upload_max_filesize = 2M2文件大小超过了表单允许的最大值3只有部分文件上传4没有文件上传6找不到临时文件7文件写入失败注意:MAX_FILE_SIZE必须在文件域的上面。只要掌握的错误号:0和41.6.3 将上传文件移动到指定位置函数:move_uploaded_file(临时地址,目标地址)代码<body> <?php if(!empty($_POST)) { if($_FILES['face']['error']==0){ //上传正确 //文件上传 move_uploaded_file($_FILES['face']['tmp_name'],'./'.$_FILES['face']['name']); }else{ echo '上传有误'; echo '错误码:'.$_FILES['face']['error']; } } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>小结:上传的同名的文件要给覆盖1.6.4 与文件上传有关的配置post_max_size = 8M:表单允许的最大值upload_max_filesize = 2M:允许上传的文件大小upload_tmp_dir =F:\wamp\tmp:指定临时文件地址,如果不知道操作系统指定file_uploads = On:是否允许文件上传max_file_uploads = 20:允许同时上传20个文件1.7 优化文件上传1.7.1 更改文件名方法一:通过时间戳做文件名<?php $path='face.stu.jpg'; //echo strrchr($path,'.'); //从最后一个点开始截取,一直截取到最后 echo time().rand(100,999).strrchr($path,'.'); 方法二:通过uniqid()实现$path='face.stu.jpg'; echo uniqid().strrchr($path,'.'),'<br>'; //生成唯一的ID echo uniqid('goods_').strrchr($path,'.'),'<br>'; //带有前缀 echo uniqid('goods_',true).strrchr($path,'.'),'<br>'; //唯一ID+随机数1.7.2 验证文件格式方法一:判断文件的扩展名(不能识别文件伪装)操作思路:将文件的后缀和允许的后缀对比<body> <?php if(!empty($_POST)) { $allow=array('.jpg','.png','.gif'); //允许的扩展名 $ext=strrchr($_FILES['face']['name'],'.'); //上传文件扩展名 if(in_array($ext,$allow)) echo '允许上传'; else echo '文件不合法'; } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>注意:比较扩展名不能防止文件伪装。方法二:通过$_FIELS[]['type']类型(不能识别文件伪装)<body> <?php if(!empty($_POST)) { $allow=array('image/jpeg','image/png','image/gif'); //允许的类别 $mime=$_FILES['face']['type']; //上传文件类型 if(in_array($mime,$allow)) echo '允许上传'; else echo '文件不合法'; } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>注意:比较$_FIELS[]['type']不能防止文件伪装。方法三:php_fileinfo扩展(可以防止文件伪装) 在php.ini中开启fileinfo扩展extension=php_fileinfo.dll注意:开启fileinfo扩展以后,就可以使用finfo_*的函数了<body> <?php if(!empty($_POST)) { //第一步:创建finfo资源 $info=finfo_open(FILEINFO_MIME_TYPE); //var_dump($info); //resource(2) of type (file_info) //第二步:将finfo资源和文件做比较 $mime=finfo_file($info,$_FILES['face']['tmp_name']); //第三步,比较是否合法 $allow=array('image/jpeg','image/png','image/gif'); //允许的类别 echo in_array($mime,$allow)?'合法':'不合法'; } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>小结:验证文件格式有三种方法1、可以验证扩展名(不可以防止文件伪装)2、通过$_FILES[]['type']验证(不可以防止文件伪装)3、通过file_info扩展(可以防止文件伪装)1.7.3 优化文件上传例题步骤第一步:验证是否有误第二步:验证格式第三步:验证大小第四步:验证是否是http上传第五步:上传实现<body> <?php /** *验证错误 *如果有错,就返回错误,如果没错,就返回null */ function check($file) { //1:验证是否有误 if($file['error']!=0){ switch($file['error']) { case 1: return '文件大小超过了php.ini中允许的最大值,最大值是:'.ini_get('upload_max_filesize'); case 2: return '文件大小超过了表单允许的最大值'; case 3: return '只有部分文件上传'; case 4: return '没有文件上传'; case 6: return '找不到临时文件'; case 7: return '文件写入失败'; default: return '未知错误'; } } //2、验证格式 $info=finfo_open(FILEINFO_MIME_TYPE); $mime=finfo_file($info,$file['tmp_name']); $allow=array('image/jpeg','image/png','image/gif'); //允许的类别 if(!in_array($mime,$allow)){ return '只能上传'.implode(',',$allow).'格式'; } //3、验证大小 $size=123456789; if($file['size']>$size){ return '文件大小不能超过'.number_format($size/1024,1).'K'; } //4、验证是否是http上传 if(!is_uploaded_file($file['tmp_name'])) return '文件不是HTTP POST上传的<br>'; return null; //没有错误 } //表单提交 if(!empty($_POST)) { //上传文件过程中有错误就显示错误 if($error=check($_FILES['face'])){ echo $error; }else{ //文件上传,上传的文件保存到当天的文件夹中 $foldername=date('Y-m-d'); //文件夹名称 $folderpath="./uploads/{$foldername}"; //文件夹路径 if(!is_dir($folderpath)) mkdir($folderpath); $filename=uniqid('',true).strrchr($_FILES['face']['name'],'.'); //文件名 $filepath="$folderpath/$filename"; //文件路径 if(move_uploaded_file($_FILES['face']['tmp_name'],$filepath)) echo "上传成功,路径是:{$foldername}/{$filename}"; else echo '上传失败<br>'; } } ?> <form method="post" action="" enctype='multipart/form-data'> <input type="file" name="face"> <input type="submit" name="button" value="上传"> </form> </body>运行结果小结:1、将时间戳转换格式echo date('Y-m-d H:i:s',1231346),'<br>'; //将时间戳转成年-月-日 小时:分钟:秒 echo date('Y-m-d H:i:s'),'<br>'; //将当前的时间转成年-月-日 小时:分钟:秒2、设置时区(php.ini)PRC:中华人民共和国3、PHP的执行可以不需要Apache的参与1.8 练习1、多文件上传1.9 练习讲解1、递归遍历文件夹<?php //获取文件夹的子级 function getFile($path) { $folder=opendir($path); //打开文件夹 echo '<ul>'; while($f=readdir($folder)){ //读取文件夹 if($f=='.' || $f=='..') continue; echo '<li>'.iconv('gbk','utf-8',$f).'</li>'; $subpath="{$path}/{$f}"; if(is_dir($subpath)) //如果子级还是文件夹,继续打开并读取 getFile($subpath); } echo '</ul>'; } //测试 getFile('./');运行结果2、一只猴子看守一堆桃子,第一天吃了一半后又多吃了1个,第二天一样,到第十天的时候就剩下一个桃子,请问原来有几个桃子?分析f(n)-(f(n)/2+1)=f(n+1) =>f(n)/2-1=f(n+1) =>f(n)=(f(n+1)+1)*2代码实现<?php function getTao($n) { if($n==10) return 1; return (getTao($n+1)+1)*2; } echo getTao(1); //1534
2022年10月11日
60 阅读
0 评论
1 点赞
2022-10-11
PHP基础(4)
1.1 目标掌握静态变量的工作原理;了解全局变量、局部变量和超全局变量的区别;了解两种错误处理机制;掌握错误相关信息的三种配置方式;掌握自定义函数实现错误处理;理解四种包含文件方式的区别;理解文件包含的运行原理;掌握文件包含的不同应用场景:1.2 作用域1.2.1 变量作用域1、全局变量:在函数外面2、局部变量:在函数里面,默认情况下,函数内部是不会去访问函数外部的变量3、超全局变量:可以在函数内部和函数外部访问<?php $num=10; function fun() { echo $num; //Notice: Undefined variable: num } fun(); //函数内部默认不能访问函数外部的值 --------------------- <?php $_POST['num']=10; //将值付给超全局变量 function fun() { echo $_POST['num']; //获取超全局的值 10 } fun(); ---------------------------- <?php function fun() { $_GET['num']=10; //将值付给超全局变量 } fun(); echo $_GET['num']; //打印超全局变量的值 10在函数内部访问全局变量<?php $num=10; //全局变量 function fun() { echo $GLOBALS['num']; //输出全局的$num } fun();练习:如下代码输出什么<?php function fun() { $GLOBALS['num']=10; //将值付给全局的$num } fun(); echo $num; //10global关键字<?php $num=10; function fun() { global $num; //将全局变量的$num的地址引入到函数内部 相当于$num=&GLOBALS['num'] echo $num; //10 $num=100; } fun(); echo '<br>'; echo $num; //100 ----------------------------------- <?php $num=10; function fun() { global $num; unset($num); //销毁的是引用,不是具体的值 } fun(); echo $num; //10 小结:1、$GLOBALS保存的是全局变量的所有的值<?php $a=10; $b=20; function show() { echo '<pre>'; var_dump($GLOBALS); //是一个数组,保存的是全局变量的所有的值 } show();2、global用于创建一个全局变量的引用注意:常量没有作用域的概念<?php /* define('PI',3.14); function fun() { echo PI; //3.14 } fun(); echo '<br>'; */ ------------------------------------- function fun() { define('PI',3.14); } fun(); echo PI; //3.141.2.2 静态变量(static)静态变量一般指的是静态局部变量。静态变量只初始化一次<?php function fun() { $num=10; //普通变量每调用一次初始化一次,调用完毕销毁 $num++; echo $num,'<br>'; } fun(); //11 fun(); //11 -------------------------------- <?php function fun() { static $num=10; //静态变量只初始化一次,调用完毕吧不销毁,第二次调用的时候就不再初始化 $num++; echo $num,'<br>'; } fun(); //11 fun(); //12常量和静态变量的区别1、常量和静态变量都是初始化一次2、常量不能改变值,静态变量可以改变值3、常量没有作用域,静态变量有作用域<?php function fun1() { define('num',10); } function fun2() { echo num; //10 } fun1(); fun2(); ------------------------------------------------------------ <?php function fun1() { static $num=10; } function fun2() { echo $num; //Notice: Undefined variable: num 因为静态变量是有作用域的 } fun1(); fun2();1.2.3 匿名函数use()默认情况下,函数内部不能访问函数外部的变量,但在匿名函数中,可以通过use将外部变量引入匿名函数中<?php $num=10; $fun=function() use($num) { //将$num引入到匿名函数中 echo $num; }; $fun(); //10思考:如何在函数内部访问函数外部变量1、使用超全局变量2、$GLOBALS3、global4、use将函数外部变量引入到匿名函数内部练习:如果代码输出什么<?php $num=10; function test() { $num=20; $fun=function() use($num) { //只能引入一层 echo $num; }; $fun(); } test(); //20多学一招:use可以引入值,也可以引入地址<?php $num=10; $fun=function()use(&$num){ //use可以传地址 $num=100; }; $fun(); echo $num; //1001.3 递归函数内部自己调用自己递归有两个元素,一个是递归点(从什么地方递归),第二递归出口例题1:输出9 8 7 6 .....<?php function printer($num) { echo $num,' '; if($num==1) //递归出口 return; printer($num-1); //递归点 } printer(9); //9 8 7 6 5 4 3 2 1 例题2:从1加到100function cal($num) { if($num==1) return 1; return $num+cal($num-1); } echo cal(100); //分析 /** 第$i次执行 结果 cal(100) 100+cal(99) = 100+99+cal(98) = 100+99+98+cal(97) = 100+99+98+++++cal(1) = 100+99+98++++1 */例题:打印前10个斐波那契数列//打印第5个斐波那契数 function fbnq($n) { if($n==1 || $n==2) return 1; return fbnq($n-1)+fbnq($n-2); //第n个斐波那契数等于前两个数之和 } echo fbnq(5),'<br>'; /** *分析: fbnq(5) =fbnq(4)+fbnq(3) =fbnq(3)*2+fbnq(2) =(fbnq(2)+fbnq(1))*2+fbnq(2) =(1+1)*2+1 =5 */ //打印前10个斐波那契数 for($i=1;$i<=10;$i++) echo fbnq($i),' '; //1 1 2 3 5 8 13 21 34 55 小结:递归尽量少用,因为递归需要用到现场保护,现场保护是需要消耗资源的1.4 包含文件场景:1.4.1 包含文件的方式1、require:包含多次2、include:包含多次3、require_once: 包含一次4、include_once: 包含一次小结:1、require遇到错误抛出error类别的错误,停止执行2、include遇到错误抛出warning类型的错误,继续执行3、require_once、include_once只能包含一次4、HTML类型的包含页面中存在PHP代码,如果包含到PHP中是可以被执行的5、包含文件相当于把包含文件中的代码拷贝到主文件中执行,魔术常量除外,魔术常量获取的是所在文件的信息。6、包含在编译时不执行、运行时加载到内存、独立编译包含文件1.4.2 包含文件的路径./ 当前目录 ../ 上一级目录区分如下包含:require './head.html'; //在当前目录下查找 require 'head.html'; //受include_path配置影响include_path的使用场景:如果包含文件的目录结构比较复杂,比如:在c:\aa\bb\cc\dd中有多个文件需要包含,可以将包含的路径设置成include_path,这样包含就只要写文件名就可以了<?php set_include_path('c:\aa\bb\cc\dd'); //设置include_path require 'head1.html'; //受include_path配置影响 require 'head2.html';include_path可以设置多个,路径之间用分号隔开set_include_path('c:\aa\bb\cc\dd;d:\\');多学一招:正斜(/) web中目录分隔用正斜 http://www.sina.com/index.php 反斜(\)物理地址的分隔用反斜,(windows中物理地址正斜和反斜都可以) c:\web1\aa1.5 错误处理1.5.1 错误的级别notice:提示warning:警告error:致命错误notice和warning报错后继续执行,error报错后停止执行1.5.2 错误的提示方法方法一:显示在浏览器上方法二:记录在日志中1.5.3 与错误处理有关的配置在php.ini中1. error_reporting = E_ALL:报告所有的错误 2. display_errors = On:将错误显示在浏览器上 3. log_errors = On:将错误记录在日志中 4. error_log=’地址’:错误日志保存的地址在项目开发过程中有两个模式,开发模式,运行模式开发模式:错误显示在浏览器上,不要记录在日志中 运行模式:错误不显示在浏览器上,记录是日志中例题<?php $debug=false; //true:开发模式 false:运行模式 ini_set('error_reporting',E_ALL); //所有的错误有报告 if($debug){ ini_set('display_errors','on'); //错误显示是浏览器上 ini_set('log_errors','off'); //错误不显示在日志中 }else{ ini_set('display_errors','off'); ini_set('log_errors','on'); ini_set('error_log','./err.log'); //错误日志保存的地址 } //测试 echo $num;提示:ini_set()设置PHP的配置参数1.5.4 自定义错误处理(了解)通过trigger_error产生一个用户级别的 error/warning/notice 信息<?php $age=100; if($age>80){ //trigger_error('年龄不能超过80岁'); //默认触发了notice级别的错误 //trigger_error('年龄不能超过80岁',E_USER_NOTICE); //触发notice级别的错误 //trigger_error('年龄不能超过80岁',E_USER_WARNING); trigger_error('年龄不能超过80岁',E_USER_ERROR); //错误用户error错误 }注意:用户级别的错误的常量名中一定要带有USER。定义错误处理函数function error() { echo '这是自定义错误处理'; } set_error_handler('error'); //注册错误处理函数,只要有错误就会自动的调用错误处理函数 echo $num;运行结果处理处理函数还可以带有参数/** *自定义错误处理函数 *@param $errno int 错误类别 *@param $errstr string 错误信息 *@param $errfile string 文件地址 *@param $errline int 错误行号 */ function error($errno,$errstr,$errfile,$errline) { switch($errno){ case E_NOTICE: case E_USER_NOTICE: echo '记录在日志中,上班后在处理<br>'; break; case E_WARNING: case E_USER_WARNING: echo '给管理员发邮件<br>'; break; case E_ERROR: case E_USER_ERROR: echo '给管理员打电话<br>'; break; } echo "错误信息:{$errstr}<br>"; echo "错误文件:{$errfile}<br>"; echo "错误行号:{$errline}<br>"; } set_error_handler('error'); echo $num; //运行结果 记录在日志中,上班后在处理 错误信息:Undefined variable: num 错误文件:F:\wamp\www\4-demo.php 错误行号:501.6 文件编程1.6.1 文件夹操作1 、创建文件夹【mkdir(路径,权限,是否递归创建)】make:创建 directory:目录,文件夹例题<?php //1、创建目录 //mkdir('./aa'); //创建aa文件夹 //mkdir('./aa/bb'); //在aa目录下创建bb(aa目录必须存在) mkdir('./aa/bb/cc/dd',0777,true); //递归创建小结:1、0777表示是文件夹的权限,在Linux中会详细讲解2、true表示递归创建,默认是false2、删除文件夹【rmdir()】//remove:移除 rmdir('./aa/bb/cc/dd'); //删除dd文件夹提醒:1、删除的文件夹必须是空的 2、PHP基于安全考虑,没有提供递归删除。3、重命名文件夹【rename(旧名字,新名字)】rename('./aa','./aaa'); //将aa改为aaa4、是否是文件夹【is_dir()】echo is_dir('./aaa')?'是文件夹':'不是文件夹';5、打开文件夹、读取文件夹、关闭文件夹$folder=opendir('./'); //打开目录 //var_dump($folder); //resource(3) of type (stream) while($f=readdir($folder)){ //读取文件夹 if($f=='.' || $f=='..') continue; echo iconv('gbk','utf-8',$f),'<br>'; //将gbk转成utf-8 } closedir($folder); //关闭文件夹小结:1、opendir()返回资源类型 2、每个文件夹中都有.和.. 3、iconv()用来做字符编码转换1.7 练习讲解1、 通过for循环将数组中值求和、求平均值<?php //1、求数组的和、平均值 $num=[1,20,53,23,14,12,15]; $sum=0; for($i=0,$n=count($num);$i<$n;$i++){ $sum+=$num[$i]; } echo '和是:'.$sum,'<br>'; //和是:138 echo '平均值:'.number_format($sum/count($num),1); //精确到小数点后面1位 平均值:19.7 echo '<hr>';2、数组翻转$stu=['tom','berry','ketty','rose','jake']; for($i=0,$j=count($stu)-1;$i<$j;$i++,$j--){ [$stu[$i],$stu[$j]]=[$stu[$j],$stu[$i]]; //元素交换 } print_r($stu); //Array ( [0] => jake [1] => rose [2] => ketty [3] => berry [4] => tom ) 3、遍历二维数组$stu=[ [1,2,3,4], [10,20,30,40] ]; for($i=0;$i<count($stu);$i++){ //循环第一列 for($j=0;$j<count($stu[$i]);$j++){ //循环第二列 echo $stu[$i][$j],' '; } echo '<br>'; } //运行结果 1 2 3 4 10 20 30 40 4、 循环输出1-100,其中3的倍数输出A,5的倍数输出B,15输出C。for($i=1; $i<=100; $i++) { if($i%15==0) //先写%15,,因为可以%15的值一定可以%3和%5 echo 'C'; elseif($i%3==0) echo 'A'; elseif($i%5==0) echo 'B'; else echo $i; echo ' '; }5、 打印水仙花数for($i=100;$i<=999;$i++){ $a=(int)($i/100); //百位数 $b=(int)(($i%100)/10); //十位数 $c=$i%10; //个位数 if($i==pow($a,3)+pow($b,3)+pow($c,3)) echo $i,'<br>'; } //pow($a,3) 表示$a的三次方 //运行结果 153 370 371 4076、 打印100以内的斐波那契数(迭代法)1 1 2 3 5 8 13 21 .....$num1=1; //第一个数 $num2=1; //第二个数 echo $num1,' ',$num2,' '; while(true){ $num3=$num1+$num2; //第三个数是前面两个数的和 if($num3>100) //超过100就终止循环 break; echo $num3,' '; $num1=$num2; //将$num2移给$num1 $num2=$num3; //将$num3移给$num2 } //1 1 2 3 5 8 13 21 34 55 89 1.8 练习1、一只猴子看守一堆桃子,第一天吃了一半后又多吃了1个,第二天一样,到第十天的时候就剩下一个桃子,请问原来有几个桃子?2、递归遍历整个文件夹
2022年10月11日
57 阅读
0 评论
0 点赞
2022-10-11
PHP基础(3)
1.1 目标理解循环结构的应用场景;掌握while循环实现迭代原理;掌握for循环实现迭代原理;掌握foreach循环实现迭代原理;理解二维数组的遍历原理;理解循环控制的概念;掌握循环控制中continue和break的效果和区别;理解函数的作用;掌握自定义函数的定义;理解形参的工作原理以及作用;了解参数默认值的工作原理;了解强类型形参的作用;理解返回值return在函数中的实际含义;了解强类型返回值的作用;掌握函数的调用;掌握可变函数的使用方式;了解匿名函数的使用方式;知道如何在API中查找所需使用的系统函数;1.2 循环1.2.1 forfor(初始值;条件;增量){ //循环体 }注意:循环中千万不能出现死循环思考:如下代码输出什么例题一:<?php for($i=1;$i<=10;$i+=2){ echo "{$i}:锄禾日当午<br>"; } /* 1:锄禾日当午 3:锄禾日当午 5:锄禾日当午 7:锄禾日当午 9:锄禾日当午 */例题二:<?php for($i=1;$i<=10;){ } //死循环,$i永远等于1,1永远小于10,条件永远为true例题三<?php for($i=1;;$i++){ } //死循环,只要没有条件都是死循环例题四<?php for(;;){ } //这是一个经典的死循环1.2.3 思考题1、如下代码循环了几次?for($i=1;$i!=5;$i++){ } //循环了4次2、在循环N次循环体中,初始值执行了几次?条件执行了几次?增量执行了几次?初始值执行了1次 条件执行了N+1次 增量执行了N次3、在循环执行完毕后,$i的值是存在的。<?php for($i=1;$i<=3;$i++){ } echo $i; //41.2.4 while、do-while语法while(条件){ } ------------------------- do{ }while(条件)小结:1、for、while、do-while可以相互替换2、如果明确知道循环多少次首先for循环,如要要循环到条件不成立为止选while或do-while3、先判断再执行选while,先执行再判断选do-while4、while循环条件不成立就不执行,do-while至少执行一次1.2.5 例题1、使用三种循环实现从1加到100<?php //1、for循环实现 $sum=0; for($i=1;$i<=100;$i++){ $sum+=$i; //$sum=$sum+$i; } echo $sum; //分析 /** * $i $sum 1 1 2 1+2 3 1+2+3 4 1+2+3+4 ... 100 1+2+3+++100 */ ------------------------------------------------- //2、while循环 $i=1; $sum=0; //保存和 while($i<=100){ //方法一 /* $sum+=$i; $i++; */ //方法二 $sum+=$i++; } echo $sum; -------------------------------------------------- //3、do-while循环 $i=1; $sum=0; do{ $sum+=$i; $i++; }while($i<=100); echo $sum,'<br>'; //5050 //可以有如下更改 $i=1; $sum=0; do{ $sum+=$i++; //++后置 }while($i<=100); echo $sum,'<br>'; //5050 //可以做如下更改 $i=1; $sum=0; do{ $sum+=$i; }while(++$i<=100); //++前置 echo $sum,'<br>'; //5050小结:1、for、while、do-while可以相互替换2、结合++前置和++后置考虑逻辑1.2.6 多语句表达式初始值、增量可以由多条语句组成例题:数字分解<?php for($i=1,$j=9;$i<=$j;$i++,$j--){ echo "10可以分成{$i}和{$j}<br>"; } //运行结果 /* 10可以分成1和9 10可以分成2和8 10可以分成3和7 10可以分成4和6 10可以分成5和5 */小结:初始值、增量可以写多个表达式,但是条件一般只写一个,如果条件写多个,只是最后一个条件起作用1.2.7 双重循环1、打印阶梯数字<?php for($i=1;$i<=9;$i++){ //循环行 for($j=1;$j<=$i;$j++){ //循环列 echo $j,' '; } echo '<br>'; } //运行结果 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 2、打印九九乘法表<style type="text/css"> table{ width:980px; } table,td{ border:solid 1px #0000FF; border-collapse:collapse; } td{ height:40px; } </style> <table> <?php for($i=1;$i<=9;$i++){ //行 echo '<tr>'; for($j=1;$j<=$i;$j++){ //列 echo "<td>{$j}*{$i}=".($j*$i).'</td>'; } echo '</tr>'; } ?> </table>运行结果小结:规则:当前列*当前行1.28 foreachforeach循环是用来遍历数组语法//语法一 foreach(数组 as 值){ } //语法二 foreach(数组 as 键=>值){ }例题<?php $stu=['tom','berry','ketty']; foreach($stu as $v){ echo $v,'<br>'; } /** tom berry ketty */ echo '<hr>'; ----------------------------------------------------------- foreach($stu as $k=>$v){ echo "{$k}:{$v}<br>"; } /** 0:tom 1:berry 2:ketty */1.3 跳转语句1.3.1 语法break:中断循环continue:中断当前循环,进入下一个循环例题:<?php for($i=1; $i<=10; $i++) { if($i==5) break; //中断循环 echo "{$i}:锄禾日当午<br>"; } //结果 1:锄禾日当午 2:锄禾日当午 3:锄禾日当午 4:锄禾日当午 -------------------------------------------------- <?php for($i=1; $i<=10; $i++) { if($i==5) continue; //跳出5,进入6循环 echo "{$i}:锄禾日当午<br>"; } 1:锄禾日当午 2:锄禾日当午 3:锄禾日当午 4:锄禾日当午 //注意,没有打印第5句 6:锄禾日当午 7:锄禾日当午 8:锄禾日当午 9:锄禾日当午 10:锄禾日当午 1.3.2 中断多重循环break和continue默认中断、跳出1重循环,如果调中断、跳出多重循环,在后面加一个数字。<?php for($i=1; $i<=10; $i++) { for($j=1;$j<=$i;$j++){ echo $j.' '; if($j==5){ break 2; //中断2重循环 } } echo '<br>'; } //运行结果 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 练习<?php for($i=1; $i<=10; $i++) { switch($i){ case 5: break 2; } echo $i,'<br>'; } //结果 1 2 3 4小结:switch的本质是循环了一次的循环1.4 替代语法php中除了do-while以外,其他的语法结构都有替代语法规则:左大括号变冒号,右大括号变endXXX//if的替代语法 if(): elseif(): else: endif; //switch替代语法 switch(): endswitch; //for for(): endfor; //while while(): endwhile; //foreach foreach(): endforeach;例题:在混编的时候用替代语法<body> <?php for($i=1;$i<=10;$i++): if($i%2==0): ?> <?php echo $i;?>:锄禾日当午<br> <?php endif; endfor; ?> </body> //运行结果 2:锄禾日当午 4:锄禾日当午 6:锄禾日当午 8:锄禾日当午 10:锄禾日当午小结:可以通过替代语法证明else if之间如果有空格是嵌套if语句。<?php $score=80; if($score>=90): echo 'A'; elseif($score>=80): //elseif之间没有空格,如果有空格是嵌套if语句 echo 'B'; else: echo 'C'; endif; ---------------------------------------- <?php $score=80; if($score>=90): echo 'A'; else: if($score>=80): echo 'B'; else: echo 'C'; endif; endif;1.5 函数1、函数就是一段代码块2、函数可以实现模块化编程1.5.1 函数定义function 函数名(参数1,参数2,...){ //函数体 }通过函数名()调用函数<?php //定义函数 function show() { echo '锄禾日当午<br>'; } //调用 show(); //锄禾日当午 SHOW(); //锄禾日当午 函数名不区分大小写小结:1、变量名区分大小写2、关键字、函数名不区分大小写1.5.2 可变函数将函数名存储到变量中<?php function show($args) { echo $args,'<br>'; } $str='show'; //将函数名保存到变量中 $str('锄禾日当午');例题:随机调用函数<?php //中文显示 function showChinese() { echo '锄禾日当午<br>'; } //英文显示 function showEnglish() { echo 'chu he re dang wu<br>'; } //测试 $fun=rand(1,10)%2?'showChinese':'showEnglish'; //可变变量 $fun();1.5.3 匿名函数匿名函数就是没有名字的函数<?php //匿名函数 $fun=function(){ echo '锄禾日当午<br>'; }; //匿名函数调用 $fun();1.5.4 参数传递函数的参数有形式参数和实际参数形式参数是定义函数时候的参数,只起形式的作用,没有具体的值实际参数的调用函数时候的参数,有具体的值<?php function fun($num1,$num2) { echo $num1+$num2; } fun(10,20); //30默认情况下,参数的传递是值传递<?php $num=10; function fun($args) { $args=100; } fun($num); echo $num; //10地址传递<?php $num=10; //地址传递 function fun(&$args) { //&符表示取地址 $args=100; } fun($num); echo $num; //100小结1、函数的参数默认是值传递2、如果要传递地址,在参数前面加&3、如果是地址传递,不能直接写值function fun(&$args) { $args=100; } fun(10); //Fatal error: Only variables can be passed by reference (只有变量才能传递引用)1.5.5 参数默认值1、在定义函数的时候给形参赋值就是参数的默认值<?php //参数的默认值 function fun($name,$add='地址不详') { echo '姓名:'.$name,'<br>'; echo '地址:'.$add,'<hr>'; } //测试 fun('tom','北京'); fun('berry');2、默认值必须是值,不能用变量代替<?php $str='地址不详' function fun($name,$add=$str) { //错误,默认值可以使用变量 echo '姓名:'.$name,'<br>'; echo '地址:'.$add,'<hr>'; }3、默认值可以使用常量<?php define('ADD','地址不详'); function fun($name,$add=ADD) { //默认值可以使用常量 echo '姓名:'.$name,'<br>'; echo '地址:'.$add,'<hr>'; } //测试 fun('berry');4、有默认值的写在后面,没有默认值的写在前面<?php //没有默认值的写在前面,有默认值写在后面 function fun($name,$age='未知',$add='地址不详') { echo "姓名:{$name}<br>"; echo "年龄:{$age}<br>"; echo "地址:{$add}<br>"; } fun('tom'); //运行结果 姓名:tom 年龄:未知 地址:地址不详1.5.6 参数个数不匹配<?php function fun($num1,$num2) { echo $num1,'<br>'; echo $num2,'<br>'; } //fun(10); //实参少于形参(报错) fun(10,20,30); //实参多于形参,只取前面对应的值获取所有传递的参数<?php function fun() { //echo func_num_args(),'<br>'; //获取参数的个数 $args=func_get_args(); //获取参数数组 print_r($args); } fun(10); fun(10,20); fun(10,20,30); 1.5.7 参数约束1、定义变长参数(了解)<?php // ...$hobby包含了除了前面两个参数以外的所有参数 function fun($name,$age,...$hobby) { echo '姓名:'.$name,'<br>'; echo '年龄:'.$age,'<br>'; print_r($hobby); echo '<hr>'; } fun('tom',22); fun('berry',25,'读书','睡觉');运行结果多学一招:function fun(...$args) { print_r($args); echo '<br>'; } $num=[10,20]; echo '<pre>'; fun(...$num); //将数组中的参数展开 //运行结果 /* Array ( [0] => 10 [1] => 20 ) */2、参数类型约束//类型约束 function fun(string $name,int $age) { echo "姓名:{$name},'<br>'"; echo "年龄:{$age}<br>"; } fun('tom',22); //约束$name是字符串型,$age是整型3、返回值约束function fun(int $num1,int $num2):int { //必须返回整型 return $num1+$num2; } echo fun(10,20); //30可以约束:string、int、float、bool、数组//约束返回类型是数组 function fun():array { } //约束return后面不能有返回值 必须在7.1以后的版本中才支持 function fun():void { //void是空的意思 return; } fun();1.6 return1.6.1 终止脚本执行<?php echo '锄禾日当午<br>'; return; //终止脚本执行 echo '汗滴禾下土<br>'; //不执行提醒:return只能中断当前页面,如果有包含文件,只能中断包含文件例题:6-demo.php<?php echo '锄禾日当午<br>'; require './test.php'; //包含文件 echo '汗滴禾下土<br>';test.php<?php echo 'aaa<br>'; return; //只能中断test.php echo 'bbb<br>';运行结果如果要完全终止脚本执行,使用exit()、或die()echo 'aaa<br>'; exit(); //die() echo 'bbb<br>';1.6.2、返回页面结果test.php<?php return array('name'=>'tom','sex'=>'男');6-demo.php<?php $stu=require './test.php'; print_r($stu); //Array ( [name] => tom [sex] => 男 ) 小结:在项目中引入配置文件就使用这种方法1.6.3 函数的返回和终止return在函数中使用作用有二1、终止函数执行2、返回值function fun() { echo 'aaa'; return ; //终止函数执行 echo 'bbb'; } fun(); //aaa ---------------------------------- function fun() { return 10; //返回值 } echo fun(); //101.7 练习讲解计算器<body> <?php $num1=''; //$num1的初始值 $num2=''; //$num2的初始值 $op=''; //操作符 $result=''; //结果 if(!empty($_POST)) { $num1=$_POST['num1']; $num2=$_POST['num2']; $op=$_POST['op']; //操作符 switch($op){ case '+': $result=$num1+$num2; break; case '-': $result=$num1-$num2; break; case '*': $result=$num1*$num2; break; case '/': $result=$num1/$num2; break; } } ?> <form method="post" action=""> <input type="text" name="num1" value='<?php echo $num1?>'> <select name="op"> <option value="+" <?php echo $op=='+'?'selected':''?>>+</option> <option value="-" <?php echo $op=='-'?'selected':''?>>-</option> <option value="*" <?php echo $op=='*'?'selected':''?>>*</option> <option value="/" <?php echo $op=='/'?'selected':''?>>/</option> </select> <input type="text" name="num2" value='<?php echo $num2?>'> <input type="submit" name="button" value="="> <input type="text" name="result" value='<?php echo $result?>'> </form> </body>运行结果1.8 练习1、 通过for循环将数组中值求和、求平均值2、数组翻转3、遍历二维数组4、 循环输出1-100,其中3的倍数输出A,5的倍数输出B,15输出C。5、 打印水仙花数6、 打印100以内的斐波那契数(迭代法) 1 1 2 3 5 8 13 21 .....7、 打印星星8、 生成颜色面板
2022年10月11日
97 阅读
0 评论
0 点赞
2022-10-11
PHP基础(2)
1.1 目标理解常量的概念掌握常量的使用方式理解魔术常量的概念和应用理解string类型中单引号和双引号的区别掌握PHP中数组的访问方式;理解PHP代码的执行解析过程;掌握逻辑运算符的使用;理解短路运算的原理;掌握自操作运算符的使用;理解前置和后置自操作符的区别和原理;了解强制转换的价值和应用场景;理解if分支结构的应用场景;理解switch分支结构的应用场景;理解switch和if分支的区别;1.2 常量在整个运行过程中,固定不变的值1.2.1 定义常量1、用define()函数定义常量define(常量名,值,[是否区别大小写]) true表示不区分大小写,默认是false 常量名前没有$符 常量名推荐使用大写例题:<?php define('NAME','tom'); //定义常量 define('PI',3.14,true); //定义常量,不区分大小写 echo NAME,'<br>',Pi; //true表示不区分大小写,默认是区分大小写的。2、定义常量可以用特殊字符,但是在调用的时候必须用constant关键字调用define('%-%','tom'); echo constant('%-%'); //通过constant获取特殊字符作为常量名的常量3、判断常量是否定义,通过defined()判断常量是否已经定义if(!defined('NAME')){ define('NAME','berry'); } echo NAME; //berry4、还可以使用const关键字定义常量const NAME='tom'; echo NAME; //tom小结:1、定义常量有两种方式,define()和const2、常量在整个运行过程中值保持不变,常量不能重新定义3、使用constant获取特殊字符做的常量名的值4、defined()用来判断常量是否被定义1.2.2 预定义常量PHP预先定义好的常量例题echo PHP_VERSION,'<br>'; //PHP版本号 echo PHP_OS,'<br>'; //PHP操作系统 echo PHP_INT_MAX,'<br>'; //PHP中整型的最大值 1.2.3 魔术常量魔术常量它们的值随着它们在代码中的位置改变而改变echo __LINE__,'<br>'; //获取当前行号 echo __FILE__,'<br>'; //文件的完整路径和文件名 echo __DIR__,'<br>'; //文件所在的目录1.3 数据类型数据类型有两种:强类型和弱类型PHP是弱类型1.3.1 基本类型(标量类型)1、整型存整数,PHP_INT_MAX获取整形最大值PHP支持8、10、16机制的整数<?php $num1=10; //十进制 $num2=010; //八进制(数字前面加0) $num3=0x10; //十六进制(数字前面加0x) echo $num1,'<br>'; //10 echo $num2,'<br>'; //8 echo $num3; //16进制转换机制缩写单词十进制decdecimalist二进制binbinary八进制octoctonary十六进制hexhexdecimalist例题PHP提供了进制转换函数echo decbin(123),'<br>'; //十进制转二进制 echo bindec(1111011),'<br>'; //二进制转十进制 echo dechex(123),'<br>'; //十进制转十六进制 echo hexdec('7b'),'<br>'; //十六进制转十进制 echo decoct(123); //十进制转八进制2、浮点型浮点数在内存中保存的是近似值浮点数不能参与比较var_dump(0.9==(1-0.1)); //bool(true) echo '<br>'; var_dump(0.1==(1-0.9)); //bool(false) 如果浮点数要比较,必须确定比较的位数var_dump(0.9==(1-0.1)); //bool(true) echo '<br>'; var_dump(0.1==(1-0.9)); //bool(false) echo '<br>'; var_dump(bccomp(0.1,1-0.9,5)); //比较小数点后面5位 int(0) 0表示相等提醒:如果一个整数超出了整形的范围,会自动的转成浮点型3、布尔型不能使用echo 和print输出布尔型,要使用var_dump()输出$flag=false; var_dump($flag); //bool(false) 4、字符串型在PHP中单引号字符串和双引号字符串是有区别的单引号字符串是真正的字符串双引号字符串要解析字符串中的变量例题$name='tom'; echo '我的名字叫$name','<br>'; //我的名字叫$name echo "我的名字叫$name",'<br>'; //我的名字叫tom例题:{ }取变量值$name='tom'; echo '$name是我的名字','<br>'; //$name是我的名字 echo "{$name}是我的名字",'<br>'; //{}表示获取变量的值(tom是我的名字) echo "${name}是我的名字",'<br>'; //$和{只要挨着一起就可以(tom是我的名字)输出特殊字符echo '说:\'上课不要睡觉\'','<br>'; //转义字符 说:'上课不要睡觉' echo '文件保存在c:\\'; //文件保存在c:\字符串定界符1、有<<<开头,后面跟的是标识符 2、字符串定界符的结束符必须顶格写,前面不能有任何的空白字符 3、字符串定界符分为两种,heredoc(双引号),nowdoc(单引号)1.3.2 复合类型1、数组在PHP中数组有两种形式,索引数组和关联数组索引数组:用整数做下标,默认从0开始,后面依次加一关联数组:用字符串做下标,通过=>符号将下标和值关联起来例题:数组的声明<?php //1、索引数组的声明 $stu=array('tom','berry','ketty'); //索引数组 print_r($stu); //输出数组 Array ( [0] => tom [1] => berry [2] => ketty ) echo '<hr>'; echo $stu[0],'<br>'; //tom echo $stu[1],'<br>'; //berry echo $stu[2],'<hr>'; //ketty ------------------------------------------ //2、关联数组 $emp=array('name'=>'李白','sex'=>'男','age'=>22); print_r($emp); //Array ( [name] => 李白 [sex] => 男 [age] => 22 ) echo '<hr>'; echo $emp['name'],'<br>'; //李白 echo $emp['sex'],'<br>'; //男 echo $emp['age']; //22练习:写出数组的下标$array=array(1=>'a','b','c','d'); print_r($array); //Array ( [1] => a [2] => b [3] => c [4] => d ) echo '<br>'; -------------------------- $array=array('a',2=>'b','c',5=>'d'); print_r($array); //Array ( [0] => a [2] => b [3] => c [5] => d ) echo '<br>'; ---------------------------- $array=array('a','name'=>'b','c','sex'=>'d'); print_r($array); //Array ( [0] => a [name] => b [1] => c [sex] => d ) echo '<br>'; ------------------------------ $array=array(1=>'a',1=>'b',1=>'c','d'); print_r($array); //Array ( [1] => c [2] => d ) 数组的下标只能是正整数和字符串思考如下下标$stu[true]='tom'; //转成1 $stu[false]='berry'; //转成0 $stu[12.9]='aa'; //转成12(取整数部分) $stu[-10]='bb'; //负数可以做下标 $stu[-12.3]='cc'; //取负整数 $stu['10']='dd'; //字符串数字转成数字 $stu['']='ee'; //空字符串也可以做下标 $stu[null]='ff'; //转成空字符串做下标 print_r($stu);短数组语法,可以直接通过中括号声明数组$stu=['tom','berry','ketty']; print_r($stu); //Array ( [0] => tom [1] => berry [2] => ketty ) 多学一招:在PHP7.1中可以支持数组的赋值//例题,两个数交换 $num1=10; $num2=20; [$num1,$num2]=[$num2,$num1]; echo $num1,'<br>',$num2;二维数组的声明$stu=[ ['name'=>'tom','sex'=>'男','age'=>22], ['name'=>'berry','sex'=>'女','age'=>23] ]; echo '<pre>'; print_r($stu); //运行结果 Array ( [0] => Array ( [name] => tom [sex] => 男 [age] => 22 ) [1] => Array ( [name] => berry [sex] => 女 [age] => 23 ) )多学一招:字符串可以通过数组的方式去调用echo 'abc'[0],'<br>'; //a echo 'abc'[-1],'<br>'; //c,从右边开始取第一个 7.1开始支持小结:1、数组在内存中一段连续的空间2、如果要保存同一类型的多个数据就使用数组2、对象对象在后面专门讲解(面向对象编程)1.3.3 特殊类型1、资源2、null提醒:在PHP中 null和NULL是一样的,不区分大小写1.3.4 类型转换1、自动类型转换:当提供的类型和需要的类型不一致的时候会自动进行类型转换$num=10; if($num){ //自动将数字转成布尔型 echo 'aa'; }else{ echo 'bb'; } --------------------------------- echo '20'-10; //自动的将字符串转成数字2、强制类型转换语法:(数据类型)数据<?php $num1='12'; var_dump($num1,(int)$num1,(float)$num1); //string(2) "12" int(12) float(12) 其他类型和布尔之间的转换规则:0、空为假,非0非空为真<?php var_dump((bool)'abc'); echo '<br>'; //bool(true) var_dump((bool)''); echo '<br>'; //bool(false) var_dump((bool)'0'); echo '<br>'; //bool(false) var_dump((bool)'0.0'); echo '<br>'; //bool(true) var_dump((bool)'00'); echo '<br>'; //bool(true) var_dump((bool)'false'); echo '<br>'; //bool(true) var_dump((bool)'null'); echo '<br>'; //bool(true) var_dump((bool)1); echo '<br>'; //bool(true) var_dump((bool)0); echo '<br>'; //bool(false) var_dump((bool)-10); echo '<br>'; //bool(true) var_dump((bool)0.0); echo '<br>'; //bool(false) var_dump((bool)array()); echo '<br>'; //bool(false) var_dump((bool)array(1)); echo '<br>'; //bool(true) var_dump((bool)array(false)); echo '<br>';//bool(true) var_dump((bool)null); echo '<br>'; //bool(false) 1.4 运算符1.4.1 算术运算符一元运算符二元运算符+++ * / % (取模)注意:在PHP中,算术运算符只能做数学运算。<?php echo '10'+'20','<br>'; //30 echo '10ab'+'20cd','<br>'; //30 echo 'ab10'+'cd20','<br>'; //0++前置:先自增再运算++后置:先运算再自增练习$num=10; $num++; echo $num; //11 ------------------------- $num=10; echo $num++; //10 ------------------------ $num=10; echo ++$num; //11练习<?php $num=5; echo (++$num)+(++$num)+(++$num); //21 ------------------------- <?php $num=5; echo ($num++)+($num++)+($num++); //181.4.2 关系运算符(比较运算符)> >= < <= == != === !==比较运算符的运算结果是布尔值1.4.3 逻辑运算符& 与:运算符两边的表达式都要计算 | 或:运算符两边的表达式都要计算 && 短路与:如果前面的条件不满足,后面的条件就不用计算了 || 短路或 ! 非例题<?php $a=5; $b=10; if($a>10 && ++$a>20) echo '你好吗'; echo $a; //5 //分析:$a>10为false, 与中只要有一个是false,另一个不用计算结果肯定是false,所以短路与++a就不计算了,结果是5 ---------------------------- <?php $a=5; $b=10; if($a<10 || ++$a>20) echo '你好吗'; echo $a; //5 //分析:短路或只要有一个为true,结果肯定是true,$a<10结果是true,后面++$a就不用计算了。1.4.4 赋值运算符= //赋值 += //a+=b a=a+b -= *= /= %=1.4.5 字符串连接符(.)echo 'aa'.'bb'; //字符串链接 aabb1.4.6 错误抑制符(@)错误抑制符只对表达式有效<?php echo @($aa+$bb); //错误抑制1.4.7 三元运算符(?:)语法:表达式?值1:值2 //表达式的值为true,返回值1,否则返回值2练习<?php $num=11; echo $num%2?'奇数':'偶数';1.4.8 null合并运算符(??)PHP7.0以后才支持例题<?php echo $name??'姓名不详'; //姓名不详多学一招:两个用来判断的函数isset():判断变量是否被设置,并且设置的不是null empty():检查一个变量是否为空,能转成false全部是空,['',0,0.0,array(),null]例题echo isset($name)?$name:'姓名不详'; //姓名不详 echo '<hr>'; $stu=array(); echo empty($stu)?'空':'非空'; //空1.5 判断1.5.1 语法单分支if(条件){ }双分支if(条件){ //代码块1 }else{ //代码块2 }多分支if(条件){ }elseif(条件){ //注意:elseif之间没有空格 }else{ }多路选择switch(表达式){ case 常量: //代码块 break; case 常量: //代码块 break; default: //代码块 }1.5.2 例题例题一、判断闰年(练习双分支)步骤:1、创建表单 2、提交数据 3、在服务器获取提交的数据,并判断代码实现<body> <?php if(!empty($_POST)){ //$_POST不为空说明有post提交的数据 //var_dump($_POST); $year=$_POST['year']; //获取年份 if($year==''){ echo '您没有输入年份'; }else{ if(is_numeric($year)){ //判断$year是否是数字或字符串数字 $year+=0; //将字符串数字转成数字型 if(is_int($year)){ //is_int用来检测变量是否是整型 if($year<1){ echo '年份必须正整数'; }else{ if($year%4==0 && $year%100!=0 || $year%400==0) echo "{$year}是闰年"; else echo "{$year}是平年"; } }else{ echo '您输入的不是整数'; } }else{ echo '您输入的不是数字'; } } } ?> <form method="post" action=""> 请输入年份: <input type="text" name="year"> <br /> <input type="submit" name="button" value="判断闰年"> </form> </body>运行结果小结:1、$_POST是一个变量,用来保存post提交的数据2、action=''表示将数据提到本页面3、is_numeric()判断变量是否是数字或字符串数字4、is_int()判断变量是否是整型5、if、else后面如果只是一句代码,大括号可以省略例题二:判断成绩(练习多分支)目标:输入语文和数学,判断等级代码实现<body> <?php if(isset($_POST['button'])){ //点击了提交按钮 $ch=$_POST['ch']; //获取语文成绩 $math=$_POST['math']; //获取数学成绩 if($ch=='' || !is_numeric($ch) || $ch<0 || $ch>100){ echo '语文成绩必须在0-100之间'; } elseif($math=='' || !is_numeric($math) || !($math>=0 && $math<=100)){ echo '数学成绩必须在0-100之间'; }else{ $avg=($ch+$math)/2; //求平均值 echo "您的平均分是:{$avg}<br>"; if($avg>=90) echo 'A'; elseif($avg>=80) echo 'B'; elseif($avg>=70) echo 'C'; elseif($avg>=60) echo 'D'; else echo 'E'; } } ?> <form method="post" action=""> 语文: <input type="text" name="ch"> <br /> 数学: <input type="text" name="math"> <br /> <input type="submit" name="button" value="判断成绩"> </form> </body>运行结果例题三:更改颜色(switch-case)目标:将文字的颜色改成选择的颜色<body> <?php if(isset($_POST['button'])) { switch($_POST['color']){ case '1': $color='#FF0000'; //红色 break; case '2': $color='#009900'; // 绿色 break; case '3': $color='#0000FF'; //蓝色 break; default: $color='#000000'; //黑色 } echo <<<str <script type="text/javascript"> window.onload=function(){ document.getElementById('shi').style.color='$color'; } </script> str; } ?> <div id="shi"> 锄禾日当午, <br /> 汗滴禾下土。 <br /> 谁知盘中餐, <br /> 粒粒皆辛苦。 <br /> </div> <form method="post" action=""> <select name="color"> <option value="0">请选择颜色</option> <option value="1">红色</option> <option value="2">绿色</option> <option value="3">蓝色</option> </select> <input type="submit" name="button" value="更改颜色"> </form> </body>运行结果
2022年10月11日
112 阅读
0 评论
1 点赞
2022-10-11
PHP基础(1)
php是一门语言,用来做业务逻辑
2022年10月11日
31 阅读
0 评论
1 点赞
2022-09-30
中国完整的历史朝代表
中国完整的历史朝代表
2022年09月30日
117 阅读
0 评论
2 点赞
2022-09-21
唐诗三百首1-5
早发白帝城 李白 朝辞白帝彩云间, 千里江陵一日还。 两岸猿声啼不住, 轻舟已过万重山。
2022年09月21日
237 阅读
1 评论
1 点赞
2022-09-19
清除浮动,单行多行超出用...
清除浮动,单行多行超出用...
2022年09月19日
393 阅读
0 评论
4 点赞
2022-09-16
春和 《江海共余生》
在千山万水的风景里,在日出日落的生活里,你都不在身边,但是每一处风景中都能看到你的影子,因为你在我心里。幸好思念无声,否则震耳欲聋。
2022年09月16日
525 阅读
2 评论
3 点赞
1
...
15
16