[系列文章] PHP日常注意点 - 记录1
个人记录一些自己平时写PHP代码时,遇到的一些小问题,会不时的更新;
欢迎大家及时指出问题的错误,提意见时可以标注具体问题编号,谢谢大家,与君共勉;
1,float数据类型输出格式问题
$float1 = 1.123;
$float2 = 2.3e3;
$float3 = 8E-5;
var_dump($float1, $float2, $float3); //float(1.123) float(2300) float(8.0E-5)
var_dump(number_format(8E-5, 5)); //string(7) "0.00008"
会发现8E-5没有输出为 0.00008 , 这是因为PHP会自动将一些位数太多的数字转为科学计数法方式显示
此时如果想输出为0.00008格式,可以使用number_format(),还得注意,该函数返回的是string
2,使用.
拼接符后,自动转为字符串类型
$a = 12;
$b = 1.3;
$c = true; //转为1
var_dump($a . $b . $c); //string(6) "121.31"
3,strlen(),strpos()的中文字符处理
strlen() 返回字符串的长度,按字节,英文占一个,中文一般占3个;
英文的好说,不用特殊处理,中文的可以使用专门的mb_strlen()
echo strlen('string'); //6
echo strlen('你好!世界'); //15(5个中文字符*3)
echo strlen('你好!PHP'); //12(三个中文字符*3 + 3个英文)
echo mb_strlen('你好!世界'); //5
echo mb_strlen('你好!PHP'); //6 每个都按字符算
strpos() 用于在指定字符串内查找某段字符是否有出现, 如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。
需要注意的是:字符串的第一个位置是0,而不是1;
同样该函数也有中英文的问题,也需要专门的mb_strpos()函数处理
echo strpos("hello php", "php"); //6
echo strpos("hello php","he"); //0
echo strpos("你好,php", "p"); //9
echo mb_strpos("你好,php", "p"); //3
4,三元运算符 vs NULL 合并运算符 vs 太空船运算符
三元运算符
var_dump(true ? 1 : 2); //1
//要注意这种写法:a ?: b , a为真,则整个表达式为a,这里很容易写法如下,产生错误结果
var_dump(!empty($a) ?: 2); //int(2)
$a = 1;
var_dump(!empty($a) ?: 2); //bool(true) 注意结果是true
NULL 合并运算符 a ?? b , a不为null,返回a,否则为b
$a = 0; //为0,[],'' 都是原值,为null才为后面设置的值
var_dump($a ?? 'none'); //int(0)
var_dump($c ?? 'none'); //string(4) "none"
<=>运算符
var_dump(1<=>2); //int(-1)
var_dump('b'<=>'a'); //int(1)
var_dump(5<=>5); //int(0)
var_dump('5'<=>5); //int(0)
5,echo,print
echo可以输出多个数据echo 1,1.1,true,'hello';
;print只能输出一个;
print有返回值,且总为1;echo没有返回值;
都是一个语言结构,都可以加echo() / print();
6,heredoc写法
<?php
$var = ['name'=>'xqw','age'=>18];
echo <<<EOF
123'abc"ef \n gh \t ijk
"hello" 'xqw' , dwdw
<h1>test</h1>
$var[name]
EOF;
$var = ['name'=>'xqw','age'=>18];
$str = <<<'EOF'
123'abc"ef \n gh \t ijk
"hello" 'xqw' , dwdw
<h1>test</h1>
$var[name]
EOF;
echo $str;
7,Integer,Float,Object,NULL
Integer有整数,负整数,二进制,八进制,十进制,十六进制等几种表现方式
$int1 = 11;
$int2 = -12;
$int3 = 0x8c; //十六进制
$int4 = 047; //八进制
var_dump($int1, $int2, $int3, $int4); //int(11) int(-12) int(140) int(39)
PHP的Float中是包含double的,还有指数形式
$float1 = 1.123;
$float2 = 2.3e3; //指数形式
$float3 = 8E-5; //负指数形式
$float4 = 0.00008;
var_dump($float1, $float2, $float3, $float4); //float(1.123) float(2300) float(8.0E-5) float(8.0E-5)
var_dump(number_format(8E-5, 5)); //string(7) "0.00008"
Object打印出的数据是包含public、protected,private属性,但是不包含静态属性和常量,因为这是属于类的,但能访问的只能是public的
<?php
class Car
{
public $color;
private $price = 1000;
static $reduce = 500;
public $product = 'BWM';
protected $run = 1000;
const NAME = 'm9';
function __construct($color='red')
{
$this->color = $color;
}
function what_color(){
return $this->color;
}
}
$bwm = new Car('blue');
echo "<pre>";
var_dump($bwm);
/*object(Car)#1 (4) {
["color"]=>
string(4) "blue"
["price":"Car":private]=>
int(1000)
["product"]=>
string(3) "BWM"
["run":protected]=>
int(1000)
}*/
// get_object_vars() 获取对象的属性和值(只能是public的),保存到数组中
foreach (get_object_vars($bwm) as $prop => $val) {
echo "$prop => $val",'<br>';
}
/*color => blue
product => BWM*/
NULL比较特殊,就是单纯表示该变量的值为NULL空,可以看例子:
var_dump(NULL==0 ?: false); //bool(true)
var_dump(NULL==0.0 ?: false); //bool(true)
var_dump(NULL==""?:false); //bool(true)
var_dump(NULL==[]?:false); //bool(true)
var_dump(NULL==false?:false); //bool(true)
var_dump(NULL===0 ?: false); //bool(false)
var_dump(NULL===0.0 ?: false); //bool(false)
var_dump(NULL===""?:false); //bool(false)
var_dump(NULL===[]?:false); //bool(false)
var_dump(NULL===false?:false); //bool(false)
8,0 , 0.0 , false , []
的 ==
比较
var_dump(0==0.0?:false); //bool(true)
var_dump(0==""?:false); //bool(true)
var_dump(0==false?:false); //bool(true)
var_dump(0==[]?:false); //这里注意:bool(false)
var_dump(0.0==""?:false); //bool(true)
var_dump(0.0==false?:false); //bool(true)
var_dump(0.0==[]?:false); //这里注意:bool(false)
var_dump(""==false?:false); //bool(true)
var_dump(""==[]?:false); //bool(false)
9,"0" 与 false,0,0.0,[] , "" , null
的 == 比较结果
var_dump("0"==false?:false); //bool(true)
var_dump("0"==""?:false); //bool(false)
var_dump("0"==null?:false); //bool(false)
var_dump("0"==0.0?:false); //bool(true)
var_dump("0"==[]?:false); //bool(false)
var_dump("0"==0?:false); //bool(true)
平时需要注意这些数据 0,0.0,"", '' , "" , "0" , "0.0" , false , [] , [0] , ['0'] , ['0.0'] , [false] , [""] , [0.0] , [[]] , null
的使用
10,define定义的常量不受命名空间的限制
直接看例子:
3.php
<?php
namespace demo3;
define("NAME" , "xqw");
const SEX = 28;
4.php
<?php
namespace demo4;
include_once './3.php';
use demo3;
echo NAME; //xqw
echo demo3\SEX; //28
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: