PHP学习日记【二】-PHP 函数-数组与数据结构-PHP 中的正则表达式- IO 操作-检测文件属性函数
2.1 PHP 函数
函数的英文叫作: function,而function的解释项中有另外一个含义:功能。
函数就是功能。调用一个函数就是在调用一个功能。
语法规定如下:
function 函数名([参数名 1[=值 1], 参数名 2[=值 2], 参数名 n[=值 n]]) { 函数中的功能体 [return 返回值] }
例1:
<?php function security(){ echo '你要好好学习网络安全'; echo '否则,你就会找工作困难'; } security(); security(); ?>
例2:
<?php echo '//////函数传 1 个参数//////////'."<p>"; function oldboy($i){ echo '你要持续好好学习, '."<br>"; echo '否则等你到了' .$i."岁,就会被淘汰。 "."<br>"; } echo oldboy(34); ?>
例3:
<?php echo '//////函数传多个参数//////////'."<p>"; function oldgirl($x,$y){ echo '你要持续好好学习, '."<br>"; echo '否则等你到了' .$x."岁,就会被淘汰。 "."<br>"; echo '我在' . $y ."岁,的时候,就成为了黑客。 "."<br>"; } echo oldgirl(34,28); ?>
备注:
1、函数名只能是字母,数字,下划线组合,并且之间不能包含空格,数字不能放在变量名首位。
2、函数名与变量命名规则一样,但是不同的是:函数名不区分大小写
3、函数体的参数若是定义了,未传参数,代码会报错
4、函数后参数如果有默认值,参数可以不填,代码也不会报错
5. 函数后的参数可以写多个
6. 函数后如果有默认值和无默认值的参数,通常把无默认值的参数写在最前面
7. 函数体的变量与函数体外的变量没有关系
9. 函数体中若有return,return 后的代码不执行
8. 函数执行完后,return 可把函数体内的值,带带函数体外
9. 函数的执行没有顺序关系,可以在定义处之前的位置调用
10. 函数不能重载。
函数案例: 网页表单提交
<html> <head> <title>实验</title> </head> <body> <!--先用 POST 来实验,以后你可以改成 GET 哟 --> <form action="glob.php" method="post"> <input type="text" name="hongniu" /><br /> <input type="submit" value="提交" /> </form> </body> </html>
将html的内容通过form表单提交给了glob.php页面,我们现在来写glob.php:
<?php function demo(){ echo $_POST['hongniu']; } demo(); ?>
2.1.1 文件包含函数
在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这些代码的文件只需要包含这个文件即可。这种方法有助于提高代码的重用性,给代码的编写与维护带来很大的便利。在PHP中, 有require、 require_once、 include、 include- once四种方法包含一个文件 。
函数 | 包含失败 | 特点 |
include | 返回一条警告 | 文件继续向下执行。通常用于动态包含 |
require | 一个致命的错 | 代码就不会继续向下执行。通常包含极为重要的文件,整个代码甭想执行 |
include_once | 返回一条警告 | 除了原有 include 的功能以外,它还会做 once 检测,如果文件曾经已经被被包含过,不再包含 |
require_once | 一个致命的错 | 除了原的功能一外,会做一次 once 检测,防止文件反复被包含 |
include包含函数的功能。
创建一个functions.php文件,里面写上两个函数:
<?php //functions.php 文件 function demo(){ echo 'oldboy'; } function test(){ echo 'oldgirl'; } ?>
在functions.php的同级目录下,我再创建一个user.php文件把functions.php文件包含进来。这样我的函数就可以专门放在functions.php里面,哪儿需要用到这些函数的时候,我就从哪儿包含进来:
<?php //user.php include 'functions.php'; //可以直接调用 demo();test(); ?>
2.1.2 数学常用涵数
函数名 | 描述 | 实例 | 输 入 | 输 出 |
abs() | 求绝对值 | $abs = abs(-4.2); //4.2 | 数字 | 绝对值数字 |
ceil() | 进一法取整 | echo ceil(9.999); // 10 | 浮点数 | 进一取整 |
floor() | 舍去法取整 | echo floor(9.999); // 9 | 浮点数 | 直接舍去小数部分 |
fmod() | 浮点数取余 | "$x = 5.7;$y = 1.3;$r = fmod($x,$y);// $r equals 0.5, because 4* 1.3 + 0.5 = 5.7 " | 两个浮点数,x>y | 浮点余数 |
pow() | 返回数的 n 次方 | echo pow(-1, 20); // 1 | 基础数 n次方 | 乘方值 |
round() | 浮点数四舍五入 | echo round(1.95583, 2);// 1.96 | 一个数值 | 保留小数点后多少位,默认为0入后的结果 |
sqrt() | 求平方根 | echo sqrt(9); //3 | 被开方的数 | 平方根 |
max() | 求最大值 | "echo max(1, 3, 5, 6, 7); // 7 echo max(array(2, 4, 5)); // 5" | 多个数字或数组 | 返回其中的最大值 |
min() | 求最小值 | min | 多个数字或数组 | 返回其中的最小值 |
mt_rand() | 更好的随机数 | echo mt_rand(0,9);//n | 最小/最大,随机数 | 随机返回范围内的值 |
rand() | 随机数 | echo rand() | 最小/最大,随机数 | 随机返回范围内的值 |
pi() | 获取圆周率值 | echo pi(); // 3.1415926535898 | 无 | 获取圆周率 |
2.1.3 字符串常用涵数
函数名 | 描述 | 实例 |
trim() | 删除字符串两端的空格或其他预定义字符 | "$str = "\r\nHello World!\r\n"; echo trim($str); |
rtrim() | 删除字符串右边的空格或其他预定义字符 | "$str = "Hello World!\n\n"; echo rtrim($str);" |
chop() | rtrim()的别名 | 同上 |
ltrim() | 删除字符串左边的空格或其他预定义字符 | "$str = "\r\nHello World!"; echoltrim($str);" |
dirname() | 回路径中的目录部分(我们把它归在了字符串函数里了) | echo dirname("c:/testweb/home.php"); |
str_pad() | 把字符串填充为指定的长度 | $str = "Hello World"; echo str_pad($str,20,"."); |
str_repeat() | 重复使用指定字符串 | echo str_repeat(".",13); |
str_split() | 把字符串分割到数组中 | print_r(str_split("Hello")); |
strrev() | 反转字符串 | echo strrev("Hello World!"); |
wordwrap() | 按照指定长度对字符串进行折行 处理 |
"$str = ""An example on a long word is: Supercalifragulistic"";echo wordwrap($str,15);" |
str_shuffle() | 随机地打乱字符串中所有字符 | echo str_shuffle("Hello World"); |
parse_str() | 将字符串解析成变量 | "parse_str("id=23&name=John%20Adams",$myArray); print_r($myArray);" |
number_format() | 通过千位分组来格式化数字 |
"echo number_format("1000000"); echo number_format("1000000",2); echo number_format("1000000",2,"","",""."");" |
strtolower() | 字符串转为小写 | echo strtolower("Hello WORLD!"); |
strtoupper() | 字符串转为大写 | echo strtoupper("Hello WORLD!"); |
ucfirst() | 字符串首字母大写 | echo ucfirst("hello world"); |
ucwords() | 字符串每个单词首字符转为大写 | echo ucwords("hello world"); |
htmlentities() | 把字符转为 HTML 实体 | $str = ""John & 'Adams'""; echo htmlentities($str, ENT_COMPAT); |
htmlspecialchars() | 预定义字符转 html 编码 | |
nl2br() | \n 转义为标签 | echo nl2br("One line.\nAnotherline."); |
strip_tags() | 剥去 HTML、 XML 以及 PHP的标签 | echo strip_tags("Hello world!"); |
addcslashes() | 在指定的字符前添加反斜线转义字符串中字符 | $str = ""Hello, my name is John Adams." echo $str; echo addcslashes($str,'m');" |
stripcslashes() | 删除由 addcslashes()添加的反斜线 | echo stripcslashes("Hello, \myna\me is Kai Ji\m."); |
addslashes() | 指定预定义字符前添加反斜线 | $str = "Who's John Adams?";echo addslashes($str); |
stripslashes() | 删除由 addslashes()添加的转义字符 | echo stripslashes("Who\'s John Adams?"); |
quotemeta() | 在字符串中某些预定义的字符前添加反斜线 |
$str = "Hello world. (can you hear me?)"; echo quotemeta($str); |
chr() | 从指定的 ASCII 值返回字符 | echo chr(052); |
ord() | 返回字符串第一个字符的 ASCII值 | echo ord("hello"); |
strcasecmp() | 不区分大小写比较两字符串 | echo strcasecmp("Hello world!","HELLO WORLD!"); |
strcmp() | 区分大小写比较两字符串 | |
strncmp() | 比较字符串前 n 个字符,区分大小写 | |
strncasecmp() | 比较字符串前 n 个字符,不区分大小写 | int strncasecmp ( string $str1 ,string $str2 , int $len ) |
strnatcmp() | 自然顺序法比较字符串长度,区分大小写 | int strnatcmp ( string $str1 ,string $str2 ) |
strnatcasecmp() | 自然顺序法比较字符串长度,不区分大小写 | int strnatcasecmp ( string $str1 ,string $str2 ) |
chunk_split() | 将字符串分成小块 | str chunk_split(str $body[,int $len[,str $end]]) |
strtok() | 切开字符串 | str strtok(str $str,str $token) |
explode() | 使用一个字符串为标志分割另一个字符串 | array explode(str $sep,str $str[,int $limit]) |
implode() | 同 join,将数组值用预订字符连接成字符串 | string implode ( string $glue ,array $pieces ) |
substr() | 截取字符串 | string substr ( string $string , int $start [, int $length ] ) |
str_replace() | 字符串替换操作,区分大小写 | mix str_replace(mix $search,,mix $replace,mix $subject[,int &$num]) |
str_ireplace() | 字符串替换操作,不区分大小写 | mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] ) |
substr_count() | 统计一个字符串,在另一个字符串中出现次数 | int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] ) |
substr_replace() | 替换字符串中某串为另一个字符串 | mixed substr_replace ( mixed $string , string $replacement , int $start [, int $length ] ) |
similar_text() | 返回两字符串相同字符的数量 | int similar_text(str $str1,str $str2) |
strchr() | 返回一个字符串在另一个字符串中开始位置到结束的字符串 | string strstr ( string $str, string $needle , bool $before_needle ) |
strrchr() | 返回一个字符串在另一个字符串中最后一次出现位置开始到末尾的字符串 | string strrchr ( string $haystack ,mixed $needle ) |
stristr() | 返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写 | string stristr ( string $haystack ,mixed $needle [, bool $before_needle = false ] ) |
strtr() | 转换字符串中的某些字符 | string strtr ( string $str , string $from , string $to ) |
strpos() | 寻找字符串中某字符最先出现的位置 | int strpos ( string $haystack ,mixed $needle [, int $offset =0 ] ) |
stripos() | 寻找字符串中某字符最先出现的位置,不区分大小写 | int stripos ( string $haystack ,string $needle [, int $offset ] ) |
strrpos() | 寻找某字符串中某字符最后出现的位置 | int strrpos ( string $haystack ,string $needle [, int $offset =0 ] ) |
strripos() | 寻找某字符串中某字符最后出现 的位置,不区分大小写 |
int strripos ( string $haystack ,string $needle [, int $offset ] ) |
strspn() | 返回字符串中首次符合 mask 的 子字符串长度 |
int strspn ( string $str1 , string $str2 [, int $start [, int $length ]] ) |
strcspn() | 返回字符串中不符合 mask 的字符串的长度 | int strcspn ( string $str1 , string $str2 [, int $start [, int $length ]] ) |
str_word_count() | 统计字符串含有的单词数 | mix str_word_count(str $str,[]) |
strlen() | 统计字符串长度 | int strlen(str $str) |
count_chars() | 统计字符串中所有字母出现次数(0..255) | mixed count_chars ( string$string [, int $mode ] ) |
md5() | 字符串 md5 编码 | $str = "Hello"; echo md5($str) |
iconv | ||
mb_substr | 获取字符串的部分 | string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] ) |
mb_http_output | 设置/获取 HTTP 输出字符编码 | mixed mb_http_output ([ string $encoding = mb_http_output() ] ) |
mb_strlen | 获取字符串的长度 | mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] ) |
iconv | 字符串按要求的字符编码来转换 | string iconv ( string $in_charset , string $out_charset , string $str ) |
iconv_substr | 截取字符串的部分 | |
iconv_get_encoding | 获取 iconv 扩展的内部配置变量 | |
mb_substr_count | 统计字符串出现的次数 | |
mb_check_encoding | 检查字符串在指定的编码里是否有效 | |
mb_strrpos | 查找字符串在一个字符串中最后出现的位置 | |
mb_split | 使用正则表达式分割多字节字符串 | |
parse_url | 解释 URL 成为一个数组 |
注: mb_* 和 iconv_* 他们可以处理多字节字符,例如:中文。
中文主要用的是 GBK 和 utf-8 两种编码格式。GBK 和 utf-8 是两个不同的编码委员会对于汉字进行的编码的标准。他们规定 GBK 是双字节,也就是一个汉字占用 2Bytes。utf-8 是三字节,一个汉字占用三个字节长度的存储空间。
2.1.4 时间信息函数
<?php $mytime = getdate(); echo "年 :".$mytime['year']."<br>"; echo "月 :".$mytime['mon']."<br>"; echo "日 :".$mytime['mday']."<br>"; echo "时 :".$mytime['hours']."<br>"; echo "分 :".$mytime['minutes']."<br>"; echo "秒 :".$mytime['seconds']."<br>"; echo "一个小时中的第几钟 :".$mytime['minutes']."<br>"; echo "这是一分钟的第几秒 :".$mytime['seconds']."<br>"; echo "星期名称 :".$mytime['weekday']."<br>"; echo "月份名称 :".$mytime['month']."<br>"; echo "时间戳 :".$mytime[0]."<br>";?>
2.2PHP 数组与数据结构
数组的英文是array,可以存入多个不同类型的数据,是一个复合数据类型。
案例:
<?php $shu = array(1 , 1.5 , true ,'天王盖地虎,小鸡炖蘑菇','老男孩的学生最牛逼'); echo '<pre>'; var_dump($shu); echo '</pre>'; ?>
在上例中,我们发现我们存入了: 1.整型 2.浮点 3.布尔 4.字符串
注:上例中echo pre这个标签的主要目的是为原样输出,格式展示的更好看,更清晰。我们用var_dump()打印出来显示看一下效果:
注:
索引数组的下标必须要从0开始吗?
答:这个问题其实不然,索引数组并不一定要从0开始。
那如何能够不从0开始呢?
答:需要用到大家在上面学的一小块知识哟。就是键值对应符。我们来动手写写。
<?php $kele = array('努力才能博得未来',10 => 'NoAlike', 'PHP 中文网' , '学 PHP', 19 => '苹果和梨子我都爱' , '橘子我最爱'); //打印显示$kele echo '<pre>'; var_dump($kele); echo '</pre>'; ?>
2.2.1 for循环遍历索引数组
<?php //声明一个数组,值为 1 到 10 $num = array(1,2,3,4,5,6,7,8,9,10); //按照索引数组的特点,下标从 0 开始。所以 1 的下标为 0, 10 的下标为 9 echo $num[0].'<br />'; echo $num[9].'<br />'; //我们可以得到数组中元素的总个数,为 10 echo count($num) .'<br />'; //遍历这个索引数组的话,我们就可以定义一个变量为$i //$i 的值为 0,从 0 开始 //可以设定一个循环条件为: $i 在下标的(9)最大值之内循环 for($i = 0 ; $i < count($num) ; $i++){ echo $num[$i].'<br />'; }?>
通过上面的例子就把数组进行了循环。因为下标是从0开始的,定义$i=0 。每次循环的时候让$i 加1 ,但是必须要小于10,因为数组下标的最大值为9
foreach语句用于循环遍历数组。
每进行一次循环,当前数组元素的值就会被赋值给value变量(数组指针会逐一地移动)以此类推。
<?php echo "for each 数组例子: "."<br>"; $array = ['oldboy', 'oldgirl', 'littleboy']; foreach ($array as $value){ echo "值是: " . $value; echo "<br/>"; } foreach ($array as $key => $value) { echo "键名是: " . $key . ",值是: " . $value; echo "<br/>"; } /* 输出: for each 数组例子: 值是: oldboy 值是: oldgirl 值是: littleboy 键名是: 0,值是: oldboy 键名是: 1,值是: oldgirl 键名是: 2,值是: littleboy */ // explode()函数 echo "explode(),把字符串分割为数组例子: "."<br>"; $str = "I am oldboy, I like girls"; print_r(explode(" ",$str))."<br/>"; //输出://explode(),把字符串分割为数组例子: //Array ( [0] => I [1] => am [2] => oldboy, [3] => I [4] => like [5] => girls ) $row=explode(" ",$str); foreach ($row as $value){ echo "值是: " . $value; echo "<br/>"; } /* 输出: 值是: I 值是: am 值是: oldboy, 值是: I 值是: like 值是: girls */ ?>
list() 函数用数组中的元素为一组变量赋值
<?php echo "list(),用数组中的元素为一组变量赋值。 "."<br>"; $arr = array('oldboy',35,'M'); list($username,$age,$sex)=$arr; echo $username."<br>"; echo $age."<br>"; echo $sex."<br>"; /* 输出 list(),用数组中的元素为一组变量赋值。 oldboy 35 M */ ?>
2.2.2 常用操作数组函数
函数 | 功能 |
array_shift | 弹出数组中的第一个元素 |
array_unshift | 在数组的开始处压入元素 |
array_push | 向数组的末尾处压入元素 |
array_pop | 弹出数组末尾的最后一个元素 |
current | 读出指针当前位置的值 |
key | 读出指针当前位置的键 |
next | 指针向下移 |
prev | 向上移 |
reset | 指针到开始处 |
end | 指针到结束处 |
基础面试中最爱问到的
函数名 | 功能 |
array_combine() | 生成一个数组,用一个数组的值作为键名,另一个数组值作为值 |
range() | 创建并返回一个包含指定范围的元素的数组。 |
compact() | 创建一个由参数所带变量组成的数组 |
array_fill() | 用给定的值生成数组 |
array_chunk() | 把一个数组分割为新的数组块 |
array_merge() | 把两个或多个数组合并为一个数组 |
array_slice() | 在数组中根据条件取出一段值,并返回 |
array_diff() | 返回两个数组的差集数组 |
array_search() | 在数组中搜索给定的值,如果成功则返回相应的键名 |
array_splice() | 把数组中的一部分去掉并用其它值取代 |
array_sum() | 计算数组中所有值的和 |
in_array() | 检查数组中是否存在某个值 |
array_key_exists() | 检查给定的键名或索引是否存在于数组中 |
shuffle() | 将数组打乱,保留键值 |
count() | 计算数组中的单元数目或对象中的属性个数 |
array_flip() | 返回一个键值反转后的数组 |
array_keys() | 返回数组所有的键,组成一个数组 |
array_values() | 返回数组中所有值,组成一个数组 |
array_reverse() | 返回一个元素顺序相反的数组 |
array_count_values() | 统计数组中所有的值出现的次数 |
array_rand() | 从数组中随机抽取一个或多个元素,注意是键名 |
array_unique() | 删除重复值,返回剩余数组 |
sort() | 按升序对给定数组的值排序,不保留键名 |
rsort() | 对数组逆向排序,不保留键名 |
asort() | 对数组排序,保持索引关系 |
arsort() | 对数组逆向排序,保持索引关系 |
ksort() | 按键名对数组排序 |
krsort() | 将数组按照键逆向排序 |
natsort() | 用自然顺序算法对数组中的元素排序 |
natcasesort() | 自然排序,不区分大小写 |
array_filter() | 去掉数组中的空元素或者预定元素 |
extract | 将键变为变量名,将值变为变量值 |
arsort() | 对数组逆向排序,保持索引关系 |
ksort() | 按键名对数组排序 |
krsort() | 将数组按照键逆向排序 |
natsort() | 用自然顺序算法对数组中的元素排序 |
natcasesort() | 自然排序,不区分大小写 |
array_filter() | 去掉数组中的空元素或者预定元素 |
extract | 将键变为变量名,将值变为变量值 |
功能:弹出数组中的第一个元素
<?php $mingren = array("邓超", "黄晓明", "宁泽涛", "钟汉良"); $dc = array_shift($mingren); echo $dc .'<br />'; print_r($mingren); //print_r() 函数用于打印变量,以更容易理解的形式展示。 ?>
2.3 PHP 中的正则表达式
正则表达示我们其实之前经常看到,它主要用在以下一些地方:匹配邮箱、手机号码、验证码、 替换敏感的关键词。例如:涉及政治和骂人的话PHP的正则表达示定界符的规定如下:
定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束。
我们来例几个例子:
例子 | 说明 |
/中间写正则/ | 正确 |
$中间写正则$ | 正确 |
%中间写正则% | 正确 |
^中间写正则^ | 正确 |
@中间写正则@ | 正确 |
(中间写正则) | 错误 |
A 中间写正则 A | 错误 |
注: \ 是转义字符,如果在以后正则表达示里面需要匹配/,如下图:
/ / /
这个时候真要匹配/ 的时候,需要把定界符里面的/ 用转义字符转义一下,写成下面的例子:
/ \/ /
如果你觉得麻烦,遇到这种需要转义的字符的时候可以把两个正斜线(/ /)定界,改为其他的定界符(# #)。
正规表代式格式:
int preg_match ( string $正则 , string $字符串 [, array &$结果] )
功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。
<?php $zz = '/oldboy/'; $string = 'sssssoldboyaaaaa'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为: '; var_dump($matches); }else{ echo '没有匹配到'; } ?>
我们常用的正则函数有:
函数名 | 功能 |
preg_filter | 执行一个正则表达式搜索和替换 |
preg_grep | 返回匹配模式的数组条目 |
preg_match | 执行一个正则表达式匹配 |
preg_match_all | 执行一个全局正则表达式匹配 |
preg_replace_callback_array | 传入数组,执行一个正则表达式搜索和替换使用回调 |
preg_replace_callback | 执行一个正则表达式搜索并且使用一个回调进行替换 |
preg_replace | 执行一个正则表达式的搜索和替换 |
preg_split | 通过一个正则表达式分隔字符串 |
2.4 PHP IO 操作
我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。在电脑里面进行的这些操作,在代码里面如果能操作就好了。因为,如果有了这些操作。我们能做很多事情了:
可不可以写入修改配置文件?
是不是可以做PHP安装的时候检测文件的权限
是不是可以做生成Html文件等等很多不同的操作
..... 其他太多太多的地方用到了文件操作。
2.4.1 fopen、 fread、 fclose操作读取文件
2.4.1.1readfile读取文件
那如何读取一个文件呢?我们先学一个函数。
int readfile ( string $文件名)
功能:传入一个文件路径,输出一个文件。
下面的这一段代码中,只要传入文件名或者指定的文件路径就把文件读取出来了。
<?php //linux 类的读了方式 //readfile("/home/paul/test.txt"); //windows 类的读取方式 readfile("c:\sysctl.conf"); ?>
注意:上面的代码中 windows 的斜线是\斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线
2.4.2.2file_get_contents打开文件
<?php $filename = "d:\passwd"; $filestring = file_get_contents($filename); echo $filestring; ?>
2.4.2.3 fopen、 fread、 fclose操作读取文件
上面file_get_contents打开文件的方式简单、粗暴。下面的
resource fopen ( string $文件名, string 模式)
string fread ( resource $操作资源, int 读取长度)
bool fclose ( resource $操作资源 )
fopen 的模式有下面几个
模式 | 说明 |
r | 只读方式打开,将文件指针指向文件头。 |
r+ | 读写方式打开,将文件指针指向文件头。 |
w | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
w+ | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
a | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建 |
a+ | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之 |
x | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen() 调用失败并返回 FALSE,并生成一条E_WARNING 级别的错误信息。如果文件不存在则尝试创建 |
x+ | 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建 |
常用函数:
打开文件 fopen(), 关闭文件 fclose(), 检测文件末尾 feof(), 逐行读取文件 fgets()
整体实例:逐行读取文件,直到文件末尾为止:
<?php $file = fopen("d:\passwd", "r") or exit("无法打开文件!"); // 读取文件每一行,直到文件结尾 while(!feof($file)) { echo fgets($file). "<br>"; } fclose($file); ?>
2.4.2 php 创建和修改文件内容
2.4.2.1 file_put_contents写入文件
入文件的方式:
int file_put_contents ( string $文件路径, string $写入数据])
功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
<?php $data = "在老男孩学好网络安全,妹子票子不再话下! "; $numbytes = file_put_contents('big.txt', $data); if($numbytes){ echo '写入成功,我们读取看看结果试试: '; echo file_get_contents('big.txt'); }else{ echo '写入失败或者没有权限,注意检查'; } ?>
2.4.2.2 fwrite配合fopen进行写入操作
<?php $filename = 'test.txt'; $fp= fopen($filename, "w"); $len = fwrite($fp, '我是一只来自北方的狼,却在南方冻成了狗'); fclose($fp); print $len .'字节被写入了\n'; ?>
总结:
1.不论有没有新建都会打开文件重新写入
2.原有的文件内容会被覆盖掉
3.文件不存在会创建
模式 | 说明 |
r | 只能读不能使用 fwrite 写 |
r+ | 可操作读、写 |
w | 只可以写功能 |
w+ | 即可读又可以写 |
x | 每次写入会干掉原有文件的内容,文件不存在都会创建 |
a | 每次写入都会向文件的尾端追加内容 |
注: a+ 是增强的追加功能。可以读取时也可以使用
2.4.3 php 创建临时文件
我们之前创建的文件都是永久文件。而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处:文完后即删除不需要去维护这个文件的删除状态。
<?php //创建了一个临时文件 $handle = tmpfile(); //向里面写入了数据 $numbytes = fwrite($handle, '写入临时文件'); //关闭临时文件,文件即被删除 fclose($handle); echo '向临时文件中写入了'.$numbytes . '个字节'; ?>
2.4.4 移动、拷贝和删除文件
2.4.4.1 重命名文件
bool rename($旧名,$新名);
这个函数返回一个 bool 值,将旧的名字改为新的名字。
<?php //旧文件名 $filename = 'test.txt'; //新文件名 $filename2 = $filename . '.oldboy'; //复制文件rename($filename, $filename2); ?>
2.4.4.2 复制文件
bool copy(源文件,目标文件)
功能:将指定路径的源文件,复制一份到目标文件的位置。
<?php //旧文件名 $filename = 'copy.txt'; //新文件名 $filename2 = $filename . '_new'; //修改名字。 copy($filename, $filename2); ?>
2.4.4.3 删除文件
删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是 windows 电脑,你在回收站看不到这个文件。
bool unlink(指定路径的文件)
<?php $filename = 'test.txt'; if (unlink($filename)) { echo "删除文件成功 $filename!\n"; } else { echo "删除 $filename 失败!\n"; } ?>
2.5 检测文件属性函数
我们假设安装界面的网址是: install.php,安装的锁文件是install.lock。我们就可
以检测install.lock文件是否存在。
<?php if(file_exists('install.lock')){ echo '已安装,请不要再次进行安装'; exit; } ?>
常用文件属性函数
bool file_exists ( $指定文件名或者文件路径) 功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径) 功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径) 功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径) 功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径) 功能:是否是文件
bool is_dir ( $指定文件名或者文件路径) 功能:是否是目录
void clearstatcache ( void ) 功能:清楚文件的状态缓存
2.6 目录处理函数
处理文件夹的基本思想如下:
1.读取某个路径的时候判断是否是文件夹
2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量
3.使用readdir读取一次目录中的文件,目录指针向后偏移一次
4.使用readdir读取到最后,没有可读的文件返回false
5.关闭文件目录
函数名 | 功能 |
opendir |
打开文件夹,返回操作资源 |
readdir | 读取文件夹资源 |
is_dir | 判断是否是文件夹 |
closedir | 关闭文件夹操作资源 |
filetype | 显示是文件夹还是文件,文件显示 file,文件夹显示 dir |
<?php //设置打开的目录是 D 盘 $dir = "d:/"; //判断是否是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取到最后返回 false,停止循环 while (($file = readdir($dh)) !== false) { echo "文件名为: $file : 文件的类型 是: " . filetype($dir . $file) . "<br />"; } closedir($dh); } } ?>
2.7 php文件权限设置
chmod 主要是修改文件的的权限, 本节在 Linux 下实现:
[root@pc1 blog]# cat oldboy_xiugai.php <?php chmod("/data/blog/oldboy.txt",0755); chmod("/data/blog/oldboy",0000); ?> 结果: [root@pc1 blog]# ls -l oldboy* -d d--------- 2 www www 6 4 月 13 12:36 oldboy -rwxr-xr-x 1 www www 0 4 月 13 12:36 oldboy
2.8 php文件路径函数
我们经常会遇到处理文件路径的情况。
例如:
1.文件后缀需要取出来
2.路径需要取出名字不取目录
3.只需要取出路径名中的目录路径
4.或者把网址中的各个部份进行解析取得独立值
5.甚至是自己组成一个url出来
... ....
很多地方都需要用路径处理类的函数。
常用的路径处理函数:
函数名 | 功能 |
pathinfo | 返回文件的各个组成部份 |
basename | 返回文件名 |
dirname | 文件目录部份 |
parse_url | 网址拆解成各部份 |
http_build_query | 生成 url 中的 query 字符串 |
http_build_url | 生成一个 url |
<?php $path_parts = pathinfo('d:/www/index.inc.php'); echo '文件目录名: '.$path_parts['dirname']."<br />"; echo '文件全名: '.$path_parts['basename']."<br />"; echo '文件扩展名: '.$path_parts['extension']."<br />"; echo '不包含扩展的文件名: '.$path_parts['filename']."<br />"; ?>
2.9 php实现文件留言本
2.9.1 文件结构:
1.index.php ---展示输入框和留言内容
2.write.php ---向messages.txt写入数据
message.txt ---存入聊天内容,文件当做数据库。
2.9.2代码展示
1.index.php文件
<?Php //设置时区 date_default_timezone_set('PRC'); //读文本内容,显示留言到顶部页面 @$string = file_get_contents('message.txt'); //如果$string 不为空的时候执行,也就是 message.txt 中有留言数据 if (!empty($string)) { //每一段留言有一个分格符,但是最后多出了一个&^。因此,要将&^删掉 $string = rtrim($string, '&^'); //以&^切成数组 $arr = explode('&^', $string); //将留言内容读取按条显示 foreach ($arr as $value) {//将用户名和内容分开 list($username, $content, $time) = explode('$#', $value); echo '用户名为<font color="gree">' . $username; echo '</font>内容为<font color="red">' . $content; echo '</font>时间为' . date('Y-m-d H:i:s', $time); echo '<hr />'; } } ?> <h1>文件留言本演示</h1> <form action="write.php" method="post"> 用户: <input type="text" name="username" /><br /> 留言: <textarea name="content"></textarea><br /> <input type="submit" value="提交" /> </form>
刚刚的展示内容,文件存储时: 1.段与段之间进行了分割。 2.内容与用户之间用一个特殊
的符号进行了分割
2.write.php,接下来是write.php写入留言至文件的代码:
<?php //追加方式打开文件 $fp=fopen('message.txt','a'); //设置时间 $time=time(); //得到用户名 $username=trim($_POST['username']); //得到内容 $content=trim($_POST['content']); //组合写入的字符串:内容和用户之间分开,使用$# //行与行之间分开,使用&^ $string=$username.'$#'.$content.'$#'.$time.'&^'; //写入文件 fwrite($fp,$string); //关闭文件 fclose($fp); header('location:index.php'); ?>