关于PHP特性的一些学习

作者:掠影
最后编辑时间:2018-02-28 18:47:46
浏览次数:2413



    平时在使用PHP的过程中,时常会意识不到变量作用域的存在,基本上在MVC的大框架下,变量之间除了遵守有效作用域覆盖原则(即在作用域内部(如函数,类中),内层的变量会覆盖外层;以及继承时子类对父类变量的覆盖这些常用场景以外,大多乖乖遵守着声明-》调用的规则,也不大会遇到变量作用域失效的问题。

    然而最近在写自己的框架时,却遇到了一些奇妙的问题,大多与变量作用域有关,在经过一些研究和思考后,专门整理出来供大家参考,也为自己留作记录。

    首先,以我们常用的函数array_map开始:

    在使用的时候经常会遇到需要调用上层作用域变量的情况,但在array_map中,允许且仅允许自定义变量以及传入的数组单元,以XXX为例,以下代码会出错,提示Undefined variable: $value in xxxx(变量未定义);

$value = "外层变量";//外层变量
$target_array = [];//目标数组
$funcs = array_map( function($element){
       return str_replace("cli", $value,$element);
}, $target_array);

    其中$element为数组的迭代单元,而我们想要用到上层的$value来修改$element这一步是无法做到的;

    这里引入了use关键字,用闭包的形式手动引入了上层作用域中的$value:

$value = "外层变量";//外层变量
$target_array = [];//目标数组
$funcs = array_map( function($element) use ($value){
       return str_replace("cli", $value,$element);
}, $target_array);

    从而实现了手动调用$value的方法;

    当然了这里也可以用global关键字,将外层变量以外部变量的形式手动声明并且引入到array_map的这次迭代中;

$value = "外层变量";//外层变量
$target_array = [];//目标数组
$funcs = array_map( function($element){
       global $value;
       return str_replace("cli", $value,$element);
}, $target_array);

    似乎通过以上方法就完成了对变量作用域的“跨越”,可这里的两种方法的差别在哪里呢?这边就先从global关键词说起:

    首先,官方文档中对于global关键词的用法,就是在函数内部调用外部变量时,手动声明该变量为global,从而在函数体内部进行调用;这里的意思为两重:

        1. 要引用的这个变量的作用域不在这个函数体里,即直接调用。

        2. 通过global声明,使得这个变量在本函数内变得可用(从外部变成“内部”),而在本函数外,这一变量依旧属于原来的作用域。

    故而这里的所谓global的意思,是引一个本来不属于该作用域的变量到这个作用域中,而非将这个变量设为全局变量;

    这里要与超全局变量$GLOBALS区分开来:它保存的是本次执行中所有定义过的PHP变量的一个集合,大致可以理解为是一个超级哈希表;故而在函数体内也可以用$GLOBALS['value']来代替global声明。

    


取消

感谢您的支持,我会继续努力的!关闭

扫码支持
大家有钱的捧个钱场,没钱的捧个人场233333

打开支付宝扫一扫,即可进行扫码打赏哦

分享到: QQ空间 更多



评论区

  • 183.193*****: 2018-02-28
    可以可以
  • 140.243*****: 2018-03-25
    emmmmm
  • 140.243*****: 2018-03-25
    1
  • 140.243*****: 2018-03-25
    2