如何理解php是弱类型语言
相信不少开发人员对网络上的 0 "0" null false '' 的讲解司空见惯,了然于胸了, 但我相信总有你忽略的细节,或者从变量结构角度出发,该如何解释。那么看看下边的验证吧
echo 'php版本:'.PHP_VERSION; //5.6.28
$a = 0;
$b="0";
$c= '';
$d= null;
$e = false;
echo "5个变量-原始测试类型";
var_dump($a);//int 0
var_dump($b);//string '0'
var_dump($c);//string ''
var_dump($d);//null
var_dump($e);//boolean false
echo "<h4>empty测试</h4>";
var_dump(empty($a));//true
var_dump(empty($b));//true
var_dump(empty($c));//true
var_dump(empty($d));//true
var_dump(empty($e));//true
echo "<hr>";
var_dump(isset($a));//true
var_dump(isset($b));//true
var_dump(isset($c));//true
var_dump(isset($d));//【false】 见结论一
var_dump(isset($e));//true
echo "<h4>(==)双等式测试</h4>";
var_dump($a == $b);//true
var_dump($a == $c);//true
var_dump($a == $d);//true
var_dump($a == $e);//true !!
var_dump($b == $c);//【false】见结论二
var_dump($b == $d);//【false】见结论二
var_dump($b == $e);//true
var_dump($c == $d);//true
var_dump($c == $e);//true
echo "<h4>(===)三等式测试</h4>";
var_dump($a === $b);//false
var_dump($a === $c);//false
var_dump($a === $d);//false
var_dump($a === $e);//false
var_dump($b === $c);//false
var_dump($b === $d);//false
var_dump($b === $e);//false
var_dump($c === $d);//false
var_dump($c === $e);//false
总结: 对于 【0 ;"0" ;'' ;null; false】五种类型 empty操作以上五个变量,都返回false 强等于(===)比较 都为false,同强语言结果 但对于(==)比较,需要注意string类型,涉及到底层结构与类型转换
结论一:关于变量类型的理解 1.null为不存在之意:php底层的zval空间里(结构见下方)没有存其value值,只存储了一个type标志其 IS\_NULL(所以解释了 empty(null)=true,isset(null)=false ,isset('')=true) 2.【0 ; "0" ; "" ; false 】:这四个为存在,php底层是开辟zval空间存储,有value,有type
结论二:从底层结构理解 理解了上边结论一,那么下边的结论就容易理解了,还不太清楚的可以详细看下【 PHP内核的存储机制(分离/改变)】 其中的【1.zval结构】,【2.zend\_uchar type】部分
string '0'与 string'' 不相等,(想一下就明白,同类型比较【1个长度】的字符串怎么可能 等于 【0个长度】 的字符串,zal的value结构里,对string值有len原始记录的) int 0 却和 string'' 空相等,(非同类形比较,php会做类型转换)
string '0' 与 null 不相等 int 0 与 null 相等
说白了,对于php,碰到string "0" 的等式判断的时候,停顿注意一下就行。其他的等式判断正常,符合大众熟知的php开发思维。
php变量zval结构: //存放变量的基本信息
struct _zval_struct {
/* Variable information */
zvalue_value value; /* 变量值保存在这里 12字节*/
zend_uint refcount;//4字节,变量引用计数器
zend_uchar type; /* active type变量类型 1字节*/
zend_uchar is_ref;//是否变量被&引用,0表示非引用,1表示引用,1字节
};
//存放变量的值
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val; //4字节
int len; //4字节
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
相关文章
- 竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。(1)Laravel如何优雅的设置全局变量
- 如何运行PHP代码_运行php网站
- 数据库PHP操作MySQL数据库的精彩之旅(php读mysql)
- PHP连接MySQL数据库的步骤与方法(php如何连接mysql)
- 驱动MySQL驱动加载:一种基于PHP的解决方案(php加载mysql)
- 数据库解决PHP无法连接MySQL数据库的问题.(php无法连接mysql)
- Linux下如何重启PHP环境(linux重启php)
- PHP如何配置和使用Redis(php配置redis)
- Linux系统下如何快速安装PHP(linux命令安装php)
- 查询使用PHP运行MySQL查询的步骤(php运行mysql)
- PHP与MySQL连接失败如何解决?(php连接不上mysql)
- PHP如何准确获取MySQL数据库中的错误信息?(php获取mysql错误)
- 如何在Linux系统下执行PHP文件?(linux下执行php)
- PHP与MySQL:如何实现连接?(php怎么连mysql)
- 如何使用MySQL快速查询PHP数组(mysql查询数组php)
- PHP连接MySQL指南(php连mysql)
- 学习PHP连接MySQL:简易教程分享(php连接mysql教程)
- 如何在PHP中启用MSSQL数据库连接(php开启mssql)
- Linux下如何快速部署PHP环境(linux如何部署php)
- 从PHP到MSSQL:实现高效转换(php转换mssql)
- PHP如何操作MSSQL数据库(php怎样使用mssql)
- PHP如何访问MS SQL服务器(php怎么访问mssql)
- 使用PHP和MySQL研究论文(php mysql 论文)
- 《PHP编程最快明白》第七讲:php图片验证码与缩略图