给出PHP include()';d文件父变量范围

给出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;

在父作用域中使用包含的文件是否与调用该文件的父作用域相同?下面的示例已简化,但执行相同的操作

本质上,一个文件将由一个函数包含,但希望包含的文件的范围是调用该文件的函数所在的范围

main.php:

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