给出PHP include()';d文件父变量范围
在父作用域中使用包含的文件是否与调用该文件的父作用域相同?下面的示例已简化,但执行相同的操作 本质上,一个文件将由一个函数包含,但希望包含的文件的范围是调用该文件的函数所在的范围 main.php:给出PHP include()';d文件父变量范围,php,function,include,scope,Php,Function,Include,Scope,在父作用域中使用包含的文件是否与调用该文件的父作用域相同?下面的示例已简化,但执行相同的操作 本质上,一个文件将由一个函数包含,但希望包含的文件的范围是调用该文件的函数所在的范围 main.php: <?php if(!function_exists('myPlugin')) { function myPlugin($file) { if(file_exists($file) { require $file;
<?php
if(!function_exists('myPlugin'))
{
function myPlugin($file)
{
if(file_exists($file)
{
require $file;
return true;
}
return false;
}
}
$myVar = 'something bar foo';
$success = myPlugin('included.php');
if($success)
{
echo $myResult;
}
$GLOBALS['myVar'] = 'something bar foo';
$success = myPlugin('included.php');
if($success)
{
echo $GLOBALS['myResult'];
}
现在,这真的没有任何实际用途,我想知道怎么做的唯一原因是因为我很固执。这个想法出现在我的脑海里,并不会让它打败我:D
感谢所有做出贡献的人。除了那个嘘我的人。这是一个足够简单的问题,现在我们已经知道(复杂的)解决方案是存在的。
螺丝钉是否“符合PHP的做事方式”。有没有告诉客户“哦,不,我们不应该那样做,这不是正确的做事方式!”?我不这么认为。
再次感谢Chacha102:)我知道的唯一方法是使用超全局数组 main.php:
$GLOBALS['myVar'] = 'something bar foo';
$success = myPlugin('included.php');
if($success)
{
echo $GLOBALS['myResult'];
}
included.php:
<?php
$myResult = strlen($myVar);
<?php
$myResult = array(
$myVar,
$c->get_something()
);
<?php
$GLOBALS['myResult'] = strlen($GLOBALS['myVar']);
get\u defined\u vars()
获取在其调用范围内定义的所有变量extract()
获取一个数组并将其定义为局部变量
extract(array("test"=>"hello"));
echo $test; // hello
$vars = get_defined_vars();
echo $vars['test']; //hello
因此,达到了预期的结果。但是,您可能希望从变量中删除超全局变量和其他内容,因为覆盖它们可能是不好的
看看这个,把坏的去掉
为了得到相反的结果,您可以这样做:
function include_use_scope($file, $defined_variables)
{
extract($defined_variables);
return include($file);
}
extract(include_use_scope("file.php", get_defined_vars()));
include.php
// do stuff
return get_defined_vars();
但总的来说,我不认为你会得到想要的效果,因为这不是PHP的构建方式 那么main.php如何访问included.php的本地变量,就像在OP的代码中一样。。。忽略了这一部分。我的回答是,这只是单向的,因为我相信双向操作是行不通的。我提出了一个解决方案,该文件可以返回定义的变量,然后主文件可以提取它们。。但它看起来真的很烦人,这确实给了我一个很好的方法。这是冗长的,复杂的,并不是真正必要的。但是谢谢你的帮助!
function include_use_scope($file, $defined_variables)
{
extract($defined_variables);
return include($file);
}
extract(include_use_scope("file.php", get_defined_vars()));
// do stuff
return get_defined_vars();