使用PHP
了解PHP
1.php含义
PHP是一种服务器端脚本语言,它是专门为Web而设计的。在一个HTML页面中,你可以嵌入PHP代码,这些代码在每次页面被访问时执行。PHP代码将在Web服务器中被解释并且生成HTML或访问者看到的其他输出。
2.php优点
■高性能
■可扩展性
■与许多不同数据库系统的接口
■内置许多常见Web任务所需的函数库
■低成本
■容易学习和使用
■对面向对象的高度支持
■可移植性
■开发方法的灵活性
■源代码可供使用
■技术支持和文档可供使用
案例引入
1.html表单
(1)代码
1 |
|
(2)实现效果:
(3)代码解析:
html表格由
标签定义,每个表格均有若干行(由
标签定义),每行被分割为若干单元格(由 标签定义)。字母 td 指表格数据(table data),表格的表头使用 标签进行定义。 html表单
表单元素,根据type属性有不同类型,根据name定义表单域
类型 | 描述 |
---|---|
text | 定义常规文本输入。 |
radio | 定义单选按钮输入(选择多个选择之一) |
submit | 定义提交按钮(提交表单) |
- Action属性
action 属性定义在提交表单时执行的动作。向服务器提交表单的通常做法是使用提交按钮。通常,表单会被提交到 web 服务器上的网页。也可以指定某个服务器脚本来处理表单
1 | <form action="test.php" method="POST"> |
html中表单域的名称可以沿用在php中,并反映输入该域的数据
- Method 属性
method 属性规定在提交表单时所用的 HTTP 方法(GET 或 POST)
2.表单处理
PHP脚本在web服务器上解释执行后,脚本输出代替了脚本本身,变成了纯html,用户的浏览器并不需要理解PHP
3.在html中嵌入php
(1)PHP标记
常用风格:<?php ?>
1 | echo '<p>hello world</p>'; |
(2)php注释
多行注释:/* */
单行注释:// 或 #
(3)注意php环境的搭建,如果是用phpstudy搭建,执行php文件应放在www文件中并且执行文件的url为
1 | http://localhost/文件名 |
4.添加动态内容
使用服务器端脚本语言的主要原因就是能够为站点用户提供动态内容。这是一个非常重要的应用,因为根据用户需求或随着时间的推进而变化的内容可以使得用户不断地访问这个站点。
案例:
1 | <html> |
(1)使用date()函数
- date()函数需要一个传递格式化字符串的变量,字符串的每一个字母都表示日期和时间的一部分
- H是24小时格式的小时,i是分钟,如果小时数和分钟数是个位数,需要在前面补0
- j是该月的日期,不需要前面的补0
- 而s表示顺序后缀(在这个例子中,是“th”)
- F是月份的全称
5.访问表单变量
(1)不同风格的表单变量
1 | $tireqty // short style |
注意:php变量一定要以$开头
(2)不同风格的比较:
- 简短风格:使用方便,但也容易造成安全问题,只推荐新手使用。脚本的变量名和表单域名是一样的,如同向一个函数传递参数,不需要再声明变量
- 中等风格:开发中推荐使用,不会产生安全问题。中等风格涉及了从$_POST、$_GET或$_REQUEST数组之一检索变量。$_GET或$_POST数组之一都可以保存表单变量的细节。通过POST或GET方法及其组合方式提交的所有数据都可以通过$_REQUEST数组获得。这些数组被称为超级全局变量
- 冗长风格:已经被弃用
(3)案例:
1 |
|
把表单域传来的值赋值到新的变量上。
变量与常量
1.变量类型
php的数据类型由赋给变量的值决定,当然我们也可以强制类型转换
1 | $ test1 = 1; |
test1是整数型,而test2是浮点数型
2.常量的使用
变量可变,常量固定不变,一般使用define函数定义常量
1 | define('Test1', 100); |
引用常量时,不需要$号,所以常用大写来区分常量和变量
除了自定义的常量外,还有php预定义的许多常量,我们可以通过phpinfo()
函数查看
3.变量作用域
php特供操作符
1.字符串操作符
点操作符将两个字符串连在一起
1 | $a = "BOb's"; |
2.执行操作符
php将````之间的命令当作服务器端的命令行来执行
1 | $out = `dir c:`; |
3.数组操作符
php可以直接操作一整个数组,如比较联合比较等
4.类型操作符
instanceof
操作符允许检查一个对象是否是特定类的实例
1 | class test(); |
可变函数测试
可变函数用于测试和操作变量,比较实用的用法是可以测试用户输入的表单数据是否正确
1.测试和设置变量类型
(1)获取和设置变量类型
1 | $a = 56; |
(2)变量类型测试
测试函数名 | 功能 |
---|---|
is_ array() | 检查变量是否是数组 |
is_float() | 检查变量是否为浮点数 |
is_int() | 检查变量是否为整数 |
is_ string() | 检查变量是否是字符串 |
is_ object() | 检查变量是否是一个对象 |
is_null() | 检查变量是否是为null |
(3)变量状态测试
- isset() : 测试一个变量是否存在
- unset() :销毁一个变量
- empty() : 测试一个变量是否存在,以及它的值是否为非空和非零
1 | echo 'isset($test):'.isset($test). '<br />'; |
但$test存在时:
isset()函数无论表单域填入什么或空白,都会返回1;
empty()函数但填入0或空值,返回0;
但$test不存在时:
isset()函数返回0;
empty()函数返回1;
switch语句的使用
1.html选择器
1 | <tr> |
select是一个html选择器表单标签,变量名为find,选项值有a,b,c,d,以下使用php的switch语句来处理这些数据(当然if语句也可)
2.switch语句与选择器的交互
1 | switch($find) { |
值得注意的是switch语句和if语句不同,switch语句实质是比较并跳转到符合条件的语句,并向下执行直到遇到break
循环语句
1.php循环用法
(1)简化重复有规律的html代码,在wordpress主题开发中很常见的用法
(2)动态创建变量名称,依次访问每一个表单域
1 | for ($i = 1; $i < $numnames; $i++)( |
控制语句
1.一般形式
- break:终止一个循环
- continue :进行下一次循环
- exit:结束php语句
2.可替换的控制结构语法
如endif,endswitch, endwhile,endforeach
(1)一般写法
1 | if($test == 0){ |
(2)使用替代写法
1 | if($test == 0): |
数据存储和检索
文件处理
(1)将数据写入一个文件,有以下3步操作
- 打开这个文件。如果文件不存在,需要先创建它。
- 将数据写入这个文件。
- 关闭这个文件
(2)从一个文件中读出数据,也有以下3步操作
- 打开这个文件。如果这个文件不能打开(例如,文件不存在),就应该意识到这一点并且正确地退出。
- 从文件中读出数据
- 关闭这个文件。
打开文件
在php中打开一个文件,可以使用fopen()函数,打开一个文件时,还需要指定文件模式(如何使用它)
1.选择文件模式
所谓文件模式,即用于决定如何处理来自其他人或脚本的请求,以及一种用来检查是否有权访问特定文件的方法
当你打开一个文件,你可以对它有三种操作选择:
- 打开文件只是为了读它的内容(只读) / 写些内容(只写)/又读又写(读和写)
- 写一个文件时,你可以选择覆盖所有文件内容 / 追加到文件末尾
- 如果在某些区分二进制和纯文本的系统上写文件,还需要指定采用方式
2.fopen()打开文件
(1)案例:
1 | $DOCUMENT_ROOT = $_SERVER['$DOCUMENT_ROOT']; |
以下对fopen()所需参数进行解析
(2)文件路径参数
$_SERVER['$DOCUMENT_ROOT']
是php的内置函数,使路径指向web服务器文档树的根- ..表示文档根目录的父目录,描述了一个相对文档根目录文件的文件系统位置,表示相对路径
- 完善父目录下的路径
目录的间隔号在windows平台还可以使用反斜线,但这也意味着代码只能在windows上运行
1 | $fp = fopen("$DOCUMENT_ROOT\\..\\orders\\orders.txt", 'w'); |
(3)文件模式
之前也有介绍过文件模式基本内容,网上也有很多相关表格整理,这里不多写
该图截自PHP与MySQL开发一书
一般采用的文件模式,都是追加模式(以及推荐二进制模式)
1 | $fp = fopen("$DOCUMENT_ROOT\\..\\orders\\orders.txt", 'ab'); |
3.通过FTP或HTTP打开文件
php除了可以打开一个本地文件进行操作外,还可以通过fopen()函数通过FTP或HTTP协议打开文件
在php.ini文件中,可以通过关闭allow_url_ fopen指令来禁用这个功能。如果在使用该函数打开一个远程文件时遇到问题,请检查php.ini文件
如果使用的文件名是以ftp://开始的, fopen()函数将建立一个连接到指定服务器的被动模式,并返回一个指向文件开始的指针
如果使用的文件名是以http://开始的fopen()函数将建立一个到指定服务器的HTTP连接,并返回一个指向HTTP响应的指针
4.文件打开错误处理
文件打开错误,往往是因为用户权限不足,这时候就要抑制php本身的报错,构造让用户感到友好的错误信息
1 | @ $fp = fopen("$DOCUMENT_ROOT\\..\\orders\\orders.txt", 'ab'); |
写文件
1.fwrite的参数
php写文件相对简单,一般使用fwrite()函数,使用案例如下:
1 | fwrite($fp, $strings); |
这个函数告诉php将$strings
的字符串写入$fp
指向的文件中。
此外还有一个可选的参数length是最大写入字符数。
1 | fwrite($fp, $strings, strlen(strings)); |
php内置的strlen()函数可获得字符串长度,这里其实是多此一举的,一般情况写入字符串会一直写到字符串末尾
关闭文件
1 | fclose($fp); |
如果该文件被成功关闭,函数就会返回一个true值,反之则返回false
读文件
读文件这个操作实际上要实现:打开文件,读文件,关闭文件这些流程
- 以只读模式打开文件
$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'rb');
- 读取文件内容直到末尾,用
while(!feof($fp))
,feof函数表示文件末尾,但文件指针指向文件末尾时,它将返回true - 每次读取一行数据,可以使用fgets()函数:
$order = fgets($fp, 999);
fgets()函数将一直读到\n符或结束符EOF;此外fgets()函数的一个变体fgetss()也非常实用,它可以过滤php和html标记,也可以在参数中额外添加其他任何特殊标记 - 读取整个文件,readfile(),fpassthru(),file()
更好的数据存储方式
相对于普通文件存储数据,更加有效主流的方式是使用数据库管理系统(DBMS),而比较常见的是MySql数据库(RDBMS),其有以下优点
- RDBMS提供了比普通文件更快的数据访问
- RDBMS可以很容易地查找并检索满足特定条件的数据集合
- RDBMS具有内置的处理并发访问的机制
- RDBMS可以随机访问数据
- RDBMS具有内置的权限系统
数组
数字索引数组
1.数组初始化
实际上php的数组和其他变量一样,它并不需要预先初始和声明,第一次使用时就会自动创建,而且数组大小会根据元素多少而动态变化(这和其他编程语言有很大的区别)
1 | $products = array('Tires', 'oil', 'Spark'); |
array()实际上是语言结构而不是函数
还有php内置的数字数组和字母数组
1 | $odds = range(1, 10, 2); //1~10,间隔为2 |
2.访问数组内容
(1)访问方法
非常经典地采用数字下标的索引法
1 | echo "$products[0] $products[1] $products[2] $products[3] " |
值得注意的是,php的变量和数组一般都要放在双引号外,即便php有很强的字符串解析能力
(2)循环访问
经典访问法:for循环
1 | for($i = 0; $i < 3; $i++){ |
php内置专门访问数组的方法:foreach
1 | foreach($products as $current){ |
关联数组
1.数组初始化
1 | $prices = array('Tires' => 100, 'oil' => 10, 'Spark' => 4); |
2.访问数组元素
(1)访问的下标,由默认的数字变成对应关联字符串
1 | $prices['Tires'] //100 |
(2)循环访问
由于关联数字的索引不是数字,当然是不能使用for循环的计算器来操作,但是我们可以用foreach()
或list()
或each()
foreach方法
1 | foreach($prices as $key => $value){ |
$key指代了索引,$value指代了关联值
each方法
1 | while ($element = each($prices)){ |
each函数会返回数组当前元素,并将下一个元素作为当前元素,直到达到数组末尾
list方法
list是比较常用的方法,因为它更容易阅读
1 | reset($prices); |
- reset()将元素设置到数组开始,允许再次遍历数组
- each()将$prices数组中提出当前元素作为数组返回,并指向下一个元素
- list()将从each()返回的数组变成名为$product,$price的新变量
数组操作符
php特供数组操作,依旧不予整理,直接贴书里的图
数组排序
1.普通一维数组排序
(1)按字母升序来排序
1 | $products = array('Tires', 'oil', 'Spark'); |
值得注意的是,sort()函数的排序区分大小写
(2)按数字升序来排序
1 | $prices = array(100, 10, 4); |
(3)指定排序类型
sort()函数还有一个可选参数用于指定排序类型
1 | SORT_REGULAR //默认 |
2.关联数组排序
(1)按值排序
1 | $prices = array('Tires' => 100, 'oil' => 10, 'Spark' => 4); |
(2)按关键字排序
1 | $prices = array('Tires' => 100, 'oil' => 10, 'Spark' => 4); |
3.反向排序
在之前提到的函数中加个‘“r”:rsort(), arsort(), krsort()
二维数组排序
需要自定义一个排序函数
1 | function compare($x, $y){ |
索引为1,所以按字母排序
如果要反向排序时,就要交换+1,-1
其他实用的数组函数
函数 | 功能 |
---|---|
shuffle() | 使一个数组的元素随机排列 |
array_reverse() | 返回一个顺序相反的数组 |
each(),current(),reset(),end(),next(),pos(),prev() | 用于浏览数组的函数 |
array_walk() | 以相同方式使用或修改数组中每一个元素 |
count(),sizeof() | 统计数组元素的个数 |
array_count_values() | 统计特定值在数组中出现的频率,返回一个以元素作为关键字,频率作为值得关联数组 |
extract() | 将数组转换为标量变量,即让key = value |
字符串操作与正则表达式
字符串格式化
通常我们会对用户输入的字符串(来自于html的表单)进行整理
1.字符串的整理
实现目标:清理字符串多余的空格
实现方法:
(1)trim()函数去除字符串开始位置和结束位置空格,并返回结果字符串,默认去除字符\n, \r, \t, \0, 和空格
1 | $name = trim($_post['name']); |
(2)ltrim(), rtrim()函数类似于trim()函数,但是ltrim()只处理字符串左边,rtrim()函数只处理字符串右边
2.格式化字符串以便显示
(1)使用HTML格式化:n12br()函数
n12br()函数用<br/>
标签代替字符串中的换行符,这对于一个长字符串在浏览器显示十分有用
html忽略空行,如果不使用n12br(),文本将成行显示
(2)为打印输出而格式化字符
php支持echo 和 print结构 打印字符串,print结构有返回值。除此之外php还有与C语言类似的打印函数printf() 和 sprintf(),实现一些更加复杂的格式
基本用法与C语言类似
1 | printf("order is %s.", $total); |
和C语言一样,printf()函数还有一些实用的参数
1 | %['padding-character'][-][width][.precision]type |
- “padding-character”,用于填充变量直到所指定的宽度,默认为空格
- “-“用于指明该域的数据为左对齐
- “width”,为被替换的变量留下多少字符空间
- “.precision”指明小数点显示的位数
转换说明类型码
3.改变字符串的字母大小写
实际上应用的场合并不多
字符串大小写转换函数
4.格式化字符串以便存储
格式化字符,除了用于打印到html页面,还可以应用于存储到数据库。
(1)问题的出现
在数据库中,某些数据的引号字符,反斜杠和NULL字符会被解释为控制符,因此我们需要找到一种标记或转义它们的方法,以便数据库可以理解它们的意思
(2)解决问题的原理
要对这些字符进行转义处理,只需要在它们面前加一个反斜杠
(3)php的解决方法
php专门提供了两个用于转义字符串的函数,在将任何字符串存入数据库之前可以使用addslashes()将它们格式化(实际上就是为这些特殊字符加上反斜杠),而Stripslashes()会移除这些反斜杠
1 | $feedback = addslashes(trim($_POST['feedback'])); |
连接分割字符串
通常我们想查看字符串的各个部分。例如,查看句子中的英文单词,或者将一个域名或电子邮件地址分割成一个个部分,这时候就要用到几个字符串函数或者正则表达式函数来实现
1.一些常用连接字符串函数
函数 | 功能 | 案例 |
---|---|---|
explode() | 指定分隔字符将字符串本身分割成小块,并返回到一个数组中 | $email_array = explode('@', $email); |
impldoe(),join() | 功能和函数explode()相反,用字符将数组里的元素连接起来 | $new_email = implode('@', $email_array); |
strtok() | 将字符串分割成子字符串,可规定多个分割字符 | $token = strtok($string, " "); |
substr() | 访问一个字符串给定起点和终点的子字符串,注意第一个字符从0开始 | substr($test, 5, -13); |
比较字符串
php可以直接使用“==”来比较两个字符是否相等,但有些时候我们还需要更加复杂的比较
1.常用的比较字符串函数
函数 | 功能 | 案例 |
---|---|---|
strcmp() | 对两个字符串进行比较,相等则返回0,按字典顺序大于则返回正数,小于则返回负数,区分大小写 | 无 |
strcasecmp() | 功能与strcmp()基本一致,但是区分大小写 | 无 |
strnatcmp() | 不是按照字典顺序来比较而是按自然顺序来比较 | 无 |
strlen() | 检查字符串长度 | echo strlen(“hello”); |
字符串匹配
很多情况下我们需要在字符串中提取子字符串关键字,这里我们就需要用一些特定的字符串函数对一个字符串进行搜索
1.常用字符串匹配函数
函数 | 功能 | 案例 |
---|---|---|
strstr() | 在字符串中查找匹配的字符串或字符,并返回一个子字符串,如果出现不止一个目标关键字,则从第一个出现的开始返回 | strstr($feedback, 'shop') |
stropos() | 在字符串中查找匹配的字符串或字符,默认返回第一个子字符串出现的位置,也可以指定查询位置 | echo strpos($test, "o", 5); |
strrpos() | 在字符串中查找匹配的字符串或字符,并返回最后子字符串出现的位置 | 无 |
str_replace() | 可以通过数组的方式来传递所有参数,可以很好地完成字符串的替换 | $feedback = str_replace($offcolor, "%!@*", $feedback); //$offcolor数组是屏蔽关键词,“”内的是屏蔽用语,$feedback是屏蔽的字符串对象 |
substr_replace() | 在给定位置中查找和替换特定的子字符串,length表示php停止操作的位置 | $test = substr_replace($test, 'X', -1); |
正则表达式
之前我们所使用的字符串函数只适用于精确匹配,如果希望完成一些更复杂的匹配模式,我们需要用到正则表达式来取代之前函数提到的功能,比如如果有多个匹配关键词,要使用多个字符串函数,而正则表达式可以一步到位
1.基础知识
正则表达式是一种描述一段文本模式的方法,匹配正则表达式更有点像 strstr()匹配,而不像相等比较:例如,字符串“shop”匹配正则表达式“shop”。它也可以匹配正则表达式“h”,“ho”等。此外还可以指定表达式的元意。
2.字符集和类
字符集可以用于匹配属特定类型的任何字符;事实上它们是一种通配符。
(1)我们可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符
1 | .at //可以匹配到cat,mat,#at |
任何一个方括号[]内的内容都是一个字符类—— 一个被匹配字符所属的字符集合,方括号表达式只匹配一个字符
(2)其他常用字符集
3.重复
当我们想指定某个字符串或字符类出现不止一次,可以用*表示重复了0-n次,用+表示重复了1-n次。
1 | [[:alnum:]]+ //表示至少有一个字母字符 |
4.子表达式
通常,我们往往会将一个表达式分隔为几个表达式,用以表示至少这些字符串中有一个需要精准匹配。可以使用圆括号来表示
(1)一般形式
1 | (very)*large //可以匹配到large, very large, very very large |
(2)子表达式计数
可以用花括号的表达式指定内容允许重复的次数
1 | (very){1,3} //允许重复1-3次 |
5.定位字符串的开始或末尾
脱字符号、(^)用于正则表达式的开始,表示子字符串必须出现在被搜索字符串的开始处,字符“s”用于正则表达式的末尾,表示子字符串必须出现在字符串的末尾
1 | ^bob //从字符串开始处匹配bob |
6.分支
正则表达式用一条竖线表示多种选择
1 | com|edu|net //表示匹配com或edu或net |
7.匹配特殊字符
(1)要匹配特殊字符需要对它们进行转义,即在它们前面加一个反斜杠(\)。
(2)php中应将正则表达式放在一个单引号字符串中,使用双引号会带来一些不必要的复杂性
8.正则表达式特殊字符
9.使用正则表达式的php函数
函数 | 功能 | 案例 |
---|---|---|
ereg() | 该函数搜索字符串 search,在 pattern中寻找与正则表达式相匹配的字符串,并将它们存储在数组 matches中 | ereg('^[a-zA-z0-9_\-\.]+$',$email) |
ereg_replace() | 该函数在字符串 search中查找正则表达式 pattern的字符串,并且用字符串 replacement来替换 | ereg_ replace(string pattern, string replacement, string search); |
split() | 该函数将字符search分割成符合正则表达式模式的子字符串,然后将子字符串返回到数组中 | `$arr = split(‘. |
代码重用与函数编写
代码复用的好处
代码复用主要是程序员用于摸鱼偷懒(bushi),软件工程师的一个目标就是重复使用代码来避免编写新的代码,一个新的项目往往是这样创建的:将已有的可重新利用的组件进行组合,并将新的开发难度降低到最小。
主要优点如下:
- 降低成本
- 更加可靠
- 保持一致
引用函数库
PHP有两个非常重要的语句,require()或include()语句可以将一个文件载入PHP脚本中,通常这个文件包含任何希望在一个脚本中输出的内容(PHP语句,文本,html标记,PHP函数或PHP类),实际上,它们的功能类似于C语言的#include语句
1.文件拓展名和require()函数
require()可以载入文件,即将请求的文件替代内容后,继续执行脚本。我们约定载入文件的拓展名命名为“php”。在实际运用中,如果web页面具有一致的外观,可以在php中使用require()语句将模板加入页面。
PHP中使用函数
函数说一个给出了调用接口的自包含模板,它可以执行任务,还可以返回结果
1.函数调用
1 | phpinfo(); //无参数,输出php版本 |
一个具有多个可选值的函数,要按照从右到左顺序使用默认值
变量名区分大小写,函数名不区分大小写
2.函数声明
函数声明以关键字function开始,然后给出函数名称和必要的参数
1 | function my_function(){ |
内置函数在所有php脚本都可以用,但是如果声明了自己的函数,就只能在声明了它们的脚本使用。将经常用到的函数包含在一个文件中是一个很好的解决方案,然后再使用require()引用。
如果希望在一个函数退出php并输入html脚本,可以使用一个封闭的php标记再编写html脚本
1 |
|
可变函数:
1 | $name(); //以name变量的值作为函数名称 |
3.函数作用域
- 函数内部声明的变量只能再在该函数内用,这是函数作用域或者说是局部变量
- 在函数外部声明的变量作用在从该语句开始的整个文档,这是全局作用域
- require()和include()不影响作用域
使用参数
1.参数设置
函数中可以设置参数默认值,变成可选项
1 | //声明 |
2.参数帮助器
func_num_arg()
:返回参数的个数
func_get_args()
:返回参数组成的数组
3.参数的引用传递和值传递
一般来说,函数参数的传递是值传递,当传递一个参数时,函数内会新建一个变量来存储原来变量的副本,无论怎么修改也不会影响原来的变量
所以我们可以使用引用传递(类似于C语言的指针),这时函数不会创建一个新的变量,而是获得了一个原来变量的引用指向原来的值,任何对该引用的修改都会影响原始变量值。
在参数面前加一个地址符’&’,指定该参数为引用传递
1 | function increment(&$value, $amount = 1){ |
Return关键字的运用
1.终止函数的执行
1 | function larger($x, $y){ |
isset语句可以判断一个变量是否被创建并赋值,如果没有则报错,并return结束函数执行
2.从函数返回一个值
1 | function larger($x, $y){ |
函数递归
递归 函数就是自己调用自己,适用于浏览动态数据结构(连接列表和树),而且比循环慢也占用更多的内存,所以基本很少用(虽然递归的代码更简短,美观)
PHP的面向对象
PHP创建类,属性和操作
1.类的结构
我们用class
声明类,声明属性变量时要用public, private, protected这些关键字,这与变量的作用域有关。声明类的操作则用声明函数的方法
1 | class student{ |
2.构造函数
大多数类都有一种称为构造函数的特殊操作。其作用为当创建一个对象时会自动调用构造函数,所以常常用于设置属性的初始值或创建该对象的其他对象
1 | class classname{ |
构造函数的函数名一定为__construct
3.析构函数
与构造函数相对,其作用是在销毁一个类时执行的操作或完成的一些功能。析构函数的函数名称为__destruct()
不能带任何参数
类的实例化
创建一个对象即实例化了一个类。可以使用”new“来创建一个类,需要指定创建的对象属于哪一个类,并通过构造函数提供所需的参数。
1 | class classname{ |
使用类的属性
1.内部访问类
如果一个类的操作需要设置或访问该类的某个变量,我们可以用一个特殊的指针——$this 来实现
1 | class classname{ |
2.外部访问类
(1)直接访问
通过访问修饰符直接范围属性
1 | class student{ |
但通常来说,从类的外部直接访问类的属性是糟糕的想法
(2)推荐方案
我们可以通过__get()
和__set()
来实现对属性的访问,其案例如下
1 | class student{ |
之所以这样设置一个访问入口,就是要实现对保存的数据进行检查,确保数据是有意义的,可以修改一下__set()
函数的条件
1 | function __set($name,$value){ |
控制访问
访问修饰符用于控制属性和方法的可见性
- 默认选项是public(),公有的属性或方法可以在类的内部和外部进行访问
- private访问修饰符意味着被标记的属性或方法只能在类的内部进行访问,也可以选择使得部分方法成为私有的,例如,如果某些方法只是在类内部使用的工具性函数。私有的属性和方法将不会被继承
- protected访问修饰符意味着被标记的属性或方法只能在类内部进行访问。它也存在于任何子类
类操作的调用
与属性的调用类似
1 | class classname{ |
继承
1.继承基本操作
我们用extends
来表明继承关系。
1 | class B extends A{ |
B类具有A类所有的属性和操作,另外还有自己的一个属性和一个操作。注意继承是单向的!
2.选择性继承
我们可以使用private和protected访问修饰符控制需要继承的内容。
private:外部不可见,且不能继承
protected:外部不可见,但是可以继承
1 | class A{ |
3.重载
子类中可以声明新的属性和操作,我们也可以重复声明父类中有的属性和操作。一般用于子类属性赋予一个与父类不同的默认值,或修改父类中的操作。这种操作叫重载。
子类重载的属性和操作不会影响到父类
重载后,我们仍然可以用parent
关键字调用父类操作的初始版本,但是使用的是当前类的属性值
1 | parent::operation(); |
4.禁止继承和重载
我们可以使用final
禁止一个类中的某个操作或属性的重载,也可以直接禁止一个类的重载
5.多重继承
大多数的面向对象语言都不支持多重继承,php也一样(C++是支持多重继承的典型)。不支持多重继承即每一个类只能继承一个父类,一个只能有一个爸爸,一个爸爸却能有多个儿子