C语言的结构和联合,以及PHP是怎么实现弱类型的

  C语言的结构(struct):包含多个成员,可能有多种数据类型,并且需要分配几种类型占用空间之和的空间。

  联合(union):支持多种类型,供使用者使用其中一种数据类型,当然是需要分配其中占用空间最大的数据类型的大小。

  结构和联合通常是出现在一块的。

  PHP是用C语言来实现的,那么思考下为什么PHP可以实现弱类型呢?

  答案就在C语言的结构和联合上。

  从弱类型变量的写入和读取二者分析:

  有了联合,我们可以定义几种类型,让php的变量在其中选取,这个可以解决变量写入。那怎么解决读取这个变量呢?变量设置后,不知道这个变量使用的联合中哪个类型,也就没法读取。

  可以在结构中,设置一个成员专门记录联合中用的哪个类型。这样就ok了。

 

  用一个简单的C例子演示一下:这里只使用了三种类型,整数 浮点数和字符串,php的数组是用hashtable这里就不说了。

  

#include <stdio.h>

typedef union uval{
    long a;
    double b;
    char * c;
} uval;

typedef struct pval{
    uval val;
    int phptype;
} pval;

//enum

void var_dump(pval);

int main(){

    pval pval1 = {{.a = 111}, 1};

    var_dump(pval1);// int 111


    pval1.phptype = 2;
    pval1.val.b = 1.21;

    var_dump(pval1);// float 1.210000

    pval1.phptype = 3;
    pval1.val.c = "abc";

    var_dump(pval1);// string abc

}


/**
 * @param val
 * 根据pval变量类型,决定读取联合体的那个类型
 */
void var_dump(pval val){
    if(val.phptype == 1){
        printf("%s ", "int");
        printf("%ld\n", val.val.a);
    } else if(val.phptype == 2){
        printf("%s ", "float");
        printf("%f\n", val.val.b);
    } else if(val.phptype == 3){
        printf("%s ", "string");
        printf("%s\n", val.val.c);
    }
}

 

可以认为pval这种类型就是php的一个变量的类型。每一个php变量记录了这个值val和类型phptype(实际还有引用计数等)。

每次写入val时,要把其类型也记录下来。这样就实现了弱类型。

 

转载于:https://www.cnblogs.com/firstForEver/p/7132494.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值