注:最后有面试挑战,看看自己掌握了吗
🍃博主昵称:
一拳必胜客
🌸博主寄语:欢迎点赞收藏关注哦,一起成为朋友一起成长;
特别鸣谢:木芯工作室 、Ivan from Russia
PHP是HTML语言的升级形式,语言结构仍然以HTML为核心。这么说吧,HTML是一张白纸,那么PHP就是一张白纸折起来的飞机。PHP比HTML功能更强。
echo输出HTML即可
echo '
直接echo输出HTML页面
单引号包围不解析变量
';
?>
heredoc和newdoc的语法结构都是以”<<<”开始,后面紧跟标识符名称,结束时所引用的标识符名称要和开始标识符名称相同,而且必须在该行的第一列,以分号结尾。
heredoc和newdoc的区别是:heredoc的开始标识符没有使用引号。而newdoc必须要使用单引号进行包裹。
$name = 'PHP';
$heredoc = <<<EOD
- $name 是世界上最好的语言!
- $name is the best programming language in the world !
EOD;
echo $heredoc;
$nowdoc = <<<'EOD'
- $name 是世界上最好的语言!
- $name is the best programming language in the world !
EOD;
echo $nowdoc;
3 HTML中嵌入PHP程序块
在HTML页面中,直接在需要输出的地方写上相关的代码就行。
//首先在这里写好相关的调用代码
function OutputTitle(){
echo 'TestPage';
}
function OutputContent(){
echo 'Hello!';
}
//然后再下面调用相关函数就可以了
?>
<!DOCTYPE html>
<html>
<head>
<title><?php OutputTitle(); ?></title>
</head>
<body>
<span><?php OutputContent(); ?></span>
</body>
</html>
自从PHP5.4开始,= ?>即使在短标记关闭的情况仍然可以使用。
因此,在HTML中嵌入PHP变量时使用这种短标记输出语法将会相当方便。
使用 = $var ?> 替代 令输出更加简便

header("content-type:text/html;charset=utf-8"); //设置编码
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
解决HTML中中文乱码问题方法
如果你的HTML文件文件出现了乱码问题,那么你可以在head标签里面加入UTF8编码(国际化编码):UTF-8是没有国家的编码,也就是独立于任何一种语言,任何语言都可以使用的。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
符号 说明
$x? 真代码段:假代码段 判断是否为真假 ? 真情况 : 假情况;
``(反引号) 反引号中间插代命令,执行系统命令,等价于shell_exec函数
@ 单行抑制错误,把这一行的错误不让它显示出来了,效率低不建议使用
=> 数组下标访问符
-> 对象访问符 instanceof 判断某个对象是否来自某个类,如果是的返回true,如果不是返回false
$x? 真代码段(只能写一句代码):假代码段(只能写一句代码);
代码如下:
$x = true;
$x ? $y = 5 : $y = 6;
//输出5
echo $y;
?>
ipconfig;反引号就更加特殊了,我们经常需要显示IP地址,在PHP里面可不可能显示我们windows的IP地址呢?用反引号,就可以执行我们的命令(不过有些虚拟服务器是禁止执行这些的命令脚本的):
echo ''
;
echo `ipconfig`;
echo '';
?>
上面的代码你执行看看效果,是不是显示出来了你机器的IP地址和一堆和IP相关的参数?
@符是指单行抑制错误,以后的章节我们还会讲解到。此处为了解级别。
//打开一个不存在的文件adfsafasdfasfasdfdsadf.txt,你运行一下会发现报错了。
//再前面再加上一个@符看看效果
$fp = fopen('adfsafasdfasfasdfdsadf.txt','r');
//@$fp = fopen('adfsafasdfasfasdfdsadf.txt','r');
?>

