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);
    ?>

    输出结果:

    在页面上的验证结果:

  • 相关阅读:
    不写helloworld总觉得哪里似乎不对之javascript
    SQl中drop与truncate的区别
    对MarshalByRefObject的讲解(转自DuDu)
    “模态子窗体关闭后,父窗体也关闭”解决方案
    ENVI5.0 32位工具栏图标不显示解决办法
    HTML5的基础写法
    查询远程服务器数据
    javascript变量、作用域和内存问题
    javascript基本概念
    让应用程序具体相应权限
  • 原文地址:https://www.cnblogs.com/stzhang/p/15058512.html
Copyright © 2011-2022 走看看