开发者社区> 问答> 正文

请教PHP中调用别的文件的include函数,要如何传参?

一般是
a.php

<?php
    echo $var;
?>

b.php

<?php
    $var = 'ssss';
    include 'a.php'; // 输出 ssss
?>

但是如果
a.php

<?php
    echo $var;
?>

f.php

<?php
    function i($path) {
        include $path;
    }
?>

b.php

<?php
    include 'f.php';
    $var = 'ssss';
    i('a.php'); // Undefined variable: var
?>

请问这种情况下要如何传参?先谢谢。

展开
收起
落地花开啦 2016-06-13 17:42:13 3821 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    正常传递参数的场景如下 ...

    <?php
    /* $var defined in a.php ... */
    $var = 'ssss';
    
    /* print $var out in b.php ... */
    echo $var;

    无法正常传递参数的场景如下 ...

    <?php
    /* define a function in t.php ... */
    function i( $path ) {
    
        /* print value out suppose if $path equals to 'a.php' ... */
        echo $var;
    
    }
    
    /* define $var and call function in b.php ... */
    $var = 'ssss';
    i( 'a.php' );

    事实上这么一写你就会发现 ... 参数无法传递的情况与是否使用了 include 完全无关 ...
    唯一影响参数传递的原因叫做变量作用域 ... 这是编程的基础知识 ... 你可以参考链接 ...
    现在弄明白了原因 ... 我们来考虑解决方案 ...
    第一种办法 ... 不传参 ... 直接在函数内部调用全局变量 ... 方法有两种 ... 效果是一样的 ...

    <?php
    function i( $path ) {
        echo $GLOBALS['var'];
    }
    
    <?php
    function i( $path ) {
        global $var;
        echo $var;
    }

    这两种方法都是绕过变量作用域让你可以在函数内部获得全局变量的引用 ... 注意是引用 ...
    也就是如果你一不小心就会修改掉这个全局变量的值 ... 而在多数情况下这不是我们想要的 ...
    第二种方法 ... 比第一种方法实现起来麻烦 ... 但是更加整洁可靠 ...

    <?php
    /* make a new slot named $package ... */
    function i( $path, array $package ) {
    
        /* extract our package ... */
        extract( $package );
    
        /* print just like your are in global scope ... */
        echo $var;
    
    }
    
    /* call function i() like this ... */
    i( 'a.php', [
        'var'   =>  'ssss'
    ] );
    2019-07-17 19:36:37
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-直面PHP微服务架构挑战-高驰涛 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载