PHP小知识点总结

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语句,里面的变量可以在iffor结构之外使用。

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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gscsdlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值