zoukankan      html  css  js  c++  java
  • php深拷贝和浅拷贝

    题如下:

    先分析代码:

    1)isset行代表判断一个通过get方法传递的pass变量是否被定义,因此需要传递一个get类型的pass参量,即在链接后面?pass=才可以进入if

    2)$pass代表获得GET方法传递的参数,也即浏览器“pass=”后面的参数

    3)get_magic_quotes_gpc是获取php处理magic_quotes_gpc的状态,php为了安全,引入这个状态函数,用来判断页面上的sql查询语句中存在单引号的情况,如果打开了则单引号前面加/以防sql注入

    4)stripslashes方法是恢复单引号,将前面的/删除的操作,简言之当magic_quotes_gpc = On时,系统会自动处理单引号等问题,用不用addslashes()和stripslashes()都没关系,但是如果添加数据时用了addslashes(),那么显示数据时必须要stripslashes()

    5)后面是关键,把$pass给反序列化,并判断反序列化的结果,如果反序列化失败则不会进入if,因此需要对pass里的内容进行序列化

    6)在if里面,最关键的是$v->secret === $v->enter这一恒等式,这说明这两个变量必须始终相等,进一步意味着它们应该指向同一位置,进动才能一致,因而这里有一个$v->secret到$v->enter浅拷贝的问题

    因此整理思路:a、需要在链接后面以?pass=的方式去输入 b、输入的应该是调用serialize序列化后的结果 c、序列化之前,需要对$v->secret到$v->enter有一个浅拷贝 d、由于$v->secret和$v->enter,而secret和enter又是just4fun的成员变量,也是$v的成员变量($v->标识),因此$v序列化前应该是just4fun的一个实例,其中实现了secret到enter的浅拷贝,然后序列化后作为pass的参数输入

    直接上代码:

    <?php
    class
    just4fun { var $enter; var $secret; } $test = new just4fun(); $test->enter = &$test->secret; $serTest = serialize($test); print_r($serTest);
    ?>

    输出结果:

    在页面上的验证结果:

  • 相关阅读:
    Java 字符串判空
    JavaScript try catch 常用场景(一)
    IE console 未定义
    共享锁与排它锁
    js 原型链
    js的原型模式
    js中RegExp类型
    js中Array对象方法详解
    js动态生成input指定My97DatePicker时间问题
    利用spring、cxf编写并发布webservice
  • 原文地址:https://www.cnblogs.com/stzhang/p/15058512.html
Copyright © 2011-2022 走看看