[系列文章] 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;

PHP日常注意点-记录1

$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;

PHP日常注意点-记录1

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 协议》,转载必须注明作者和本文链接
六月的风
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!