一般是
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 ?>
请问这种情况下要如何传参?先谢谢。
一般是
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 ?>
请问这种情况下要如何传参?先谢谢。
看起来好多文件好乱 ... 我们先不管这么多个文件的事情 ... 先把整个程序流程写在一个文件里吧 ..?
正常传递参数的场景如下 ...
<?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' ] );
不使用 global
... 随需随用 ... 每次调用函数的时候把变量带进去 ... 这是推荐的写法 ...
就是这样啦 ...
可以参考一下 PHPTemplate 或者 Smarty 的实现。
使用时使用方法进行传递,调用时直接使用相应的 key 获取。