PHP小知识点总结
所有代码都在PHP 5.5.12 WAMP2.5中测试
基本点
HTML文档中嵌入PHP代码
原始基本写法-其实就是平时我的写法
<?php if ($isLogin) { ?>
<a href="#">退出登录</a>
<?php } else { ?>
<a href="#">登录</a>
<?php }?>
官方文档写法-用了:
<?php if ($isLogin) : ?>
<a href="#">退出登录</a>
<?php else: ?>
<a href="#">登录</a>
<?php endif;?>
但是好像就是一种if语句,因为我测试了一下
$a = 1;
if ($a == 1) :
echo 1;
else :
echo 2;
endif;
瞬间觉得有点智障。。。根据我的的编程习惯来看,不喜欢这种还需要手动endif方式,因为老是忘。。。同样的还有endfor。
数据类型篇
高精度
我记得Java, python什么的,自带高精度,C/C++也有人专门写了合适的高精度模板,从不认为PHP也有这种东西,平时也没有去做float的运算,然后居然发现了bcxxx
函数
例如:
echo bcadd('123', '456');
//bccomp, div, mod, mul, pow, powmod, scale, sqrt, sub
// == , / , % , * , ^ , 幂取模 , 设置小数点位数, 开根号, -
NaN
这个值是一个特殊值,就和NULL类似,应该使用is_nan()
来检查
boolean
bool型和其他语言一样(true和false),但是很奇葩的就是,负数居然是true,比如
if(-1)
echo 123;
然后就真的输出123
了,后来我写代码的时候,就尽量避免简写,免得犯这些智障错误。
文档上说只有
- False自己
- 整型或者浮点型或者字符串的0 0.0 “0”
- 空字符串
- 空数组
- NULL
- 从空标记生成的 SimpleXML 对象
最后一个做微信公众号开发的时候遇到过,经常需要就是解析XML数据。
整型
整数应该最关心进制,溢出什么的
- 0123 8进制
- 0xABC 16进制
- 0b0101010101 2进制
有一个用于转换整型的函数intval
,其实也可以用于实现进制转换,但是只能从其他进制转为十进制。
PHP没有unsigned int
,不同于C/C++,int进行运算的时候,如果溢出会返回float,结果也是大致相近,比如
echo 2147483647 * 2147483647;
//4.6116860141324E+18
echo bcmul(2147483647 , 2147483647 );
//4611686014132420609
还有就是1/2
不会是0
,结果是0.5
,实际上我在做分页的时候,要去计算视图上实际需要的页数,就会出现几点几页的情况。代码如下:
<?php
$total = 120;
$page = 20;
echo ($total - 1) / $page + 1;
//输出6
echo (int)(($total - 1) / $page) + 1;
//输出6.95
浮点数
浮点数特殊在于计算机无法准确保存,所以在运算的时候,不完全准确,且有一定的精度限制,比较两个浮点数的时候,应该使用和计算几何模板
里面通过两个数相减并且和精度进行比较的方式。
但是有一个函数,bccomp
可以精确比较。比如:
$esp = 1E-10; //这里太大了,也会出现false情况,因为已经超过精度了
var_dump(abs(1.2 - (1 - 0.2 + 0.4)) < $esp);
//boolean true
var_dump(1.2 == 1 - 0.2 + 0.4 );
//boolean false
var_dump(bccomp(1.2, 1 - 0.2 + 0.4 ));
//int 0
var_dump(bccomp(1.2, bcadd(bcsub(1 , 0.2), 0.4)));
//int 0
字符串
PHP的字符串,可以使用’ ’ 或者” “来表示
单引号
在' '
表示中,如果需要显示'
本身,应该使用\'
,并且不支持\n这种转义字符
双引号
在" "
表示中,就支持转义字符了,并且可以在里面只有嵌入一个或者多个'
,也可以放入变量,例如:
$a = 123;
echo "aabbcc $a";
//想打印出aabbcc 123b 并且123和b之前不能有空格
echo "aabbcc $ab"; //错误 没有$ab这个变量
echo "aabbcc {$a}b";
echo "aabbcc ${a}b";
//想打印出aabbcc $123 并且123和$之前不能有空格
echo "aabbcc $$a";
echo "aabbcc $${a}";
echo "aabbcc ${$a}"; //提示123这个变量找不到,其实相当于${123}
echo "aabbcc \${$a}";
echo "aabbcc \$$a";
HereDoc
多行文本的简单定义方式
例如
echo <<<AAA
123 123
23423
AAA;
//一般还是用EOT或者EOF什么的好一点
echo <<<EOT
123 123
23423
EOT;
NowDoc
类似于HereDoc,就是就是单引号和双引号的区别,HereDoc是双引号。但是标识符要使用单引号。
echo <<<'EOT'
123 123
23423
EOT;
其他
1、字符串可以使用[ ]
或者{ }
来访问,个人觉得[ ]
顺眼一点,毕竟习惯了这种方式。用[]
访问不具有这种方式的变量返回NULL。
另外不能使用[]
,去访问UTF8(不是ASCII)编码的字符串的某一个,因为他们的编码方式和ASCII不同,不是以一个字节代表一个字符,而是多个字节代表一个字符,而[]
仅仅访问其中一个字节,所以显示就会乱码。
下标必须合法
例如:
//UTF8编码一般是3个字节代表一个字符
$a = '你好';
echo $a[0].$a[1].$a[2];
//输出 你
2、字符串转化为整型时,该字符串的数字部分必须在一开始就出现(可以有任意多个空格或者换行),否则输出0。
比如:
$str1 = '123 hahaha';
echo (int)$str1; //123
$str2 = " \n\n\n\n\n
123 hahaha";
echo (int)$str2; //123
$str3 = 'a 123hahaha';
echo (int)$str3; //0
3、在C/C++里面可以通过使用'b' - 'a'
得出整数1,但是在PHP里面,如果直接这么写,发生类型转化,同时被转化为0。
正确的写法是使用ord
函数(相反的函数chr( )
),ord('b') - ord('a')
。
变量
1、使用可变变量时,不能使用超全局变量和$this
2、用户自定义函数属于局部范围,任何用于函数内部的变量一般限制在函数内部使用
function test()
{
$a = 1;
}
var_dump($a);
//NULL
3、if
或者for
语句,里面的变量可以在if
和for
结构之外使用。
function test()
{
for($i = 0; $i <= 10; $i++);
echo $i;
if($i > 5) {
$j = 1;
}
echo $j;
}
如果是C/C++
这种语言,就会报错,应该这个变量已经出作用域了。
常量
1、常量没有作用域,可以在任何地方定义并访问。但是必须在定义之后才能访问。
echo A;
define('A', 123); //报错
2、使用defined
函数,检查是否定义常量时,必须使用' '
。
define('A', 123);
if(defined('A')) {
echo 'OK';
}
3、魔术常量,随着随处脚本的位置、行为决定值
__LINE__
, __FILE__
, __DIR__
, __FUNCTION__
, __CLASS__
, __TRAIT__
, __METHOD__
, __NAMESPACE__
运算符
1、NULL
自增时会变为1,自减无效果。
2、instanceof
用于确定某一变量是否属于某一个类的实例,是否是继承了某一父类的之类实例,是否是实现了某一接口的实例。
匿名函数(闭包)
1、PHP的匿名函数通过Closure
类实现
2、匿名函数的可以使用use
来继承变量。
3、如果use
处继承的变量没有使用引用,那么变量的值取决于定义匿名函数的位置。
$var = '123';
$callback = function() use($var) {
return $var;
};
$var = '456';
echo $callback();
$var = '123';
$callback = function() use(&$var) { //使用引用输出456
return $var;
};
$var = '456';
echo $callback();