PHP学习-大鹏
2019-12-04 14:52:52 14 举报
AI智能生成
大家学习交流,支持的点赞即可
作者其他创作
大纲/内容
PHP的介绍
PHP的定义
超文本预处理器
PHP引擎 zend<br>
PHP语法
XML风格
<?php .... ?><br>
简短风格<br>
<? ...... ?><br>
ASP风格
<% ...... %><br>
javascript脚本风格<br>
<javascript language='php'> .... </javascript><br>
PHP作用
加载动态(可能变化数据)页面<br>
和数据库进行交互
生成图片(水印图片)
文件操作
。。。
PHP关于空格的说明
PHP空格只有一个空格起作用,一般是用来使代码看起来整洁,php换行也是不起作用的,用来规整PHP的代码
PHP注释
单行注释 #<br>
单行注释 //<br>
多行注释 /* ..... */ 多行注释,不能嵌套<br>
数据类型
标量
整型
int 有无符号的整数,就是正或者负的整数<br>
浮点数
float 带有小数点的值<br>
字符串
string 单双定界符来定义的值<br>
单引号定义,不解析变量和其他值,只输出字符串
双引号定义,解析变量和其他值,在字符串中可以使用大括号来包裹变量,防止变量解析错误,大括号中可以输出数组的下标的值
定界符定义:以<<<和指定字符开始,然后以指定字符结束,中间可以输出字符串<br>
单双引号使用是注意嵌套
布尔值
boolean true/false<br>
啥为false
整型的0<br>
浮点数的 0.0<br>
字符串的空字符串 '' ""<br>
字符串的'0'
空数组<br>
空(NULL)
复合
数组array
索引数组<br>
下标为整形的值,后边=>执行具体的值<br>
关联数组
下标是字符串(键名),后边跟键值 $key=>$value<br>
多维数组<br>
有关联数组和索引数组混合组成的数组
对象object
类实例化之后就是对象
特殊
资源resource
外部引入的文件,或者数据库连接
空
NULL
流程控制
分支语句
if <br>
switch
循环语句
for
foreach
while
do while<br>
循环控制<br>
break结束循环
continue跳过本次循环
变量和常量
变量
定义:以$符号开始,后面跟一个字母或者下划线,然后后边跟任意字母、数字、下划线
例子:$a = 10;<br>
赋值<br>
传值赋值
传址赋值
&符号,两个变量公用一个地址,一个修改,另一个也修改
可变变量<br>
定义:用一个变量的值来当作另一个变量的变量名
$a = 'hello';$$a='world';$hello = 'world';<br>
外部变量
$_GET获取url传参
$_POST获取form表单post方式的传参<br>
$_REQUEST获取get或者post的传参
$_COOKIE获取cookie的值<br>
$GLOBALS全局变量
$_SERVER获取服务器端的信息
$_SESSION获取session的值
静态变量
用static来声明静态变量,静态变量在第一次初始化后就不会再被初始化<br>
在函数中,第一次调用函数被初始化,之后都不会被初始化<br>
类中,类文件加载之后就会被初始化,可以直接通过类名来调用<br>
变量函数
isset()变量是否存在,存在返回true
empty()变量是否为空,这里只能使用字符串,其他类型会报错,为空返回true
unset()删除变量地址,空间被销毁,垃圾回收
常量
定义:定义常量必须要define()方法,常量通常全部大写,以字母下划线开头,后边跟任意字母数字下划线<br>
检测常量是否存在,defined(),<br>
系统常量<br>
PHP_OS获取服务器系统的版本号
PHP_VERSION获取php的版本号
魔术常量
__FILE__ 获取当前php文件的物理路径<br>
__DIR__ 获取当前php文件所在文件夹的物理路径<br>
__LINE__ 获取当前行号<br>
__FUNCTION__ 获取函数名,只能在函数中使用<br>
__CLASS__ 获取当前类的名称<br>
__METHOD__ 获取当前类方法的名称<br>
常量定义时必须赋值,只能赋值标量
输出
echo可以输出一个或者多个字符串或者数字
print只能输出一个字符串或者数字, 有返回值,成功,返1,false,返0. <br>
print_r打印关于变量的易于理解的信息。
printf
var_dump 函数作用是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型.
运算符
算术运算符<br>
加减乘除模
自增自减运算符
++ -- <br>
比较运算符
大于、小于、等于、全等于、全不等于、大于等于、小于等于、不等于(小于大于)
逻辑运算符
与或非
与 and && &<br>
或 or || |<br>
非 !<br>
三目运算符
(条件)? 真返回值 : 假返回值;<br>
赋值运算符
+=加等于,左边的值和右边的值相加,然后赋值给左边<br>
-=减等于,左边的值和右边的值相减,然后赋值给左边
*=乘等于,左边的值和右边的值相乘,然后赋值给左边
/=除等于,左边的值和右边的值相除,然后赋值给左边
%=模等于,左边的值和右边的值相模,然后赋值给左边
=右边赋值给左边
.=点等于,左边的值和右边的值相连,然后赋值给左边
其他运算符
. 用来字符串拼接<br>
会话
HTTP协议<br>
错误码
错误码1开头
<div class="para">100 Continue</div>
<td><div class="para">服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。</div>
</td><td><div class="para">101 Switching Protocols</div>
</td><div class="para">服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。</div>
错误码2开头
<div class="para">200 OK</div>
<td><div class="para">请求成功(其后是对GET和POST请求的应答文档。)</div>
</td><tr><td><div class="para">201 Created</div>
</td><td><div class="para">请求被创建完成,同时新的资源被创建。</div>
</td></tr><tr><td><div class="para">202 Accepted</div>
</td><td><div class="para">供处理的请求已被接受,但是处理未完成。</div>
</td></tr><tr><td><div class="para">203 Non-authoritative Information</div>
</td><td><div class="para">文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。</div>
</td></tr><tr><td><div class="para">204 No Content</div>
</td><td><div class="para">没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。</div>
</td></tr><tr><td><div class="para">205 Reset Content</div>
</td><td><div class="para">没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。</div>
</td></tr><td><div class="para">206 Partial Content</div>
</td><div class="para">客户发送了一个带有Range头的GET请求,服务器完成了它。</div>
错误码3开头
<div class="para">300 Multiple Choices</div>
<td><div class="para">多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。</div>
</td><tr><td><div class="para">301 Moved Permanently</div>
</td><td><div class="para">所请求的页面已经转移至新的url。</div>
</td></tr><tr><td><div class="para">302 Found</div>
</td><td><div class="para">所请求的页面已经临时转移至新的url。</div>
</td></tr><tr><td><div class="para">303 See Other</div>
</td><td><div class="para">所请求的页面可在别的url下被找到。</div>
</td></tr><tr><td><div class="para">304 Not Modified</div>
</td><td><div class="para">未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。</div>
</td></tr><tr><td><div class="para">305 Use Proxy</div>
</td><td><div class="para">客户请求的文档应该通过Location头所指明的代理服务器提取。</div>
</td></tr><tr><td><div class="para">306 <i>Unused</i></div>
</td><td><div class="para">此代码被用于前一版本。目前已不再使用,但是代码依然被保留。</div>
</td></tr><td><div class="para">307 Temporary Redirect</div>
</td><div class="para">被请求的页面已经临时移至新的url。</div>
错误码4开头
<div class="para">400 Bad Request</div>
<td><div class="para">服务器未能理解请求。</div>
</td><tr><td><div class="para">401 Unauthorized</div>
</td><td><div class="para">被请求的页面需要用户名和密码。</div>
</td></tr><tr><td><div class="para">401.1</div>
</td><td><div class="para">登录失败。</div>
</td></tr><tr><td><div class="para">401.2</div>
</td><td><div class="para">服务器配置导致登录失败。</div>
</td></tr><tr><td><div class="para">401.3</div>
</td><td><div class="para">由于 ACL 对资源的限制而未获得授权。</div>
</td></tr><tr><td><div class="para">401.4</div>
</td><td><div class="para">筛选器授权失败。</div>
</td></tr><tr><td><div class="para">401.5</div>
</td><td><div class="para">ISAPI/CGI 应用程序授权失败。</div>
</td></tr><tr><td><div class="para">401.7</div>
</td><td><div class="para">访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。</div>
</td></tr><tr><td><div class="para">402 Payment Required</div>
</td><td><div class="para">此代码尚无法使用。</div>
</td></tr><tr><td><div class="para">403 Forbidden</div>
</td><td><div class="para">对被请求页面的访问被禁止。</div>
</td></tr><tr><td><div class="para">403.1</div>
</td><td><div class="para">执行访问被禁止。</div>
</td></tr><tr><td><div class="para">403.2</div>
</td><td><div class="para">读访问被禁止。</div>
</td></tr><tr><td><div class="para">403.3</div>
</td><td><div class="para">写访问被禁止。</div>
</td></tr><tr><td><div class="para">403.4</div>
</td><td><div class="para">要求 SSL。</div>
</td></tr><tr><td><div class="para">403.5</div>
</td><td><div class="para">要求 SSL 128。</div>
</td></tr><tr><td><div class="para">403.6</div>
</td><td><div class="para">IP 地址被拒绝。</div>
</td></tr><tr><td><div class="para">403.7</div>
</td><td><div class="para">要求客户端证书。</div>
</td></tr><tr><td><div class="para">403.8</div>
</td><td><div class="para">站点访问被拒绝。</div>
</td></tr><tr><td><div class="para">403.9</div>
</td><td><div class="para">用户数过多。</div>
</td></tr><tr><td><div class="para">403.10</div>
</td><td><div class="para">配置无效。</div>
</td></tr><tr><td><div class="para">403.11</div>
</td><td><div class="para">密码更改。</div>
</td></tr><tr><td><div class="para">403.12</div>
</td><td><div class="para">拒绝访问映射表。</div>
</td></tr><tr><td><div class="para">403.13</div>
</td><td><div class="para">客户端证书被吊销。</div>
</td></tr><tr><td><div class="para">403.14</div>
</td><td><div class="para">拒绝目录列表。</div>
</td></tr><tr><td><div class="para">403.15</div>
</td><td><div class="para">超出客户端访问许可。</div>
</td></tr><tr><td><div class="para">403.16</div>
</td><td><div class="para">客户端证书不受信任或无效。</div>
</td></tr><tr><td><div class="para">403.17</div>
</td><td><div class="para">客户端证书已过期或尚未生效。</div>
</td></tr><tr><td><div class="para">403.18</div>
</td><td><div class="para">在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。</div>
</td></tr><tr><td><div class="para">403.19</div>
</td><td><div class="para">不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。</div>
</td></tr><tr><td><div class="para">403.20</div>
</td><td><div class="para">Passport 登录失败。这个错误代码为 IIS 6.0 所专用。</div>
</td></tr><tr><td><div class="para">404 Not Found</div>
</td><td><div class="para">服务器无法找到被请求的页面。</div>
</td></tr><tr><td><div class="para">404.0</div>
</td><td><div class="para">(无)–没有找到文件或目录。</div>
</td></tr><tr><td><div class="para">404.1</div>
</td><td><div class="para">无法在所请求的端口上访问 Web 站点。</div>
</td></tr><tr><td><div class="para">404.2</div>
</td><td><div class="para">Web 服务扩展锁定策略阻止本请求。</div>
</td></tr><tr><td><div class="para">404.3</div>
</td><td><div class="para">MIME 映射策略阻止本请求。</div>
</td></tr><tr><td><div class="para">405 Method Not Allowed</div>
</td><td><div class="para">请求中指定的方法不被允许。</div>
</td></tr><tr><td><div class="para">406 Not Acceptable</div>
</td><td><div class="para">服务器生成的响应无法被客户端所接受。</div>
</td></tr><tr><td><div class="para">407 Proxy Authentication Required</div>
</td><td><div class="para">用户必须首先使用代理服务器进行验证,这样请求才会被处理。</div>
</td></tr><tr><td><div class="para">408 Request Timeout</div>
</td><td><div class="para">请求超出了服务器的等待时间。</div>
</td></tr><tr><td><div class="para">409 Conflict</div>
</td><td><div class="para">由于冲突,请求无法被完成。</div>
</td></tr><tr><td><div class="para">410 Gone</div>
</td><td><div class="para">被请求的页面不可用。</div>
</td></tr><tr><td><div class="para">411 Length Required</div>
</td><td><div class="para">"Content-Length" 未被定义。如果无此内容,服务器不会接受请求。</div>
</td></tr><tr><td><div class="para">412 Precondition Failed</div>
</td><td><div class="para">请求中的前提条件被服务器评估为失败。</div>
</td></tr><tr><td><div class="para">413 Request Entity Too Large</div>
</td><td><div class="para">由于所请求的实体的太大,服务器不会接受请求。</div>
</td></tr><tr><td><div class="para">414 Request-url Too Long</div>
</td><td><div class="para">由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。</div>
</td></tr><tr><td><div class="para">415 Unsupported Media Type</div>
</td><td><div class="para">由于媒介类型不被支持,服务器不会接受请求。</div>
</td></tr><tr><td><div class="para">416 Requested Range Not Satisfiable</div>
</td><td><div class="para">服务器不能满足客户在请求中指定的Range头。</div>
</td></tr><tr><td><div class="para">417 Expectation Failed</div>
</td><td><div class="para">执行失败。</div>
</td></tr><td><div class="para">423</div>
</td><div class="para">锁定的错误。</div>
错误码5开头
<div class="para">500 Internal Server Error</div>
<td align="left" width="0" valign="center"><div class="para">请求未完成。服务器遇到不可预知的情况。</div>
</td><tr><td align="left" width="0" valign="center"><div class="para">500.12</div>
</td><td align="left" width="0" valign="center"><div class="para">应用程序正忙于在 Web 服务器上重新启动。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">500.13</div>
</td><td align="left" width="0" valign="center"><div class="para">Web 服务器太忙。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">500.15</div>
</td><td align="left" width="0" valign="center"><div class="para">不允许直接请求 Global.asa。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">500.16</div>
</td><td align="left" width="0" valign="center"><div class="para">UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">500.18</div>
</td><td align="left" width="0" valign="center"><div class="para">URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">500.100</div>
</td><td align="left" width="0" valign="center"><div class="para">内部 ASP 错误。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">501 Not Implemented</div>
</td><td align="left" width="0" valign="center"><div class="para">请求未完成。服务器不支持所请求的功能。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">502 Bad Gateway</div>
</td><td align="left" width="0" valign="center"><div class="para">请求未完成。服务器从上游服务器收到一个无效的响应。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">502.1</div>
</td><td align="left" width="0" valign="center"><div class="para">CGI 应用程序超时。 ·</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">502.2</div>
</td><td align="left" width="0" valign="center"><div class="para">CGI 应用程序出错。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">503 Service Unavailable</div>
</td><td align="left" width="0" valign="center"><div class="para">请求未完成。服务器临时过载或当机。</div>
</td></tr><tr><td align="left" width="0" valign="center"><div class="para">504 Gateway Timeout</div>
</td><td align="left" width="0" valign="center"><div class="para">网关超时。</div>
</td></tr><td align="left" width="0" valign="center"><div class="para">505 HTTP Version Not Supported</div>
</td><div class="para">服务器不支持请求中指明的HTTP协议版本。</div>
COOKIE<br>
设置cookie
<pre>setcookie(键名, 键值, 过期时间, 服务器端有效路径, cookie有效域名);</pre>
读取cookie<br>
$_COOKIE
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
数量:每个浏览器都不相同,ie8允许每个域名保存50个cookie,火狐允许每个域名保存50个cookie<br>
大小:一般允许4kb不同浏览器不同版本略有不同
回收:cookie时间到了,自动回收。cookie数量到达上限随机回收或者使用最少的<br>
SESSION
开启session session_start();<br>session必须开始,不然无法使用
设置读取
设置
开启session_start()之后可以通过$_SESSION这个外部变量来设置具体的值,如:$_SESSION['name'] = '王航';<br>
读取
开启session后可以通过外部变量,$_SESSION['name']根据变量的键名来或者对应的值<br>
销毁<br>
手动
session_unset()删除所有的session变量,不删除session文件
session_destroy()销毁session文件,释放sessionid,不删除session变量
自动
浏览器关闭自动回收
生命周期结束,自动回收
随机删除,使用次数最少的
多少:session理论上是可以存放无限多的,和你的服务器配置有关系<br>
大小:session理论上没有大小限制
函数<br>
自定义函数
函数定义
function 函数名(参数..){代码执行过程}<br>
函数传参
传参传值<br>
传参传址
默认参数
函数返回值
返回值会直接终止函数的运行
变量函数<br>
变量函数,就是把变量的值当作函数的名称来调用
内部函数<br>
函数内部定义函数,只能在函数内部使用<br>
递归函数
函数自己调自己
具体用法自己调着看吧
反正我不会
函数的函数
挂掉程序<br>
die()
exit()
字符串函数
字符串长度<br>
strlen()获取字符串长度,只能是英文的,中文一个utf8编码格式的,占三字节
mb_strlen()获取指定字符编码格式的字符串长度,一个中文占1个字节,函数的第二个参数必须添加字符编码格式,如:utf8
iconv_strlen() 支持中英混合判断长度<br>
字符串截取
substr($str,$start,$len),从start开始截取,截取长度是len,返回截取出来的字符串
mb_substr($str,$start,$len,$code)中文截取,指定字符串编码,一个中文只占一个字节<br>
trim()去掉左右指定字符串,如果不添加第二个参数就默认去掉空格
ltrim()去掉左边指定字符
rtrim()去掉右边指定字符
字符串查找<br>
strpos($str,$search);从左向右查找指定的字符串,找到返回位置,找不到返回false
strrpos($str,$search);从右向左查找指定的字符串,找到返回位置,找不到返回false
strchr($str,$search)/strstr($str,$search)从左向右查找指定字符串,找到返回从当前位置到结尾的所有字符串
strrchr($str,$search);从右向左查找指定字符串,指定字符串只识别第一个字符,找到返回从当前位置到结尾的所有字符串
字符串替换<br>
str_replace($search,$replace,$str)在str字符串中找到search字符串,替换成replace字符串
字符串转换
strtolower()大写转小写
strtoupper()小写转大写
ucfirst()首字母大写
ucwords()字符串所有单词首字母大写
md5()字符串加密
htmlspecialchars()把html标签转成实体
htmlspecialchars_decode()把html实体标签转回来
addslashes()给单引号双引号反斜杠添加反斜杠,,防止sql注入
urlencode()把url编码加密
urldecode()url编码解密
stripslashes()把addslashes()方法转成的字符串转回来
strip_tags()去掉字符串中所有的html标签,第二个参数指定不去掉哪些
字符串修改<br>
str_pad($str,$len,$pad,$direction)把str字符串填充到指定len长度,如果长度不够才填充,pad是填充的字符串,direction是填充的方向:STR_PAD_RIGHT向右填充,STR_PAD_LEFT向左填充,STR_PAD_BOTH先向右填一个再左填一个直到到指定长度为止
number_format()把数字形式的字符串格式化
explode()用指定字符串把字符串切割成数组<br>
implode()用指定字符串把数组拼接成字符串<br>
数学函数
abs()绝对值
ceil()向上取整
floor()向下取整
max()获取数组的最大值
min()获取数组的最小值
round()四舍五入,第二个参数指定小数点后保留几位
mt_rand()随机返回一个整形,第一个参数指定最小值,第二个参数指定最大值
rand()随机返回一个数,第一个参数指定最小值,第二个参数指定最大值
日期函数
time()获取当前的时间戳
date()把时间戳格式化成日期格式的字符串
date("Y-m-d H:i:s","1575533578")
获取当前时间date("Y-m-d H:i:s")
strtotime()把日期格式的字符串转成时间戳
要用date必须在php-ini中配置date.timezone=PRC<br>
数组函数
count()获取数组的长度<br>
key()获取当前指针指向的键名
current()获取当前指针指向的value值
next()指针挪向下一位,返回指针指向的value值
prev()指针向上挪一位,返回指针执行的value值
reset()把指针挪到数组的第一位
end()把指针挪到数组的最后一位
array_push()给数组最后添加一个或者多个值,用于索引数组
array_pop()删除数组最后一位<br>
array_unshift()给数组第一位添加一个或者多个值
array_shift()删除数组的第一位
array_merge($arr,$arr1,$arr2,...)合并一个或者多个数组,把所有数组的值赋给第一个参数,如果关联数组后边键名和前边键名相同是会覆盖前边的值
sort()/rsort()不保留键名对键值进行排序
asort()/arsort()保留键名,对键值进行排序
ksort()/krsort()对键名进行排序
array_chunk() 把一个数组分割为新的数组块。用第二个参数把第一个参数的数组切割成,一个二维数组,二维数组的长度就是分割后的长度,二维数组中的每个值都是数组,长度是第二个参数,最后一个数组长度可能不够
文件函数
单文件操作
fopen()创建或加载文件
fread()读取文件
is_file()判断文件是否存在,传参文件路径
fgets()读取单行文本内容
fwrite()写入文件
unlink()删除文件
fclose()关闭文件<br>
feof()文件结尾
文件夹操作
mkdir()创建文件夹
权限设置
mode=0777
递归创建
recursive=true
is_dir()判断路径所在文件夹是否存在
文件上传
1、页面上传文件
2、读取文件
$_FILES
注意FILES里面对应页面的name
3、移动文件
move_uploaded_file($filename, $destination)
参数
$filename
临时文件位置
$destination
文件上传目标位置及名称
正则函数
preg_match()用正则匹配第二个参数中是否有对应正则表达式的值,有了返回1没有返回0
preg_match_all()用正则匹配第二个参数中是否有对应正则表达式的值,有了返回匹配到的个数,没有返回0,查找到的值,返回到第三个参数中,第三个参数必填
preg_split()用正则表达式把字符串切割成数组,第一个参数正则表达式,第二个参数是字符串
preg_replace($preg,$replace,$str)用正则表达式匹配字符串,找到后用指定的只付出替换
面向对象
思想介绍
传统的面向过程的编程思想:
将要实现的功能描述为一个从开始到结束的连续的“步骤(过程)”。
依次逐步完成这些步骤。如果步骤较大,又可以将该步骤再次细分为子步骤,以此类推。
程序从头开始执行一直到结尾并得到所需结果。
例子:完成来“报名学习”这件事,可以这样来实现:
第一步,学生提出要报名,并提供姓名和照片
第二步,咨询老师接收照片并登记学生姓名
第三步,学生缴费(付款到学校账号)并获得缴费凭证
第四步,咨询老师验证凭证并分配班级
第五步,最终结果为:报名完成,学生可以在规定的时间到规定的班级(教室)上课,数据库中就有了该学生的信息。
现代的面向对象的编程思想:
将要实现的功能描述为一个“对象/物体”完成的任务——现实中也是如此:功能的实现都是依赖于一个实体的“行动/操作/动作”。
完成该最终功能的过程中需要实现其他中间功能(过程),则再去调用其它对象(或也可能是自己本身)来实现该中间功能。
整个系统的完成(功能的实现)看作是一个一个对象在发挥其各自的“能力”并在内部进行协调有序的调用过程。
例子:完成来“报名学习”这件事,可以这样来处理:
学生对象:有姓名有照片,有所属班级,能“提出报名”,能“缴费”
咨询老师对象:能接收照片并登记姓名,能分配班级。
班级对象:有班号,有开班日期,有教室。<br>
基本概念
类与对象
类
类是描述一类事物的一个总称,是具有相同特征特性的该类事物的一个通用名字(称呼);
比如人就是一个类(人类),狗也是一个类(狗类),它们又属于一个更大的类(哺乳类),桌子,手机,书都是一个类;
一个类决定了一个对象所具有的所有特征特性信息,比如我是人类,则我有:姓名,性别,年龄,我还能吃饭,走路,说话。
语法上,一个类内部可以具有自己的“变量”和“函数”,但此时在技术术语上就对应地称为“属性”和“方法”。<br>一个类也可以有自己的常量。这些属性,方法和常量就都称为“类”的“成员”。<br>
对象
对象是一个明确的具体的“物体”,是某个类中的一个“实物”(相对来说,类就是一种抽象的泛称)。对象离不开类,或者说,对象一定隶属于某个类——有类才有对象,先有类再有对象。
比如“黄晓明”就是“人”这个类的一个具体对象,“阿黄”是“狗”这个类的一个具体对象。
一个对象的所有特征特性信息,都是由其所属的类决定的,但每个对象又很有可能有自己不同的特征特性信息,比如有个对象的名字叫吴六奇,性别男,会写程序,另一个对象可能叫章子怡,性别女,会演戏。
类的定义
类中属性property
类中方法method
对象创建与使用
对象的创建<br>
就是由一个类“创建”出一个具体的“物体”——专业说法就是对象。
new 类名();//标准写法<br>new 变量名(); //该变量的内容是一个表示类名的字符串。<br>new self; //用于在类的方法内部创建一个该类对象。<br>类名::getNew();//定义类的一个静态方法用于获取该类的一个对象
对象的使用<br>
操作属性
$obj->name
使用属性,就可以当作一个变量看待。
操作方法
$obj->run();
使用方法,就可以当作一个函数看待。
类class
属性(变量)
作用范围
public 公有的<br>
所有的都可以使用
private 私有的<br>
只能对象自己使用
protected 受保护的<br>
子类和自己使用
static 静态的<br>
一个仅仅隶属于(依附于)类的属性,其是通过类名直接来取用的。
静态变量在类文件被加载时已经初始化成功了,可以直接通过类名来访问。如: $class::test;<br>
定义形式:[访问修饰符] static $静态属性名 [ = 初值];<br>访问修饰符省略则默认为public,初值也应该是直接值或常量<br>
final 最终的<br>
子类不可以重写父类的方法和变量
const 常量<br>
一个仅仅隶属于(依附于)类的常量,其是通过类名直接来取用的
定义形式
const 常量名 = 初值;//必须赋初值
使用形式
类名::常量名;其中类名也可以用该类的对象名,一个内容为该类名的字符串变量名,self等来代替。
使用形式
对象名->属性名;
属性是可读可写的(可取值赋值)。
方法(函数)<br>
含义
方法就是定义在类中的函数
该方法是需要通过对象来调用。
作用范围
修饰符
public
private
protected
static
final
static静态
在类文件被加载时就初始化成功,可以直接通过类名来调用方法,在静态方法中不可以调用非静态的成员变量
定义形式
[访问修饰符] static function $静态方法名(...){ ...... }
使用形式
类名::静态方法名(...);其中类名也可以用该类的对象名,一个内容为该类名的字符串变量名,self等来代替。
注意事项
注意1:$this在静态方法中不能使用。<br>
注意2:静态方法中不应调用非静态方法。
注意3:self关键字:用在方法中,表示该方法所在的类。
注意4:static关键字:代替self关键字的位置,除了具有self作用外,还具有更灵活的作用,那就是所谓“后期静态绑定”。
final 最终的<br>
子类不可以重写父类的方法
默认方法
构造方法__construct(),在类被实例化成对象的时候,自动执行<br>
也可以在当前类的构造方法中调用父类的构造方法:parent::__construct();
析构方法 __destruct() 在对象生命周期结束前自动执行<br>
对象销毁
脚本程序运行结束,自动销毁;
明确地unset()一个对象变量,则被销毁;
改变对象变量的值,被销毁;
获取$this的所属类:get_class($this)
对象object<br>
封装
封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
get/set
继承
基本含义
类是用来描述现实世界中同一种事物的共有特性的抽象模型。<br>但现实世界中,不同种类的事物之间有往往有一些上下级或大小范围的关系。<br>比如,动物是一个“类”,具有某些特性。<br>但脊椎动物也是一个类,也具有一些特性,且同时具有动物类的所有特性。<br>哺乳动物还是一个类,具有一些特性,并同时具有脊椎动物的所有特性。<br>如此等等,则面向对象编程中,我们定义的类也同样可以具有类似的关系特征,这就是类的继承。<br>
基本概念
继承:一个类从另一个已有的类获得其特性,称为继承。
派生:从一个已有的类产生一个新的类,称为派生。
父类/子类:已有类为父类,新建类为子类。
单继承:一个类只能从一个上级类继承其特性信息。PHP和大多数面向对象的语言都是单继承模式。C++是多继承。
扩展:在子类中再来定义自己的一些新的特有的特性信息(属性,方法和常量)。没有扩展,继承也就没有意义了。
关键词
extends
继承关键词,前面写子类 后面写父类
parent
在类的内部用来表示(代表)该类的父类。<br>可以用来访问父类的属性或方法或常量。<br>
重写override
什么是重写?重写又叫“覆盖”,就是将从父类继承下来的属性或方法重新定义。只有保护的或公有的属性或方法能够被覆盖。
为什么要重写?因为父类的某个属性可能对于子类来说不够具体或详细,子类想要同样特性或功能的更准确或详细信息。
重写的基本要求:访问控制权限,方法的参数形式。
私有属性和私有方法的重写问题:私有属性和方法都不能覆盖,但其实子类可以定义跟父类私有的同名属性或方法。只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。
构造方法的重写问题:构造方法不但可以像其他普通方法一样重写,而且,比普通方法更宽松:重写的时候参数可以不一致。
抽象类
abstract <br>
抽象类,就是一个不能被实例化的类
如果类中有抽象的方法,那么类必须是抽象类。<br>
定义
abstract class test{...类变量和方法}<br>
用处
定义一些公共的类、方法
比如一些较难的东西
组长规定你要完成的一些任务(方法)
抽象类必须通过继承来实现他里边的变量和方法<br>
抽象类中的抽象方法必须是公有的,或者受保护的
接口interface
interface 接口名称 { public function run(); public function eat();}<br>
一个类只能继承一个父类,但是它可以引入多个接口
类引入接口后,必须实现接口定义的方法
接口方法,必须是公有的
多态
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。<br>不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。<br>
命名空间namespace<br>
用途
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
定义
namespace
命名空间通过关键字namespace来声明
__NAMESPACE__
魔术变量 获取当前命名空间值
namespace MyProject\Sub\Level;
声明分层次的单个命名空间
use
使用命名空间:别名/导入
特别注意
命名空间一般与文件夹相同,为了方便自动导入(include)文件
所有未定义命名空间的类,都由\表示,或者不写
命名空间一定要写在文件的第一行
代码
其他相关技术<br>
类的自动加载
概念
当在php的代码中的某一行,使用一个类的时候,但该类却还“不存在”的时候,就会去调用某个函数,在该函数中可以去加载要加载的类文件,以实现类的自动加载。
实现方法
__autoload()
常规自动加载函数
预先定义该函数,则代码中,需要一个类却还没有的时候,就会自动调用该函数。<br>我们只要在此时“设法”加载对应的类文件,就可以了!
自动加载的注意事项:<br>1,通常,我们将类文件取名为跟类名有关的并且有规律性的名字,比如文件名为:类名.class.php<br>2,类文件中,只包含一个类的定义语句,不要有其他。<br>3,类文件通常都集中统一放置在一定的目录中,比如class,比如lib,比如inc。
spl_autoload_register();
自定义自动加载函数
常规的自动加载,只能利用__autoload()这一个函数,但是在多人合作开发中,有时并不方便。<br>我们还可以来自定义自动加载函数,每个自动加载函数都可以“各负其责”,来加载某个特定目录(频道)中的类文件。
常规的自动加载,只能利用__autoload()这一个函数,但是在多人合作开发中,有时并不方便。<br>我们还可以来自定义自动加载函数,每个自动加载函数都可以“各负其责”,来加载某个特定目录(频道)中的类文件。
对象的复制(克隆)
虽然我们知道,对象变量之间,即使使用值传递,比如:<br>$obj2 = $obj1;<br>也并没有像其他普通数据一样,变成“2份”,而只是“对象的编号数据”变成了2份。
$obj2 = clone $obj1;
对象的遍历
foreach语法,还能够对“对象”数据,进行遍历<br>——注意:其只能遍历“可访问的属性”;
PHP内置标准类
php内部,有一个现成的“类”,名字为“stdclass”,被称为“标准类”;
可见,这个对象内部“什么都没有”。<br>它通常用作其他类型的数据转换为“对象”时的“模板类”
与类有关的魔术常量
__CLASS__, 表示当前类的类名;
__METHOD__:表示当前方法的方法名;
与类有关的魔术方法
__construct, __destruct, __set(), __get(), __isset(), __unset(), __call(), __callstatic()
类系统函数
class_exists():判断某个类是否存在<br>interface_exists():判断某个接口是否存在<br>get_class($对象):获得一个对象的所属类<br>get_parent_class($对象): 获得一个对象的所属类的父类<br>get_class_methods(类名):获得一个类的所有方法名,结果是一个数组<br>get_class_vars(类名):获得一个类的所有属性名,结果是一个数组 <br>get_declared_classes():获得所有类名;
对象系统函数
is_object():判断是否是对象类型
get_object_vars($对象):获得一个对象的所有属性(不含静态属性)
MySQL
Mysqli(传统)
流程
连接数据库
$conn
设置编码
SET NAMES utf8
mysqli_query($conn,'SET NAMES utf8');
创建SQL
查询
select
抓取数据
mysqli_fetch_row
mysqli_fetch_assoc
$row=mysqli_fetch_all($result,MYSQLI_ASSOC);
执行SQL
mysqli_query($conn,$sql);
输出
传参数
PDO(面向对象数据编程)<br>
PDO介绍:
连接MySQL数据库:
DSN = "mysql:host=服务器地址/名称;port=端口号;dbname=数据库名";<br>Options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>’set names utf8’);<br>$pdo = new pdo(DSN, "用户名", "密码", Options);
执行sql语句
执行所有sql语句:query(sql)
执行无返回数据集的sql语句:exec(sql)
释放资源
$pdo = null;<br>$result->closecursor();
pdo对象的其他常见操作
$pdo->lastInsertId();<br>$pdo->beginTransaction();<br>$pdo->commit()<br>$pdo->rollBack();<br>$pdo->inTransaction();<br>$pdo->setAttribute(属性名,属性值);
错误处理方式
错误模式:
这是pdo的默认模式,可以获取pdo最后一次发生的错误信息。
$pdo->errorCode();<br>$pdo->errorInfo();
异常模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDOStatement(PDO结果集)对象
常用方法
$stmt = $pdo->query(“select ...... ”);//这是获得结果集<br><br>
$stmt->rowCount() ;
<br>$stmt->columnCount() ;
<br>$stmt->fetch( [返回类型] ); //返回类型常用的有:<br><br>
PDO::FETCH_ASSOC:表示关联数组<br>PDO::FETCH_NUM:表示索引数组<br>PDO::FETCH_BOTH:表示前二者皆有,这是默认值<br>PDO::FETCH_OBJ:表示对象
<br>$stmt->fetchAll([返回类型]);
<br>$stmt->fetchColumn( [$i] );
<br>$stmt->fetchObject();
<br>$stmt->errorCode();
<br>$stmt->errorInfo();
<br>$stmt->closeCursor();
预处理语句
语法一:$sql = "select * from tab1 where f1 = :val1 and f2 >:val2"; //命名参数形式<br>语法二:$sql = "select * from tab1 where f1 = ? and f2 >?"; //占位符形式<br>预处理:$stmt = $pdo->prepare($sql);//也就是“编译”该sql语句,这样就可以多次反复使用该语句<br>绑定值:$stmt->bindValue(命名参数或占位符序号, 值,[类型]);<br>绑定变量:$stmt->bindParam(命名参数或占位符序号, 变量,[类型]); //类型为可选项,包括:<br>PDO::PARAM_BOOL,<br>PDO::PARAM_NULL,<br>PDO::PARAM_INT,<br>PDO::PARAM_STR,<br>PDO::PARAM_BLOB,<br>PARAM_INPUT_OUTPUT:表示参数是“可传出值的”。<br>执行方式一:$stmt->excute(); //前提是前面进行了“绑定”操作<br>执行方式二:$stmt->excute(arry(":val1"=>值1,":val2"=>值2)); //对应命名参数形式<br>执行方式三:$stmt->excute(arry(值1,值2)); //对应占位符形式<br>
0 条评论
下一页