数组下标访问符,以后也会有一章讲解,此处了解一下就可以了:
$data = array('sina' =>'新浪' ,'sohu' => '搜狐');
?>
对象访问符->和instanceof 都是了解级别,以后也有专门的章节进行讲解:
//实例化一个对象
$obj = new StdClass();
//判断某对象是某由某个类实例化,如果是的则执行真
if($obj instanceof stdClass){
echo '真';
}else{
echo '假';
}
//向obj对象中追加一个成员属性为username
$obj -> username = 'PHP中文网';
echo $obj -> username;
?>
上面的所有例子中,除了三元运算符、@符、反引号外。其他的学习级别均为了解,在以后讲解的时候。知道有这个符号即可。
<form>
<input type="text" name="num1">
<select name="fh">
<option value="jia"> + </option>
<option value="jian"> - </option>
<option value="c"> x </option>
<option value="chu"> / </option>
<option value="qy"> % </option>
</select>
<input type="text" name="num2">
<input type="submit" value="运算" />
</form>
<?php
$num1 = $_GET['num1'];
$num2 = $_GET['num2'];
$fh = $_GET['fh'];
if(!is_numeric($num1) || !is_numeric($num2)){
echo '请输入数值类型';
}
if($fh == 'jia'){
echo $num1 . '+' . $num2 . '=' . ($num1+$num2);
}
if($fh=='jian'){
echo $num1 . '-' . $num2 . '=' . ($num1-$num2);
}
if($fh=='c'){
echo $num1 . 'x' . $num2 . '=' . ($num1*$num2);
}
if($fh=='chu'){
echo $num1 . '/' . $num2 . '=' . ($num1/$num2);
}
if($fh=='qy'){
echo $num1 . '%' . $num2 . '=' . ($num1%$num2);
}
?>
$i=0;
echo '';
while($i<100){
//0 - 9 为一行
//10 -19 为一行
//因此,每一行都能够被10求默,如为为10的时候,应该显示行开始的标签
if($i%10 == 0){
//为了隔行变色,每20,40,60每行的颜色不同的,因此我们又可以再进行一次取余运算
if($i%20==0){
echo '';
}else{
echo '';
}
}
echo ''.$i.' ';
$i++;
//同理,每一行结束是不是应该有一个 结束标签呢?
if($i%10==0){
echo ' ';
}
}
echo '
';
?>
上面的语法规定中发现了如下特点,产生如下语未能规定:
1.函数以**function开始** 2.function后面接空格,空格后接函数名 3.函数名与变量命名规则基本一样,但是不同的是:**函数名不区分大小写** 4.所谓参数其实就是变量 5.函数名后接括号,括号内跟参数,参数全都有[](中括号)括起来了,代表参数可填可不填 6.如果有参数的话,参数后可以接(=)等号,等号接默认值。参数值也是用[](中括号)括起来的,代表选填 7.函数后的参数变量,主要功能是把函数体外的变量值,传入函数体内来使用,函数体的变量和函数体外的变量通常是两个不 同的变量。 8.函数中的具体功能(功能体)用大括号括起来,代表这是一个函数的功能区间 9.函数可以有返回值也可以没有返回值,用[](中括号)括起来的,代表选填。 10.return后接空格,空格后接返回值,若有return,return后的代码均不执行。 11.函数的执行没有顺序关系,可以在定义处之前的位置调用 12.函数不能被定义两次,即**函数不能被重载**
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
function Demo(){
echo '如果是写代码的男人,我们需要更加承担来自家庭的责任
';
}
demo();
Demo();
DEMO();
?>
函数后的参数如果有默认值,参数可以不填,代码也不会报错
function test( $arg = 10){
echo $arg;
}
test();
test(88);
?>
是不是没有报错呀?并且显示了 10和出来了。
说明,参数如果传了,参数会带入函数中。如果函数没有传参数,会用参数后的默认值。
函数的执行没有顺序关系,可以在定义处之前的位置调用
demo();
function demo(){
$str = '爸爸妈妈年龄越来越大';
$str .= '大多数的孩子都是独生子女,更加应该负起责任';
echo $str;
}
demo();
?>
通过上例发现,函数在定义之前还是在定义之后都可以调用。也就是函数可以任意位置调用。
回调函数,可以配合匿名函数和变量函数实现更加优美、复杂的一种函数结构。
回调函数,就是在处理一个功能的时候,我让让这个功能自定义能力再强一些,我准许调用这个函数的时候,还可以传入一个函数配合、协助进行处理。
function woziji($one,$two,$func){
//我规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false
if(!is_callable($func)){
return false;
}
//我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
//$func是一个变量函数,参见变量函数这一章
echo $one + $two + $func($one,$two);
}
//我们定义几个函数试试
function plusx2( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
function jian( $x , $y ){
$result = $x - $y;
return $result;
}
//调用一下函数,woziji,向里面传入参数试试
echo woziji(20,10,'plusx2');
//将plusx2改成jian试试结果
echo woziji(20,10,'jian');
?>
没有函数名的函数。
匿名函数的第一种用法,直接把赋数赋值给变量,调用变量即为调用函数。
匿名函数的写法比较灵活。
$greet = function($name)
{
echo $name.',你好';
};
$greet('明天');
$greet('PHP中文网');
?>
上例中的函数体没有函数名,通过$greent加上括号来调用的,这就是匿名函数。
我们将之前的例子拿过来。实际使用场景中,我们要通过一个函数实现更多的功能。但是,我又不想专门定义一个函数。我们回顾一下,我们回调函数的例子:
function woziji($one,$two,$func){
//我规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false
if(!is_callable($func)){
return false;
}
//我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
//$func是一个变量函数,参见变量函数这一章
echo $one + $two + $func($one,$two);
}
woziji(20,30,function( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
);
?>
仔细推理一下过程哟。只不过在之前的章节当中,plusx2换成了我们的匿名函数:
function( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
?>
因此,函名函数在调用的时候没有函数名。我们可以采用以上的一些方法来使用匿名函数。
内部函数,是指在函数内部又声明了一个函数。
注意事项:
1.内部函数名,不能是已存在的函数名
2.假设在函数a里面定义了一个内部函数,不能定用两次函数a。
我们下面来看代码,你将很快的学习会:
function foo()
{
echo '我是函数foo哟,调一下我才会执行定义函数bar的过程
';
function bar()
{
echo '在foo函数内部有个函数叫bar函数
';
}
}
//现在还不能调用bar()函数,因为它还不存在
bar();
foo();
//现在可以调用bar()函数了,因为foo()函数的执行使得bar()函数变为已定义的函数
bar();
//再调一次foo()看看是不是会报错?
foo();
?>
你会发现,在上面foo() 函数内部又定义了一个bar函数,这就是内函数数。
仔细观察和实验后你会得出如下的结论:
1.foo()调用两次会报错
2.如果不调foo()函数无法执行bar函数,因为bar是在foo的内部
我想在函数体内定义的变量在函数体外用
我想把函数体外的变量拿到函数体内来使用
这个时候我们就需要用到超全局变量。我们来回顾一下之前的知识点:
全局变量名 功能说明
$_COOKIE 得到会话控制中cookie传值
$_SESSION 得到会话控制中session的值
$_FILES 得到文件上传的结果
$_GET 得到get传值的结果
$_POST 得到post传值的结果
$_REQUEST 即能得到get的传值结果,也能得到Post传值的结果
我们来通过实验来观察 一下外部变量(超全局变量)的特点,打破本章开头我们总结的规律:
我们定义一下global.html页现来写HTML内容:
<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:
function demo(){
echo $_POST['hongniu'];
}
demo();
?>
通过这个小例子,你会发现超全局的$_POST等这一系列的超全局变量(外部变量)在函数内部也是可以用的。没有本文开始处变量作用域的限制。其实我们所有声明的变量都放到了$GLOBALS这个数组下面,举个例子:
$hello = 10;
echo $GLOBALS['hello'].'
';
$GLOBALS['hello'] = '我爱你';
echo $hello;
?>
通过上例,你会发现 变量名是等价于 变量名是等价于 变量名是等价于GLOBALS[‘变量名’] 。所有的变量都放到了 G L O B A L S 里面了。而 GLOBALS里面了。而 GLOBALS里面了。而GLOBALS也是全局的。
因此,我们能够来达到我们的目的:将函数体内的变量(局部变量)在函数外部使用。也可以让函数外的变量到函数里面来使用。
$one = 10;
function demo(){
$two = 100;
$result = $two + $GLOBALS['one'];
return $result;
}
//你会发现结果变成了110
echo demo();
?>
上例中:我们将函数体外的变量通过$GLOBALS拿到了函数体使用。所以,打破了函数外的变量不能在函数体内使用的限定。
$hongniu = '我是一个兵,来自老百姓';
function test(){
echo '执行了函数test哟
';
//调用test()函数,将通过$GLOBALS['hongniu'],把$hongniu的值改变掉
$GLOBALS['hongniu'] = '帮助别人很快乐';
}
test();
//发现是不是输出的值变了呀?
echo $hongniu;
?>
通过上例:我们发现通过 G L O B A L S [ ′ h o n g n i u ′ ] , 把 GLOBALS['hongniu'],把 GLOBALS[′hongniu′],把hongniu的值改变掉,所以在最后输出$hongniu的时候,值发生了变化。
function hello(){
$GLOBALS['que'] = '提神喝茶更好哟';
echo '你调了一下函数hello
';
}
hello();
echo $que;
?>
上例中,我们发现$que是不存在的,可以调用函数hello()后,在函数外部可以执行echo q u e 了,能够看到结果:提神喝茶更好。我们明白了,函数内声明的变量,通过 que了,能够看到结果:提神喝茶更好。我们明白了,函数内声明的变量,通过 que了,能够看到结果:提神喝茶更好。我们明白了,函数内声明的变量,通过GLOBALS声明一个变量,也能够显示出来。
下面的知识是【了解】级别,我们越来越少的使用这种方式来声明全局变量了。在函数内使用global关键词后面跟一个或多个变量,就把变量变为了全局变量,格式如下:
global $变量1[,变量2,…变量n]
在global后面可以跟一个或者多个变量,变量用逗号分开。
$a = 10;
$b = 100;
function test(){
global $a , $b;
echo $a + $b;
}
//结果是不是显示出来了?
test();
?>
上例中,你还可以试试在global关键词后面跟着未创建的变量,在函数体内定义变量值,修改变量的值试试。其实与$GLOBALS一样,只是用法不同而已。
函数的参数引用,也是这个意思,将形参和实参指向到同一个位置。如果**形参在函数体内发生变化,那么实参的值也发生变化。**我们来通过实验来看看:
$foo = 100;
//注意:在$n前面加上了&符
function demo(&$n){
$n = 10;
return $n + $n;
}
echo demo($foo).'
';
//你会发生$foo的值变为了10
echo $foo;
?>
如果我想知道函数被调用了多少次怎么办?在没有学习静态变量的时候,我们没有好的办法来解决。
静态变量的特点是:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行。
有了这个特点,我们就可以实现,最开始我们的提问:
函数调用词数的统计。
先执行10次demo()函数试试,再执行10次test()函数试试:
function demo()
{
$a = 0;
echo $a;
$a++;
}
function test()
{
static $a = 0;
echo $a;
$a++;
}
demo();
demo();
demo();
demo();
demo();
demo();
demo();
demo();
demo();
demo();
/*
for($i = 0 ;$i < 10 ; $i++){
test();
}
*/
?>
上例中你会发现:
test();执行一次数值就会加1,而demo输出的显示结果,始终为0。
通过上例你就会发现,本文开始处说明的静态变量的特点。
PHP中文网的猪哥,总结了这么两句话:
1.如果代码能赚钱,帮你赚钱最多的是基本语法
2.如果你还在当程序员,你看手册的时候可能比你看老婆的时间还长
现在我们就来学习如何使用系统内置函数。
子曰:送你一条鱼,不如教你捕鱼的办法。
下面我们就来学习捕鱼的办法,在使用系统内置函数前,你必须学会以下几个东西:
1.下载一个**最新的手册** 2.经**常更新手册** 3.将PHP手册放在你最容易找到的地方。需要的时**候随时可以查手册** 4.**学会手册中函数的用法**
- 1
- 2
- 3
- 4
- 5
- 6
- 7
你可以访问,下载后放到桌面上,随时需要随时打开查即可:
http://www.php.cn (每周更新一次)
使用函数的重点是三块:
1.了解函数的功能,特别是常用函数的功能
2.了解函数的参数
3.了解函数的返回值
我们针对上面的三块,讲解6个函数,这6个函数,概况了函数的基本用法的全部注意事项:
1.直接返回布尔型,如bool copy ()
2.带有MIXED参数的函数如何调用。Mixed表示任何类型的数据。如Array_unshift()
3.参数中带有&符的参数,一定要传一个变量做为参数。函数里面改变了他的值。
4.带有[]的参数,表示可选项。
5.带有…的参数,表示可以传任意多个参数。
6.带有callback的参数,表示回调函数。需要传一个函数进来。Array_map()
7.函数支持的版本你要了解
实验
1,拿copy()这个函数来举例:返回bool值的,通常为操作是否成功、验证是否通过、检查是否正确等。
我们拿copy这个函数来看:
bool copy ( string $source , string $dest [, resource $context ] )
这个函数的功能为: 拷备一个文件
返回值为为: bool型值,就是成功返回true,失败返回false
参数为: 两个字符串的值,一个是copy的源文件,一个为目标文件。第三个参数可选的,不常用,我们不管它。
所以,我们就可以推理出下面的实验了:
if(copy('abc.txt','bcd.txt')){
echo '复制成功';
}else{
echo '复制失败';
}
?>
我们来看这个函数:
int array_unshift ( array &$array , mixed $value1 [, mixed $... ] )
功能: 操作一个数组,向数组中之前插入其他类型的参数。
返回值: int 类型,可能就是插入成功最后的个数
参数: **第一个参数为&符,也就是在操作的过程中,改变了第一个参数的值。**引用传参。也就是操作这个数组,向这个数组中传入参数。会直接改变这个数组的值。
第二个参数为mixed,因为数组可以存入多个不同的类型.mixed是指混合的意思。因此,mixed是指可传入任意类型
第三个数数加了中括号,我们所有遇到中括号的。都是指后面的参数可传,也可以不传。
第四,最后还看到了三个…(省略号)。代表可以传入任意多个参数。
示例:
$queue = array("凤姐", "芙蓉");
array_unshift($queue, "杨幂", "姚晨");
print_r($queue);
?>
你可以自己实验一下,看看结果。
bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )
我们来看看。
功能:
传入一个回调函数,将数组的原来的组操作,并且发生变化。
返回值:
bool 值 也就是意味着,提示成功或者失败
参数:
第一个参数是要操作的数组。
第二个参数是callback 代表着可以传入函数或者匿名函数。
我们来写个例子,加强理解:
$shuaige = array("a" => "wuyanzhu", "b" => "huangxiaoming", "c" => "ninzetao");
function test_print($item2, $key)
{
echo $key ." ---". strtoupper($item2) . "
\n";
}
echo ''
;
var_dump($shuaige);
echo '';
array_walk($shuaige, 'test_print');
echo '用自定义函数test_print执行后的效果:';
echo ''; var_dump($shuaige); echo ''; ?>
通过上例,我们发现数组中的每个参数和值都被修改了。上例大家只需要理解看见传callback的,需要传入函数协助处理就可以。不用理解。我们在下一章的数组部份,学习完数组,大家可以再看看。
函数支持的版本号很重要
$shuaige = array("a" => "wuyanzhu", "b" => "huangxiaoming", "c" => "ninzetao");
function test_print($item2, $key)
{
echo $key ." ---". strtoupper($item2) . "
\n";
}
echo ''
;
var_dump($shuaige);
echo '';
array_walk($shuaige, 'test_print');
echo '用自定义函数test_print执行后的效果:';
echo ''; var_dump($shuaige); echo ''; show_source(__FILE__); ?>

在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这些代码的文件只需要包含这个文件即可。这种方法有助于提高代码的重用性,给代码的编写与维护带来很大的便利。在PHP中, 有require、require_once、include、include- once四种方法包含一个文件。
我们来对比他们的不同:
函数 包含失败 特点
Inlcude 返回一条警告 文件继续向下执行。通常用于动态包含
Require 一个致命的错 代码就不会继续向下执行。通常包含极为重要的文件,整个代码甭想执行
Include_once 返回一条警告 除了原有include的功能以外,它还会做once检测,如果文件曾经已经被被包含过,不再包含
Require_once 一个致命的错 除了原的功能一外,会做一次once检测,防止文件反复被包含
注意:
1,少用_once带once,因为它会消耗更多的资源去做检测的工作。
2,特高级
Include文件只需要编译一次,因为每次包含include都会再执行一次对应的代码**,如何减少include再次执行时,需要重新解析的过程。**
函数名 描述 实例 输入 输出
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 无 获取圆周率
如果,我们是跨国的多语方程序,我们通常是通过在配置文件里面来写好了个时区,每次程序运行的时候。都会读取这个时区的设置,来显示时间。
设置时区的函数为:
1). date_default_timezone_get()
2).date_default_timezone_set()
第一个函数我们就不重点讲解了,比较简单。
用法如下:
string date_default_timezone_get ( void )
功能如下:
取得一个脚本中所有日期时间函数所使用的默认时区
示例:
echo date_default_timezone_get ();
?>
这样就显示出来了当前设定的时间。
第二个函数是重点:
用法如下:
bool date_default_timezone_set ( string $timezone_identifier )
功能如下:
用于所有日期时间函数的默认时区
示例:
//定义一下时区常量,以后你可以放到配置文件里
define('TIME_ZONE','Asia/shanghai');
//执行函数
date_default_timezone_set(TIME_ZONE);
echo date('Y-m-d H:i:s');
?>
上例的代码对比试试,再将将date_default_timezone_set注释掉,再看看会提示什么。
$mytime=getdate();
print_r( $mytime);
?>
print_r可以输出一个数组中所有的键名与值。运行这段代码,结果如下所示。程序输出当前计算机的时间与日期详细信息:
Array
(
[seconds] => 1 //秒
[minutes] => 10 //分钟
[hours] => 17 //小时
[mday] => 18 //日
[wday] => 0 //星期中的第几天
[mon] => 1 //月
[year] => 2015 //年
[yday] => 17 //年中的第几天
[weekday] => Sunday //星期
[month] => January //月份
[0] => 1421597401 //时间戳
)
checkdate可以判断一个输出的日期是否有效。
在实际的工作中,我们需要经常用于检测常用于用户提交表单的数据验证。
例如:验证用户输入的时间是否正确。
函数的语法格式如下:
bool checkdate ( int $month , int $day , int $year )
下例中,我们就可以用一个代码来进行实验,写出一段真实的例子。试试2011年有没有2月29日。
如果是有效的时间就返回真,如果不是有效的时间就返回假。
var_dump(checkdate(12, 31, 2018));
var_dump(checkdate(2, 29, 2011));
?>
输出结果:
bool(true)
bool(false)
在实际的工作中我们还需要经常用到指定某个时间生成。
例如:需要找到昨天到今天此时此刻的注册用户。
那么我们需要做两件事情:
1.得到当前的时间unix时间戳。用time()函数就可以直接搞定
2.那么昨天指定时间该怎么生成呢。这个时候我们就需要使用到mktime()函数。简称:make time.创建时间。
生成出来的时间最好是unix时间戳。因为是1970年1月1日0时到现在的时间。我们做一个区间判断,就把昨天到今天注册的用户按照时间筛选出来了。
我们的mktime()函数可以对一个日期和时间获得一个本地化时间戳。其语法格式如下所示:
int mktime (int $hour [, int $minute [, int $second [, int $month [, int d a y [ . i n t day [. int day[.intyear [, int $.is_dstl.l } ] ] 31 )
函数的参数分别表示:时、分、秒、月、日、年、是否为夏令时。在使用这个函数时,需要注意所列的参数要与函数的参数含义相同。例如,下面的代码实现了用mktime构造一个时间戳的功能。
运行程序结果如下所示:
1219036530
mktime函数的返回结果是一个Unix时间戳,对用户的含义不大,常常与date函数一起完成时间的转换。
例如,下面的代码实现对时间的运算:
echo date("m-d-Y h:m:s")."\n";
echo date("m-d-Y h:m:s",mktime(10,15,35,date("m"),date("d"),date("Y")))."\n";
echo date("m-d-Y h:m:s",mktime(10,15,35,date("m"),date("d")-30,date("Y")))."\n";
?>
我们使用的时候还经常需要使用到另外一个函数:strtotime()。
它的语法格式如下:
int strtotime ( string $time [, int $now = time() ] )
它能将将英文文本的日期时间描述解析为 Unix 时间戳。
参数:
1.传入一个字符串的时间
2.可选参数为是否传入unix时间戳,如果不传则是当前的unix时间戳。
我们来实验一下,看看手册中提供的一些例子:
//now为现在的当前时间
echo strtotime("now")."
";
//2000年9月10日
echo strtotime("10 September 2000")."
";
//当前时间加一天
echo strtotime("+1 day")."
";
//当前时间加一周
echo strtotime("+1 week")."
";
//当前时间加一周2天4小时2秒
echo strtotime("+1 week 2 days 4 hours 2 seconds")."
";
//下一个星期四
echo strtotime("next Thursday")."
";
//上一个星期一
echo strtotime("last Monday")."
";
?>
通过上例发现,把一些时间通通加上了或者减去了英文中所表示的指定时间段。
我们有的时经常需要做程序的执行时间执行效率判断。
实现的思路如下:
//记录开始时间
//记录结整时
// 开始时间 减去(-) 结束时间 得到程序的运行时间
?>
可是大家不要忘了,程序的运行速度太快了。快到只有0.00000几秒的一刹那。那这个时候大家要记录一个特函的函数了:
mixed microtime ([ bool $get_as_float ] )
microtime()这个函数,能够返回当前 Unix 时间戳和微秒数。
参数:
如果你传入true的话,将会返回一个浮点类型的时间,这样方便参与运算。
我们来模拟一个检测函数执行时间的例子,测试某个函数效率的快慢:
//开始时间
$time_start = microtime(true);
//循环一万次
for($i = 0 ; $i < 10000 ; $i++){
//你可以用上,mktime() 生成一个昨天的时间
//再用strtotime() 生成一个昨天的时间
//对比两个函数认的效率高
}
//结整时间
$time_end = microtime(true);
//相减得到运行时间
$time = $time_end - $time_start;
echo "这个脚本执行的时间为 $time seconds\n";
?>
最后输出的结果就是我们实际的函数的执行时间。你可以多对比几次,看看最终的结果。
谁的时间短,在实际的工作中,你就可以经常使用哪个函数。
数组、字符串和数据库是我们函数里面最、**最、最常用的三类函数,**数组和数据库我们现在还没有讲到,等讲到的时候我们再来和大家细说。
当然PHP的字符串函数也有很多。我们最常使用的两个系列的字符串:
1.单字节字符串处理函数
2.多字节字符串处理函数
3.字符串编码转换函数
我们来说说为什么要学这么多函数:
1.我们学的是中文,是双字节或者三字节的。老外的函数只能处理英文和数字这些单字节的字符串处理不鸟中文。达不到我们的功能需求
2.有的时候需要做不同字符编码间的转换,例如:把GBK的转为UTF-8
3.英文这些字符在电脑里又是必须要处理的
因此,我们要学三个类型的常用字符串函数。
我们来贴个PHP手册的链接给大家看看:
http://php.net/manual/zh/
PHP常用函数:
函数名 描述 实例
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!"; echo ltrim($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.\nAnother line.");
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, \my na\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是三字节,一个汉字占用三个字节长度的存储空间。
不过上面的例子中,我们觉得写的不优美,我们可以将代码写的更加优美一些,格式更加清晰一些。
$kele = array(
'只有不断努力才能博得未来',
10 => 'NoAlike',
'PHP中文网' ,
'去PHP中文网学PHP',
19 => '凤姐和芙蓉我都爱' ,
'杨幂我最爱'
);
//打印显示$kele
echo ''
;
var_dump($kele);
echo '';
?>
这样是不是看得更清楚,一行对应一个数组的值。
通过上面的效果,我们来总结规律:
1.索引数组若不强制声明他的下标,他的下标是从0开始的。(我们的第一个数组的值:只有不断努力才能博得未来。这个值的下标为0)。
2.如果我指定过下标他的下标就为我指定的值。如下标为10和下标为19的,都是我指定过的值。
3.若某个值(如NoAlike),强制指定了下标(下标为10)。在它后面加上的值(PHP中文网),不指定下标的话。他们的下标增长规律为最大值+1。
例如:凤姐和芙蓉我都爱的下标为19.我在后面加上了:杨幂我最爱。它的下标自动增长为了11。
不知不觉,你已经学会了索引数组的创建,神奇吧?真为你感到高兴!
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result = count($a);
// $result == 3
$b[0] = '迪奥和奥迪我都爱';
$b[5] = '努力开创未来';
$b[10] = '为了未来而努力';
$result = count($b);
$data = [
'baidu' =>'百度',
'ali' => '阿里',
'tencent' => '腾讯',
];
echo count($data);
$erwei = [
[
'baidu' =>'百度',
'ali' => '阿里',
'tencent' => '腾讯',
],
[
'netease' =>'网易',
'sohu' => '搜狐',
'sina' => '新浪',
]
];
//试试输出一个二维数组个数
echo count($erwei);
//试试输出二维数组中某个元素的个数
echo count($erwei[1]);
?>
我们通过上一章的内容学会了遍历连续下标的索引数组。可是,我们发现我们遍历不了关联数组,也遍历不了下标不连续的索引数组。
那我们其实在学循环的时候,有一个布尔型循环是专门用来循环数组的。这个循环的基本语法就是foreach基本语法。
语法格式如下:
foreach( 要循环的数组变量 as [键变量 =>] 值变量){
//循环的结构体
}
遍历关联数组
这是一个固定用法,将要循环的数组放进去。
as 是一个固定的关键字
后面的键变量是可选的,随意定义一个变量,每次循环的时候,foreach这个语法会把键取出来赋值到键变量里面
后面的值变量是必填的。每次循环的时候,会把值放到值变量里面。
$data = [
'fj' => '凤姐',
'fr' => '芙蓉',
];
foreach($data as $key => $value){
echo $key . '-------' . $value . '
';
}
//如果我们只想读取值的话,就可以把下面的$key => 给删除掉,读取的时候,就只读取值了。做完上面的实验,你可以打开下面的代码再实验几次。
/*
foreach($data as $value){
echo $value . '
';
}
*/
?>
$data = array(
0 => '中国',
100 => '美国',
20 => '韩国',
300 => '德国',
);
//待会儿可以自己做做实验,循环遍历一下下面的这个数组
//$data = array(1,2,3,4,5,6,7,8,9,10);
foreach($data as $k => $v){
echo $k . '------' . $v .'
';
}
?>
我们来研究两个比较有意思的数组函数。这两个函数学起来不难。但是,有些同学会遇到一点点小困难。困难在于,找到list函数和each函数的操作特点。
我们先来讲list函数:
list ( mixed $变量1 [, mixed $变量n ] )
它的功能:将索引数组下标为0的对应我变量1,下标1的对应变量2,依此类推。
我们来通过实验来看一下:
list($one , $two , $three) = array('张三' ,'李四' ,'王五');
//再次声明:单引号不结释变量,所以输出的是字符串$one
echo '$one----'.$one.'
';
echo '$two----'.$two.'
';
echo '$three----'.$three.'
';
?>
世界上最难懂的是道士的鬼符、医生的处方和程序员的正则表达示。
我们先看一个正则表达示的样子:
/^a-z@([a-z0-9][-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$/i
呵呵,看着就觉得揪心。提前声明,别被吓着,学习一下后你会发现没那么困难。
正则表达示我们其实之前经常看到,它主要用在以下一些地方:
匹配邮箱、手机号码、验证码
替换敏感的关键词。例如:涉及政治和骂人的话
文章采集。
早期的表情替换技术,ubb文件编码、markdown编辑器替换等
以后自己写模板引擎也需要用到正则表达示
其他....
定界符,就是定一个边界,边界已内的就是正则表达示。
PHP的正则表达示定界符的规定如下:
定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束。
我们来例几个例子:
例子 说明
/中间写正则/ 正确
$中间写正则$ 正确
%中间写正则% 正确
^中间写正则^ 正确
@中间写正则@ 正确
(中间写正则) 错误
A中间写正则A 错误
注:\ 是转义字符,如果在以后正则表达示里面需要匹配/,如下图:
/ / /
这个时候真要匹配/ 的时候,需要把定界符里面的/ 用转义字符转义一下,写成下面的例子:
/ / /
如果你觉得麻烦,遇到这种需要转义的字符的时候可以把两个正斜线(/ /)定界,改为其他的定界符(# #)。
原子
原子是正则表达示里面的最小单位,原子说白了就是需要匹配的内容。一个成立的正则表达示当中必须最少要有一个原子。
所有可见不可见的字符就是原子
说明:我们见到的空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号全为原子。
在做原子的实例前我们先来讲解一个函数,preg_match:
int preg_match ( string $正则 , string $字符串 [, array &$结果] )
功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。
注:上面是preg_match常用的主要几个参数。我在上面将另外几个参数没有列出来。因为,另外两个参数太不常用了。
$zz = '/[0-5]\w+/';
$string = '6a';
$string1 = '1C';
if(preg_match($zz, $string1, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}
?>
$zz = '/[^0-9A-Za-z_]/';
$string = 'aaaaab311dd';
$string1 = '!$@!#%$#^##';
if(preg_match($zz, $string1, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}
?>
原子 等价式
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\d [0-9]
\D [^0-9]
\s [ \t\n\f\r]
\S [^ \t\n\f\r]
写正则的诀窍
女孩和男孩恋爱时的诀窍通常是:测试你是不是对我好一点,如果是的,咱们的关系就更好一点。
而正则的诀窍和恋爱的诀窍基本一致:写一点、测一点。
因为,我们需要不断的正则,用preg_match对比是不是能匹配成功。成功了,再写后面的一点**。直到写完,全部匹配成功为止!**
例如,我要写一个邮箱的正则。我先要做的事情,将常用的邮箱格式全部列出来。例如:
phpcn@php.cn phpcn@corp.baidu.cm phpcn@126.com phpcn@xxx.com 12345@qq.com
常用的格式主要有这样一些。那我们就可以来分析:
1.先匹配@之前的字符 \w+(因为是0-9A-Za-z_)
2.第二个跟一个@符
3.第三个再写上[a-zA-Z0-9-]+ 因为qq和126这些主域名是不能有下划线的
4.corp.baidu. 或者是126. 通常邮箱后缀都是这样的。所以我们可以写成:([a-zA-Z0-9-]+.){1,2}
5.上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多两次。
6.后面接下com|cn|org|gov.cn|net|edu.cn等就可以了
因此,我们的正则表达示在我使用:
/\w+@([a-zA-Z0-9-]+.){1,2}(com|cn|org|gov.cn|net|edu.cn)/
邮箱的正则就被我写成功了。
常用正则函数
我们常用的正则函数有:
函数名 功能
preg_filter 执行一个正则表达式搜索和替换
preg_grep 返回匹配模式的数组条目
preg_match 执行一个正则表达式匹配
preg_match_all 执行一个全局正则表达式匹配
preg_replace_callback_array 传入数组,执行一个正则表达式搜索和替换使用回调
preg_replace_callback 执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace 执行一个正则表达式的搜索和替换
preg_split 通过一个正则表达式分隔字符串
大家针对这这些函数,对着手册用一下。有问题或遇到问题可以来我们的官网提问。
正则关于面试常遇到的问题
面试中经常考到的几个正则达达示是:
1.匹配邮箱
2.匹配手机号
3.匹配一个网址
4.用正则匹配某个格式,取出某个例
5写一个采集器
其他....
面试的第4题和第5题我对大家不担心,因为只要大家认真学习了我给的前五节的内容。第4,5题推理就行。
因为,通常在技术答题面试环节,是时候准许查手机的!
常用正则表达示
下面的是快速查找的正则表达示,大家一定得知道具体意思。
需要的时候直接复制即可:
我们来看一下UBB编辑器。这是网站当中经常用到的文本处理技术。因为使用UBB文件编辑器,我指定的格式才能存在。我不指定的格式,用户是无法在网站中展现的。
我们来看看效果:
$string='[b]为你写诗[/b]
[i]为你做不可能事[/i]
[u]哎呀,哥不是写情诗[/u]
[color=Red]哥是在说歌词[/color]
[size=7]吴克群[/size]
[qq]123123123[/qq]';
//匹配UBB字符
$pattern=array(
'/\[b\](.*)\[\/b\]/i',
'/\[i\](.*)\[\/i\]/iU',
'/\[u\](.*?)\[\/u\]/i',
'/\[color=(.*?)\](.*?)\[\/color\]/',
'/\[size=(\d)\](.*?)\[\/size\]/',
'/\[qq\](\d{5,12})\[\/qq\]/',
);
//需要替换的UBB字符
$replace=array(
'\\1
',
'\\1
',
'\\1
',
'\\2
',
'\\2
',
'
',
);
//使用正则匹配$string,将$string当中的值变为$replace的效果
$ubb=preg_replace($pattern,$replace,$string);
echo $ubb;
?>
实现的更高级,你可以让用户传过来的是form表单中的结果,让用户传值过来。
你转换输出成UBB格式。
下一章节中我们学习了文件系统的知识,再跟大家讲解更加有趣的:网页采集器。