php弱类型比较,如何理解PHP是弱类型语言

> PHP不必声明该变量的数据类型。

> PHP 会根据变量的值,自动把变量转换为正确的数据类型。

> 在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。

```

// PHP在定义变量时,不需要先声明变量的类型

$test= 1; //整数型

$test= array(); //数组型

$test= “test”; //字符串型

// 例子

$a = null; $b = false;

if($a == $b){

echo “a和b相等!”;

}else{

echo “a和b不相等!”;

}

// 结果输出 “a和b相等!”

$a = ''; $b = 0;

if($a == $b){

echo “a和b相等!”;

}else{

echo “a和b不相等!”;

}

// 结果输出 “a和b相等!”

?>

```

上述例子中,都输出了 “a和b相等!”,这是因为php在变量比较的时候不会严格校验变量的类型,无论变量是0 null ‘ ’还是false,比较的时候php都默认为空,整数值的话都是0,所以就相等了,如果要比较这些变量之间的不同,需要用“===”来判断,三个等号表示完全相等,即变量值和类型都要相等。

不管是强类型还是弱类型,变量都有两个属性:类型和值;也就是说,弱类型的变量同样有类型。可以使用php内置的gettype()方法来获取变量类型。

```

$a = ''; $b = 0;

gettype($a); // string

gettype($b) // integer

```

### **弱语言类型的底层实现**

> 所有变量使用同一种数据结构(zval)来保存,而这个结构同时表示PHP中的各种数据类型。 它不仅仅包含变量的值,也包含变量的类型。这就是PHP弱类型的核心

```

PHP是弱语言类型,主要分为三类:

1、标量类型:integer、string、float、boolean

2、复合类型:array、object

3、特殊类型:resource、null

```

php的弱语言实现,主要跟变量的存储结构有关。变量的值存储到以下所示zval结构体中。 zval结构体定义在Zend/zend.h文件,其结构如下:

```

typedef struct _zval_struct zval;

...

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */

zend_uint refcount__gc;

zend_uchar type; /* active type */

zend_uchar is_ref__gc;

};

```

PHP使用这个结构来存储变量的所有数据。和其他编译性静态语言不同, PHP在存储变量时将PHP用户空间的变量类型也保存在同一个结构体中。这样我们就能通过这些信息获取到变量的类型。

zval结构体中有四个字段,其含义分别为:

| 属性名 | 含义 | 默认值 |

| --- | --- |---|

| refcount__gc | 表示引用计数 |1|

| is_ref__gc| 表示是否为引用 |0|

| value | 存储变量的值 | |

| type | 变量类型 | |

zval结构体的type字段就是实现弱类型最关键的字段了,type的值可以为: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。 从字面上就很好理解,他们只是类型的唯一标识,根据类型的不同将不同的值存储到value字段。 除此之外,和他们定义在一起的类型还有IS_CONSTANT和IS_CONSTANT_ARRAY。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值