php复习总结
2022-04-29 22:23:55 14 举报
AI智能生成
php复习
作者其他创作
大纲/内容
初识php
认识web系统
程序如何进行
c应用
java应用
C/S系统
B/S系统
浏览端web技术
客户端
HTML<br>JavaScript<br>CSS<br>WebSocket<br>WebGL等<br>
HTTP与静态页面
HTTP与静态页面
代码简单分析
<html><br><br><head><br> <meta charset="utf-8"> <font color="#f44336">//页面编号</font><br> <title>HTML Test</title> <font color="#f44336">//浏览器显示的标题</font><br></head><br><script><br> function showMsg() {<br> alert('hello');<br> } <br></script> <font color="#f44336">//一个Javascript函数<br></font><br><body><br> <h1>Hello world</h1><br> <a href="http://www.w3school.com.cn">This is a link</a><br> <p></p> <font color="#f44336"> //链接</font><br> <img src="/notice.jpg" onclick="showMsg();"/><br> <p></p> <font color="#f44336">//图片,点击图片弹出窗口显示hello</font><br> <video width="640" height="480" controls="controls"><br> <source src="/media/movie.mp4" type="video/mp4" /><br> </video> <font color="#f44336"> //定义的视频</font><br></body><br><br></html><br>
子主题
url介绍
带域(域口+端口)的绝对路径
<a href='http://www.otherdomain.com/upload/12/windows.iso'> Windows ISO 下载</a><br><img src='http://www.picturestore.com/user/fff/desk.jpg'><br>
不带域的绝对路径
<img src='/upload/12/3345.jpg'><br>
相对路径
<a href='iso/windows.iso'> Windows ISO 下载</a><br><img src='fff/desk.jpg'><br>
子主题
动态web网页
CGI
这种技术可以用任何的编程语言编写服务器端的程序,用于动态生成HTML文件。<font color="#ba68c8">search.exe</font> 对应的URL是<font color="#e57373"> </font><font color="#ba68c8">http://www.test.com/search.exe </font>就可以通过如同<font color="#e57373"> </font><font color="#ba68c8">http://www.test.com/search.exe?userid=1333</font> 的方式来查询用户id为 1333 的用户的订单。
PHP
<font color="#e57373">!!!</font>php作为动态页面生成技术,运行在服务器端,因此浏览器永远只能得到php运行后的结果,不可能得到php的源代码。
配置PHP
网站的根:DOCUMENT_ROOT
只能把php文件放在网站根对应的目录中。网站根之外的文件http服务器一般是不能访问的,或者说对浏览器是不可见的
网站根不是在php.ini中配置,而是在http服务器中配置。根据http服务器的不同,配置文件也不同。
php基础
第一个PHP程序
<h1>这是第一个程序</h1><br><br><h1><br> <?php<br> echo 'Hello world!';<br> ?><br><br></h1> //echo类似于c语言的print<br>
浏览器通过浏览器访问php页面时得到的时<font color="#ffcdd2">php运行后的结果</font>
php和html代码都混在一个文件里面,<font color="#ffcdd2">文件后缀是php</font>
标签<?php...?>来标注php代码的部分
php运行时会<font color="#ffcdd2">至上而下解析</font>,遇见非php代码按照原样返回给浏览器
遇到php代码部分,php代码打印结果会放在php代码所在位置
标签标注php代码
<h1>这是第二个程序</h1><br><br><?php<br>$str = 'Hello world!';<br>?><br><br><h1><br> <?= $str ?><br></h1>
<?= $str?> 是另外一段php的标注,这是简单的标注打印方式,和 <?php echo $str ?> 效果相同,但是更简单
一个PHP文件可以间隔穿插多个HTML代码和PHP代码,只需要使用标签说明那些是PHP代码
PHP缓冲区
因为PHP可以写HTTP协议的Head部分和Payload部分,而返回的HTML代码部分是在Payload部分当中的。因此有些写head缓冲区的函数必须放在HTML输出之前,例如 header 函数,set_cookie 函数等。
PHP语言特性
PHP没有一个编译成可执行文件(如EXE文件)的过程。PHP的源代码被PHP解析器直接运行,程序一行行按顺序运行。
PHP是动态语言(相对静态语言而言)。和静态语言C比较,PHP是若类型语言,变量声明可以不指定类型,变量的类型在运行的时候根据赋值的类型确定;同时PHP没有类是C的内存管理机制,不用关心内存回收的问题;PHP最有用的数据结构,数组,容量是可变的。
PHP程序的生命周期
一个php文件(程序)在收到request的时候被载入到内存中开始执行,一直到response后结束运行,被从内存中销毁,这就是PHP程序的生命周期。
当多次请求统一PHP程序的时候,每一次都是一个独立的运行,其中的变量会在每一次执行后销毁
要在一次请求后保持一些变量的值
子主题
把需要保存的变量进行持久化处理,例如存入到数据库,或者是写入文件
使用 Session 保存这些变量,有过期时间
使用cookie 保存这些变量,有过期时间
变量与常量
变量
$+变量名
变量名区分大小写
变量声明也可以不用指定类型,与c和Java不同
数据类型
标量类型
bool(布尔型)
int(整型)
float(浮点型,也称作double)
string(字符串)
复合类型
array(数组)
object(对象)
callable(可调用)不掌握
iterable(可迭代)不掌握
特殊类型
resource(资源)
NULL(无类型)
变量的变量
<?php<br>$a = 'hello';<br>$$a = 'world';<br>?><br>
引用赋值
<?php<br>$string1 = "mingribook"; //声明变量$string1<br>$string2 = $string1; //使用$string1来初始化$string2<br>$string1 = "mrbccd"; //改变变量$string1的值<br>echo $string2; //输出变量$string2的值<br>
变量作用域
全局与局部变量
<?php<br>$example = "在…………函数外"; //声明全局变量<br>function example()<br>{<br> $example = "……在函数内……"; //声明局部变量<br> echo "在函数内输出的内容是:$example.<br>"; //输出局部变量<br>}<br>example(); //调用函数,输出变量值<br>echo "在函数外输出的内容是:$example.<br>"; //输出全局变量<br>
这里两个 $example 变量,一个在函数外部(全局变量),一个在函数内部(局部变量),其实是两个不同的变量,虽然名字相同。
<?php<br>$hr = "黄蓉"; //声明全局变量$hr<br>function lxt()<br>{<br> $gj = "郭靖"; //声明局部变量$gj<br> echo $gj . "<br>"; //输出局部变量的值<br> global $hr; //利用关键字global在函数内部定义全局变量<br> echo $hr . "<br>"; //输出全局变量的值<br>}<br>lxt();<br>
全局变量的说明:全局变量可以在程序中的任何地方访问,但是在用户自定义函数内部是不可用的。想在用户自定义函数内部使用全局变量,要使用global关键字声明。
在函数内部声明全局变量的时候,不能同时对变量赋值,需要先申明,再赋值。
静态变量
静态变量的应用:在博客中使用静态变量记录浏览者的人数,每一次用户访问和离开时,都能够保留目前浏览者的人数。在聊天室中也可以用静态变量来记录用户的聊天内容。
可以把函数的静态变量作为全局变量来理解,只不过只能在函数内部是可见的。
检查与摧毁变量
isset 函数:判断一个变量是否已设置, 即变量已被声明,且其值不为 null。
unset 函数:销毁指定的变量
判断变量类型
is_array — 检测变量是否是数组<br>is_bool — 检测变量是否是布尔值<br>is_double — is_float 的别名<br>is_float — 检测变量是否是浮点型<br>is_int — 检测变量是否是整数<br>is_integer — is_int 的别名<br>is_long — is_int 的别名<br>is_null — 检测变量是否为 null<br>is_numeric — 检测变量是否为数字或数字字符串<br>is_object — 检测变量是否是一个对象<br>is_real — is_float 的别名<br>is_string — 检测变量是否是字符串<br>
自动类型转换
<?php<br>$foo = "1"; // $foo 是字符串 (ASCII 49)<br>$foo *= 2; // $foo 现在是一个整数 (2)<br>$foo = $foo * 1.3; // $foo 现在是一个浮点数 (2.6)<br>$foo = 5 * "10 Little Piggies"; // $foo 是整数 (50)<br>$foo = 5 * "10 Small Pigs"; // $foo 是整数 (50)<br>?><br>
强制类型转换
(int), (integer) - 转换为整形 int<br>(bool), (boolean) - 转换为布尔类型 bool<br>(float), (double), (real) - 转换为浮点型 float<br>(string) - 转换为字符串 string<br>(array) - 转换为数组 array<br>(object) - 转换为对象 object<br>(unset) - 转换为 NULL<br>
在要转换的变量之前加上用括号括起来的目标类型。<br><<br>
布尔值
当转换为 bool 时,以下值被认为是 false:<br>布尔值 false 本身<br>整型值 0(零)<br>浮点型值 0.0(零)-0.0(零)<br>空字符串,以及字符串 “0”<br>不包括任何元素的数组<br>特殊类型 NULL(包括尚未赋值的变量)<br>由无属性的空元素创建 SimpleXML 对象,也就是既没有子节点也没有属性的元素。<br>
所有其它值都被认为是 true(包括任何资源 和 NAN)。
预定义变量
__GET[ ]<br>__POST[ ]<br>__COOKIE[ ]<br>__SESSION[ ]<br>__FILES[ ]<br>上述的变量全部都是以数组的方式访问的<br>
常量
使用 const 关键字定义常量时,只能包含标量数据(bool、int、float 、string)。可以将常量定义为一个表达式,也可以定义为一个 array。
如果常量名是动态的,也可以用函数 constant() 来获取常量的值。用 get_defined_constants() 可以获得所有已定义的常量列表。
常量前面没有美元符号($);<br>常量可以不用理会变量的作用域而在任何地方定义和访问;<br>常量一旦定义就不能被重新定义或者取消定义;<br>常量只能计算标量值或数组。不掌握<br>
在面向过程中,定义常量使用 define() 函数,在类中使用 const 关键字定义。
预定义常量
TRUE<br>FALSE<br>NULL<br>
魔术常量
__LINE__ 文件中的当前行号。<br>__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。<br>__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。<br>
字符串
单引号字符串
<?php<br>echo 'this is a simple string';<br>// 可以录入多行<br>echo 'You can also have embedded newlines in<br>strings this way as it is<br>okay to do';<br>// 输出: Arnold once said: "I'll be back"<br>echo 'Arnold once said: "I\'ll be back"';<br>// 输出: You deleted C:\*.*?<br>echo 'You deleted C:\\*.*?';<br>// 输出: You deleted C:\*.*?<br>echo 'You deleted C:\*.*?';<br>// 输出: This will not expand: \n a newline<br>echo 'This will not expand: \n a newline';<br>// 输出: Variables do not $expand $either<br>echo 'Variables do not $expand $either';<br>?><br>
要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。<br>要表达一个反斜线自身,则用两个反斜线(\\)。<br>其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想<br>使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。
在单引号字符串中的变量和特殊字符的转义序列将不会被替换。
双引号字符串
如果字符串是包围在双引号(“)中, PHP 将对特殊的字符进行解析
字符串连接
字符串可以用 '.'(点)运算符连接起来,注意 '+'(加号)运算符没有这个功能。更多信息参考字符串运算符。
<?php<br>echo "00123.13"+"3445AB";<br>
结果为:3568.13
+为运算加法
字符串可以直接参与任何类型数值计算,php会自动先把字符串转换成合适的数值类型。
其他字符串操作函数
去掉字符串首尾的特殊字符:trim ltrim rtrim 函数,P83<br>转义、还原字符串数据:主要掌握 addslashes函数 P84<br>字符串长度:strlen 函数 P87<br>截取字符串:substr 函数 P89<br>格式化字符串格式化字符串:string_number_format 函数 P97<br>分割字符串:explode() 函数 P98<br>合成字符串:implode 函数 P99<br>
数组
array()
array(<br> key => value,<br> key2 => value2,<br> key3 => value3,<br> ...<br>)<br>
短数组语法对比
可以用短数组语法 [] 替代 array() 。<br><?php<br>$array = array(<br> "foo" => "bar",<br> "bar" => "foo",<br>);<br>// 使用短数组语法<br>$array = [<br> "foo" => "bar",<br> "bar" => "foo",<br>];<br>?><br>
<?php<br>$array = array(<br> 1 => 'a',<br> '1' => 'b', // 值 "a" 会被 "b" 覆盖<br> 1.5 => 'c', // 值 "b" 会被 "c" 覆盖<br> -1 => 'd',<br> '01' => 'e', // 由于这不是整数字符串,因此不会覆盖键名 1<br> '1.5' => 'f', // 由于这不是整数字符串,因此不会覆盖键名 1<br> true => 'g', // 值 "c" 会被 "g" 覆盖<br> false => 'h',<br> '' => 'i',<br> null => 'j', // 值 "i" 会被 "j" 覆盖<br> 'k', // 值 “k” 的键名被分配为 2。这是因为之前最大的整数键是 1<br> 2 => 'l', // 值 "k" 会被 "l" 覆盖<br>);<br>var_dump($array);<br>?><br>
输出:<br>array(7) {<br> [1]=><br> string(1) "g"<br> [-1]=><br> string(1) "d"<br> ["01"]=><br> string(1) "e"<br> ["1.5"]=><br> string(1) "f"<br> [0]=><br> string(1) "h"<br> [""]=><br> string(1) "j"<br> [2]=><br> string(1) "l"<br>}<br>
如果在数组定义时多个元素都使用相同键名,<br>那么只有最后一个会被使用,<br>其它的元素都会被覆盖。
PHP 数组可以同时含有 int 和 string 类型的键名,<br>因为 PHP 实际并不区分索引数组和关联数组。
数组单元可以通过 array[key] 语法来访问
<?php<br>$array = array(<br> "foo" => "bar",<br> 42 => 24,<br> "multi" => array(<br> "dimensional" => array(<br> "array" => "foo"<br> )<br> )<br>);<br>var_dump($array["foo"]);<br>var_dump($array[42]);<br>var_dump($array["multi"]["dimensional"]["array"]);<br>?><br>
结果:<br>string(3) "bar"<br>int(24)<br>string(3) "foo"<br>
用方括号的语法修改/新建
<?php<br>$arr = array(5 => 1, 12 => 2);<br>$arr[] = 56; // 这与 $arr[13] = 56 相同;<br> // 在脚本的这一点上<br>$arr["x"] = 42; // 添加一个新元素<br> // 键名使用 "x"<br>unset($arr[5]); // 从数组中删除元素<br>unset($arr); // 删除整个数组<br>?><br>
如上所述,如果给出方括号但没有指定键名,<br>则取当前最大 int 索引值,<br>新的键名将是该值加上 1(但是最小为 0)。<br>如果当前还没有 int 索引,则键名将为 0 。
数组操作函数
统计数组元素个数:P126<br>查询数组中指定元素:P127<br>获取数组中最后一个元素(数组堆栈使用):P128<br>向数组中添加元素(数组堆栈使用):P129<br>删除数组中重复元素:P129<br>
函数
PHP函数没有返回类型的说明,即使是没有返回也不能用void进行说明;<br>一个函数可以使用return返回,也可以不使用return返回;<br>函数可以返回任意类型的数据,同一函数因为条件不同,返回的类型可以不一致;<br>函数可以有缺省参数;<br>函数可以有值传递和引用传递,引用传递类似C的传指针;<br>变量函数是PHP的一个特点,可以使用类似变量的变量方式访问函数。<br>
php与页面交互
GET与POST方法
与FORM交互
文件上传与读写
文件上传
<font color="#f44336"><form enctype="multipart/form-data" action="" method="POST"></font><br> 选择上传文件 <input name="userfile" type="file" /><br> <input type="submit" value="上传" /> <font color="#e57373">//提交按钮</font><br></form><br><pre><br><?php<br>if (@$_FILES['userfile'] && @$_FILES['userfile']['error'] == 0) {<br> move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name']);<br> echo "上传成功!\n\n\n";<br> print_r($_FILES); <font color="#e57373">//解析文件</font><br>}<br>?><br></pre><br>
1
上传文件使用一个form,上传控件使用 type 为 file 的input 控件,当然,我们还需要一个提交按钮
注意form中 enctype 这个属性是必须的
action 为空表示上传的URL就是当前页面的URL
上传一个文件后,所有form内的控件内容会通过post方法提交到url指定的页面;
PHP的超级变量$_FILES 中有所有上传文件的内容,我们通过print_r看看这个数组中有什么
$FILES数组
$_FILES 数组是一个二维数组,包含了上传文件的所有信息
其中[userfile]是一个文件信息的一维数组,<br>对应的名称是HTML中设置的上传控件
name:上传文件的原始文件名
type表示上传文件的类型,这个类型是一个MIME表述字符串
tmp_name是上传文件的临时文件,这个位置一般在php.ini文件中设置,或者使用操作系统的临时文件目录;
error表示上传是否有错误,没有错误是0;
size是上传文件的大小
move_uploaded_file
把上传的临时文件移动到相应的位置,同时需要对文件名改名
因为临时文件是不需要有扩展名的,而最后保存最好加上文件名。如果上传的文件需要长久的保存,使用 move_uploaded_file 函数是必须的,因为临时文件会被系统定期清理
两个参数
参数1:临时文件的绝路路径,这里使用 $_FILES['userfile']['tmp_name'] 就可以得到
参数2:要移动到的目标位置和文件名:例子中我们使用了文件的原始文件名 $_FILES['userfile']['name'] 没有加路径。这是一个相对路径表达方式,意思是和当前php文件在一个路径下。当然你也可以使用其他路径,并改变文件名
使用文件的原始文件名并不是个好注意。因为如果新上传的文件和以前的文件同名,可能会覆盖以前的文件。所以可以考虑使用一个唯一的文件名来存放。
使用绝对路径,但是同样不是一个好注意,会给你程序的交付带来麻烦。例如你的程序需要安装到另外一台服务器,绝对路径可能和现有服务器有很大差别。
如何生成唯一的文件名?有很多方式,可以使用时间,或者是一个叫做 uniqid 的函数。另外,需要获取上传文件的扩展名有很多方法,扩展名前面是‘.’可以使用 explode 来把文件名字符串拆分成数组,数组的最后一个元素就是扩展名。
文件读写
file函数
<pre><br><?php<br>$lines = file('file.txt');<br>print_r($lines);<br>?><br></pre><br>
读取一个文本文件到数组
读取并显示csv文件
<?php<br>// 读取csv到一个数组<br>$lines = file('list.csv');<br>// 生成二维数组<br>$csv = array();<br>foreach ($lines as $line) {<br> $csv[] = explode(',', $line);<br>}<br>?><br><table border="1"><br> <?php<br> foreach ($csv as $cols) {<br> ?><br> <tr><br> <?php<br> foreach ($cols as $col) {<br> ?><br> <td><br> <?= $col ?><br> </td><br> <?php<br> }<br> ?><br> </tr><br> <?php<br> }<br> ?><br></table><br>
两个嵌套循环的写法,循环中又有HTML代码,又有PHP代码
json格式
JSON是一种轻量级的数据交换格式
通过浏览器提交一个留言,在 msg 目录中得到一个Json文件
{<br> "user": "Danny",<br> "sex": "\u7537",<br> "email": "127@mail.com",<br> "edu": "\u672c\u79d1",<br> "hobby": [<br> "\u7535\u8111"<br> ],<br> "msg": "\u8fd9\u662f\u6211\u7684\u7b2c\u4e00\u4e2a\u7559\u8a00"<br>}<br>
读取JSON文件
<pre><br><?php<br>$msgDir = 'msg';<br>$fileList = scandir($msgDir);<br>$i = 1;<br>foreach ($fileList as $fname) {<br> $fileName = $msgDir . '/' . $fname; // 文件的相对路径+文件名<br> if (is_dir($fileName)) continue; // 判断文件是不是目录<br> if (substr($fname, -4) != 'json') continue; // 判断文件后缀名<br> $jsonStr = file_get_contents($fileName);<br> $msg = json_decode($jsonStr);<br> echo "------------------第 $i 个留言---------------------\n";<br> print_r($msg);<br> $i++;<br>}<br>?><br></pre><br>
json_decode 返回的数据类型不是array,而是stdClass Object(一个对象)。你不能像使用数组一样使用对象,例如:$msg['user']是不正确的,应该换成 $msg→user 来取值;
如果要解码成数组,使用 json_decode($jsonStr, true)
Cookie与Session
HTTP的非保持连接状态
Cookie
<!-- 如何保存用户的状态 --><br><?php<br>if (@$_POST['user']){<br> setcookie("user", $_POST['user']);<br> setcookie('pwd', $_POST['pwd']);<br>}<br>?><br><form name="form1" method="post"><br> <table width="323" border="1" cellpadding="1" cellspacing="1" bordercolor="#66CC33" bgcolor="#FFFFFF"><br> <tr><br> <td width="118" height="24" align="right" bgcolor="#CCFF33">用户名:</td><br> <td width="192" height="24" bgcolor="#CCFF33"><input name="user" type="text" class="inputcss" id="user" size="24"></td><br> </tr><br> <tr><br> <td height="24" align="right" bgcolor="#CCFF33">密&nbsp;&nbsp;码:</td><br> <td height="24" bgcolor="#CCFF33"><input name="pwd" type="password" class="inputcss" id="pwd" size="24"></td><br> </tr><br> <tr align="center" bgcolor="#CCFF33"><br> <td height="24" colspan="2"><input name="submit" type="submit" value="登录"></td><br> </tr><br> </table><br></form><br><pre><br><?php<br>print_r($_COOKIE);<br>?><br></pre><br>
使用GET请求
使用POST方法发送用户名和密码给服务器。这时,4、5行代码执行
user
pwd
使用GET方法访问
两种基本属性
域
路径
时效性
有效期是cookie可以存活到将来的一个时间,如果超过这个时间,cookie就会被浏览器删除。这种机制进一步保证安全性,例如有些网站,如果你停止刷新,过了一段时间再访问就需要重新鉴权。
可以通过cooke来存放用户名和密码
Session
时效性
这个时间在php.ini中进行设置。<br>时间一到,session就会从服务器删除。<br>session的好处就是关键信息保存在服务器,进一步提升了安全性。
在PHP种使用session
<?php<br>session_start();<br>if (@$_POST['user']) {<br> $_SESSION['user'] = $_POST['user'];<br> $_SESSION['pass'] = $_POST['pwd'];<br>}<br>?><br>
鉴别客户的页面第一行用 session_start()
使用Session
用户登录
<?php<br>@session_start();<br>if (!$_SESSION['uid']){<br> header('Location:login.php');<br>}<br>?><br>
使用 session_start 函数开启session,然后你就可以对session进行读写操作了
检测seesion中是否有键名为uid的值
如果uid这个值没有,那么使用 header 函数生成一个http头的重定向url。当浏览器读取到这个重定向后,立即刷新到重定向指定的url(通过get方法),这里就是登陆页面 login.php。跳转中的url是一个相对路径
header函数必须在任何HTML输出前使用
登录用户才能访问的网站
<?php<br>include_once('_protected.php');<br>?><br><h1>这里是需要登陆才能访问的页面</h1><br><h2>欢迎你:<?= $_SESSION['name'] ?></h2><br><h2>你的用户ID是:<?= $_SESSION['uid'] ?></h2><br><a href="_doLogout.php">退出登陆--注销</a><br>
include_once 函数包含了 _protected.php 文件进来。
如果未登录 _protected.php 检测 $_SESSION[uid] 为假,会重新定向到 login.php 页面
如果登录了,就显示 Session 的用户信息
退出用户界面
<?php<br>session_start();<br>session_destroy();<br>header('Location:login.php');<br>?><br>
直接使用 session_destroy 函数销毁 session ,并重定向到 login.php 页面
已经登录通过url进入
<?php<br>session_start();<br>if ($_SESSION['uid']){<br> header('Location:user.php');<br>}<br>?><br>
面向对象编程
类的定义与使用
<?php<br> class SportObject<br> {<br> public $name; //定义成员变量<br> public $height; //定义成员变量<br> public $avoirdupois; //定义成员变量<br> public function bootFootBall($name, $height, $avoirdupois)<br> { //声明成员方法<br> $this->name = $name;<br> $this->height = $height;<br> $this->avoirdupois = $avoirdupois;<br> if ($this->height < 185 and $this->avoirdupois < 85) {<br> return $this->name . ",符合踢足球的要求!"; //方法实现的功能<br> } else {<br> return $this->name . ",不符合踢足球的要求!"; //方法实现的功能<br> }<br> }<br> }<br> $sport = new SportObject(); //实例化类,并传递参数<br> echo $sport->bootFootBall('明日', '185', '80'); //执行类中的方法<br> ?><br>
$this→name 这个整体表示一个成员变量,不能写成 $this→$this。
如果在当前的代码块中,不存在和成员变量同名的局部变量,那么 $this 是可以省略的
类中的常量
<?php<br><br>class SportObject<br>{<br> <font color="#e57373">const</font> BOOK_TYPE = '计算机图书';<br> public $object_name; //图书名称<br> function setObjectName($name)<br> { //声明方法setObjectName()<br> $this->object_name = $name; //设置成员变量值<br> }<br> function getObjectName()<br> { //声明方法getObjectName()<br> return $this->object_name;<br> }<br>}<br><br>$c_book = new SportObject(); //实例化对象<br>$c_book->setObjectName("PHP类"); //调用方法setObjectName<br>echo SportObject::BOOK_TYPE . "->"; //输出常量BOOK_TYPE<br>echo $c_book->getObjectName(); //调用方法getObjectName<br>
类中的常量定义和普通常量(非类常量)的定义是不一样的
常量的调用使用 <font color="#e57373">类名::常量名</font>;这个语法结构需要注意,类名前面没有$的符号,因为类本身不是一个实体,而是一个抽象的定义
构造函数
<?php<br>class SportObject<br>{<br> public $name; //定义成员变量<br> public $height; //定义成员变量<br> public $avoirdupois; //定义成员变量<br> public $age; //定义成员变量<br> public $sex; //定义成员变量<br> public function __construct($name, $height, $avoirdupois, $age, $sex)<br> { //定义构造方法<br> $this->name = $name; //为成员变量赋值<br> $this->height = $height; //为成员变量赋值<br> $this->avoirdupois = $avoirdupois; //为成员变量赋值<br> $this->age = $age; //为成员变量赋值<br> $this->sex = $sex; //为成员变量赋值<br> }<br> public function bootFootBall()<br> { //声明成员方法<br> if ($this->height < 185 and $this->avoirdupois < 85) {<br> return $this->name . ",符合踢足球的要求!"; //方法实现的功能<br> } else {<br> return $this->name . ",不符合踢足球的要求!"; //方法实现的功能<br> }<br> }<br>}<br>$sport = new SportObject('明日', '185', '80', '20', '男'); //实例化类,并传递参数<br>echo $sport->bootFootBall(); //执行类中的方法
构造函数和普通函数一样,可以有缺省参数
老版本的PHP可以使用与类名相同的函数名来作为构造函数(类似Java的方式),新版本的PHP已经不推荐,并有可能出现一些问题
析构函数
析构的含义是在对象被销毁前调用的最后一个函数,用于进行一些善后处理
<?php<br>class SportObject<br>{<br> public $name; //定义成员变量<br> public $height; //定义成员变量<br> public $avoirdupois; //定义成员变量<br> public $age; //定义成员变量<br> public $sex; //定义成员变量<br> public function __construct($name, $height, $avoirdupois, $age, $sex)<br> { //定义构造方法<br> $this->name = $name; //为成员变量赋值<br> $this->height = $height; //为成员变量赋值<br> $this->avoirdupois = $avoirdupois; //为成员变量赋值<br> $this->age = $age; //为成员变量赋值<br> $this->sex = $sex; //为成员变量赋值<br> }<br> public function bootFootBall()<br> { //声明成员方法<br> if ($this->height < 185 and $this->avoirdupois < 85) {<br> return $this->name . ",符合踢足球的要求!"; //方法实现的功能<br> } else {<br> return $this->name . ",不符合踢足球的要求!"; //方法实现的功能<br> }<br> }<br> function __destruct()<br> {<br> echo "<p><b>对象被销毁,调用析构函数。</b></p>";<br> }<br>}<br>$sport = new SportObject('明日', '185', '80', '20', '男'); //实例化类,并传递参数<br>//unset($sport);<br>
要销毁一个对象,可以像销毁一个变量一样,使用 unset 函数
继承和多态
子类型的定义使用 extends 关键字
<?php<br><br>/* 父类 */<br>class SportObject<br>{<br> public $name; //定义姓名成员变量<br> public $age; //定义年龄成员变量<br> public $avoirdupois; //定义体重成员变量<br> public $sex; //定义性别成员变量<br><br> public function __construct($name, $age, $avoirdupois, $sex)<br> { //定义构造方法<br> $this->name = $name; //为成员变量赋值<br> $this->age = $age; //为成员变量赋值<br> $this->avoirdupois = $avoirdupois; //为成员变量赋值<br> $this->sex = $sex; //为成员变量赋值<br> }<br><br> function showMe()<br> { //定义方法<br> echo '这句话不会显示。';<br> }<br>}<br><br>/* 子类BeatBasketBall */<br>class BeatBasketBall extends SportObject<br>{ //定义子类,继承父类<br> public $height; //定义身高成员变量<br><br> function __construct($name, $height)<br> { //定义构造方法<br> $this->height = $height; //为成员变量赋值<br> $this->name = $name; //为成员变量赋值<br> }<br><br> function showMe()<br> { //定义方法<br> if ($this->height > 185) {<br> return $this->name . ",符合打篮球的要求!"; //方法实现的功能<br> } else {<br> return $this->name . ",不符合打篮球的要求!"; //方法实现的功能<br> }<br> }<br>}
$this 与 get_class
<?php<br>class example<br>{<br> function exam()<br> {<br> if (isset($this)) {<br> echo '$this的值为:' . get_class($this);<br> } else {<br> echo '$this未定义';<br> }<br> }<br>}<br>$class_name = new example();<br>$class_name->exam();<br>?><br>
get_class 返回一个对象所属类型的字符串,<br>如果参数中描述的变量不是对象,返回 false
范围解析操作符(::)
可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。<br>当在类定义之外引用到这些项目时,要使用类名。<br>可以通过变量来引用类,该变量的值不能是关键字(如 self,parent 和 static)
<?php<br>class Book<br>{<br> const NAME = 'computer'; //常量NAME<br> function __construct()<br> { //构造方法<br> echo '本月图书类冠军为:' . Book::NAME . ' '; //输出默认值<br> }<br>}<br>echo Book::NAME;<br>
操作用在类的内部,分别用来调用类<br>中的静态变量和父类的构造方法。
注意:常量是类的一个属性,并不是对象特有的;类是一个抽象定义,前面不能使用$,否则就是变量了。
访问控制修饰
public:公开,任何外部或者是子类型都可以访问;<br>private:私有,只能本类型访问;<br>protected:本类型和子类型访问<br>
没有修饰则为public
静态方法和静态变量
类外部调用使用 类名::静态成员;<br>类内部调用使用 self::静态成员<br>
final关键词
被修饰的类不能扩展子类;<br>被修饰的方法不能在子类中覆盖<br>
对象类型检测
<?php<br> class SportObject<br> {<br> }<br> class MyBook extends SportObject<br> {<br> private $type;<br> }<br> $cBook = new MyBook();<br> if ($cBook instanceof MyBook)<br> echo '对象$cBook属于MyBook类<br>';<br> if ($cBook instanceof SportObject)<br> echo '对象$cBook属于SportObject类<br>';<br>
魔术方法
_ _set()和_ _get()方法
在给不可访问(protected 或 private)或不存在的属性赋值时,_ _set() 会被调用
读取不可访问(protected 或 private)或不存在的属性的值时,_ _get() 会被调用
public function __get($name)<br> {<br> if (isset($this->$name)) {<br> echo '变量' . $name . '的值为:' . $this->$name . '<br>';<br> } else {<br> echo '变量' . $name . '未定义,初始化为0<br>';<br> $this->$name = 100;<br> }<br> }<br> public function __set($name, $value)<br> {<br> if (isset($this->$name)) {<br> $this->$name = $value;<br> echo '变量' . $name . '赋值为:' . $value . '<br>';<br> } else {<br> $this->$name = $value;<br> echo '变量' . $name . '被初始化为:' . $value . '<br>';<br> }<br> }<br>
属性重载只能在对象中进行。在静态方法中,<br>这些魔术方法将不会被调用。所以这些方法<br>都不能被 声明为 static
访问了一个不存在的类成员变量,这时14行输出;<br>通过15行对一个不存在的变量进行赋值(写操作)<br>会触发_ _set 函数
_ _call()方法
在对象中调用一个不可访问方法时,_ _call() 会被调用
<?php<br>class SportObject<br>{<br> public function myDream()<br> {<br> echo '调用的方法存在,直接执行此方法。MyDream<p>';<br> }<br> public function __call($method, $parameter)<br> {<br> echo '如果方法不存在,则执行__call()方法。<br>';<br> echo '方法名为:' . $method . '<br>';<br> echo '参数有:';<br> var_dump($parameter);<br> }<br>}<br>$MyLife = new SportObject();<br>$MyLife->myDream();<br>$MyLife->mDream('how', 'what', 'why');<br>
数据库应用
数据库实体关系
一对一
一对多
两张表
关系建在多中
多对多
三张表
关系加一张表
数据库维护
基于web的管理
导入数据库
在 HeidiSQL 中使用 文件→运行SQL文件 可以<br>加载一个数据库脚本,并运行
使用函数访问数据库
数据查询
<?php<br>if (!$conn = mysqli_connect("127.0.0.1", "root", "123456", "db_database18")) {<br> echo '数据库连接错误';<br>}<br>mysqli_query($conn, "set names utf8"); //设置数据库编码格式utf8<br>
数据插入
<form name="intFrom" method="post" action="index_ok.php"><br> <table width="60%" border="1"><br> <tr><br> <td>书名:</td><br> <td><input type="text" name="bookname"></td><br> </tr><br> <td colspan="2"><br> <input type="hidden" name="action" value="insert"><br> <input type="submit" name="Submit" value="添加"><br> <input type="reset" name="reset" value="重置"><br> </td><br> </tr><br> </table><br></form><br>
数据更新
update
<?php<br>include_once("conn.php");<br>?><br><table width="60%" border="1"><br> <tr><br> <td width="5%">id</td><br> <td width="30%">书名</td><br> <td width="10%">价格</td><br> <td width="20%">出版时间</td><br> <td width="10%">类别</td><br> <td width="10%">操作</td><br> </tr><br> <?php<br> $sqlstr = "select * from tb_demo02 order by id";<br> $result = mysqli_query($conn, $sqlstr);<br> while ($rows = mysqli_fetch_row($result)) {<br> ?><br> <tr><br> <?php<br> for ($i = 0; $i < count($rows); $i++) {<br> ?><br> <td><?= $rows[$i] ?></td><br> <?php<br> }<br> ?><br> <td><a href='update_form.php?action=update&id=<?= $rows[0] ?>'>修改</a></td><br> </tr><br> <?php<br> }<br> ?><br></table><br>
<?php<br>include_once("conn.php"); //包含数据库连接文件<br>if ($_GET['action'] == "update") { //判断地址栏参数action的值是否等于update<br> $sqlstr = "select * from tb_demo02 where id = " . $_GET['id']; //定义查询语句<br> $result = mysqli_query($conn, $sqlstr); //执行查询语句<br> $rows = mysqli_fetch_row($result); //将查询结果返回为数组<br>?><br> <form name="intFrom" method="post" action="update_ok.php"><br> <table border="1"><br> <tr><br> <td align="right">书名:</td><br> <td><input type="text" name="bookname" value="<?php echo $rows[1] ?>"></td><br> </tr><br> <td colspan="2"><br> <input type="hidden" name="action" value="update"><br> <input type="hidden" name="id" value="<?php echo $rows[0] ?>"><br> <input type="submit" name="Submit" value="修改"><br> <input type="reset" name="reset" value="重置"><br> </td><br> </tr><br> </table><br> </form><br><?php<br>}<br>?><br>
数据删除
<script><br> //删除确认<br> function del() {<br> if (!window.confirm('是否要删除数据??'))<br> return false;<br> }<br> //全部选择/取消<br> function chek() {<br> debugger;<br> var leng = this.form1.chk.length;<br> if (leng == undefined) {<br> leng = 1;<br> if (!form1.chk.checked)<br> document.form1.chk.checked = true;<br> else<br> document.form1.chk.checked = false;<br> } else {<br> for (var i = 0; i < leng; i++) {<br> if (!form1.chk[i].checked)<br> document.form1.chk[i].checked = true;<br> else<br> document.form1.chk[i].checked = false;<br> }<br> }<br> return false;<br> }<br></script><br><br><?php<br>include_once("conn.php");<br>?><br><table border="1"><br> <form name="form1" id="form1" method="post" action="delete.php"><br> <tr><br> <td>&nbsp;</td><br> <td>id</td><br> <td>书名</td><br> <td>价格</td><br> <td>出版时间</td><br> <td>类别</td><br> </tr><br> <?php<br> $sqlstr1 = "select * from tb_demo02 order by id";<br> $result = mysqli_query($conn, $sqlstr1);<br> while ($rows = mysqli_fetch_row($result)) {<br> ?><br> <tr><br> <td><br> <input type=checkbox name='chk[]' id='chk' value=<?= $rows[0] ?>><br> </td><br> <?php<br> for ($i = 0; $i < count($rows); $i++) {<br> ?><br> <td><?= $rows[$i] ?></td><br> <?php<br> }<br> ?><br> <?php<br> }<br> ?><br> <tr><br> <td colspan="6"><br> <a href="" onClick="return chek();">全部选择/取消</a>&nbsp;&nbsp;<br> <input type="hidden" name="action" value="delall"><br> <input type="submit" value="删除选择" onclick='return del();'>&nbsp;&nbsp;<br> </td><br> </tr><br> </form><br></table><br>
<?php<br>include_once("conn.php"); //连接数据库<br>if ($_POST['action'] == "delall") { //判断是否执行删除操作<br> if (count($_POST['chk']) <= 0) { //判断提交的删除记录是否为空<br> echo "<script>alert('请选择记录');history.go(-1);</script>";<br> } else {<br> for ($i = 0; $i < count($_POST['chk']); $i++) { //for语句循环读取复选框提交的值,<br> $sqlstr = "delete from tb_demo02 where id = " . $_POST['chk'][$i]; //循环执行删除操作<br> mysqli_query($conn, $sqlstr); //执行删除操作<br> }<br> echo "<script>alert('删除成功');location='delete_list.php';</script>";<br> }<br>}<br>
PDO数据抽象层
查询
$dsn = "$dbms:host=$host;dbname=$dbName";<br> try {<br> $pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo<br> $query = "select * from tb_pdo_mysql"; //定义SQL语句<br> $result = $pdo->prepare($query); //准备查询语句<br> $result->execute(); //执行查询语句,并返回结果集<br> while ($res = $result->fetch(PDO::FETCH_ASSOC)) { //while循环输出查询结果集,并且设置结果集的为关联索引<br> ?><br>
生成了一个叫做dsn的字符串,这个字符串是说<br>明所连接数据库服务器的类型、主机地址、数据<br>库(选择的数据库)等信息的
建立一个数据库连接
准备SQL查询字符串,并在对象上面调用prepare<br>函数执行SQL;prepare返回的是一个准备好的<br>SQL执行对象,需要在该对象上调用execute真正<br>执行sql;执行完sql后,可以在prepare返回的的<br>对象上面使用fetch方法逐个提取行
fetch
PDO::FETCH_ASSOC:关联数组<br>PDO::FETCH_NUM:索引数组<br>PDO::FETCH_BOTH :关联数组和索引数组<br>PDO::FETCH_OBJ:对象<br>
插入数据
使用命名参数的方式
$dsn = "$dbms:host=$host;dbname=$dbName;port=3306";<br> $pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo<br> $query = "insert into tb_pdo_mysql(pdo_type,database_name,dates)values(:pdo, :name, :date)";<br> $result = $pdo->prepare($query);<br> $result->execute(array(<br> ':pdo' => $_POST['pdo'],<br> ':name' => $_POST['databases'],<br> ':date' => $_POST['dates']<br> ));<br> $code = $result->errorCode();<br> echo "error code:" . $code . "<br>";<br> if ($code == 0) {<br> echo "数据添加成功!";<br> } else {<br> echo '数据库错误:<br/>';<br> echo 'SQL Query:' . $query;<br> echo '<pre>';<br> var_dump($result->errorInfo());<br> echo '</pre>';<br> }<br>}<br>
使用索引数组的方式
$dsn = "$dbms:host=$host;dbname=$dbName;port=3306";<br> $pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo<br> $query = "insert into tb_pdo_mysql(pdo_type,database_name,dates)values(?, ?, ?)";<br> $result = $pdo->prepare($query);<br> $result->execute(array(<br> $_POST['pdo'],<br> $_POST['databases'],<br> $_POST['dates']<br> ));<br> $code = $result->errorCode();<br> echo "error code:" . $code . "<br>";<br> if ($code == 0) {<br> echo "数据添加成功!";<br> } else {<br> echo '数据库错误:<br/>';<br> echo 'SQL Query:' . $query;<br> echo '<pre>';<br> var_dump($result->errorInfo());<br> echo '</pre>';<br> }<br>
删除和修改
0 条评论
下一页