gpt4 book ai didi

php - 赋予 PHP include() 文件父变量作用域

转载 作者:可可西里 更新时间:2023-11-01 12:20:49 29 4
gpt4 key购买 nike

无论如何,包含文件是否可以在父范围内使用到它被调用的范围?以下示例经过简化,但完成相同的工作。

本质上,一个文件将被一个函数包含,但希望被包含文件的范围是调用包含它的函数的范围。

主.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;
}

included.php:

<?php
$myResult = strlen($myVar);

提前致谢,
亚历山大。

编辑:解决方案

嗯,有点感谢 Chacha102 的贡献。
现在也可以从类中调用!

主.php

<?php
class front_controller extends controller
{
public function index_page()
{
$myVar = 'hello!';

// This is the bit that makes it work.
// I know, wrapping it in an extract() is ugly,
// and the amount of parameters that you can't change...
extract(load_file('included.php', get_defined_vars(), $this));

var_dump($myResult);
}
public function get_something()
{
return 'foo bar';
}
}

function load_file($_file, $vars = array(), &$c = null)
{
if(!file_exists($_file))
{
return false;
}
if(is_array($vars))
{
unset($vars['c'], $vars['_file']);
extract($vars);
}
require $_file;
return get_defined_vars();
}

included.php:

<?php
$myResult = array(
$myVar,
$c->get_something()
);

如果你想引用一个方法,它必须是公开的,但结果是预期的:

array(2) {
[0]=>
string(6) "hello!"
[1]=>
string(7) "foo bar"
}

现在,这实际上没有任何实际用途,我想知道如何做到这一点的唯一原因是因为我很固执。这个想法进入了我的脑海,不会让它打败我:D

<rant>
感谢所有贡献者。除了嘘我的人。这是一个足够简单的问题,现在已经发现存在(复杂的)解决方案。
不管它是否“符合 PHP 的做事方式”。曾经告诉客户“哦不,我们不应该那样做,这不是正确的做事方式!”?没想到。
</rant>

再次感谢 Chacha102 :)

最佳答案

function include_use_scope($file, $defined_variables)
{
extract($defined_variables);
include($file);
}

include_use_scope("file.php", get_defined_vars());

get_defined_vars() 获取在调用它的范围内定义的所有变量。extract() 获取一个数组并将它们定义为局部变量。

extract(array("test"=>"hello"));
echo $test; // hello

$vars = get_defined_vars();
echo $vars['test']; //hello

这样,就达到了预期的效果。然而,您可能想从变量中去除超全局变量和其他东西,因为覆盖它们可能很糟糕。

看看这个 comment用于剥离坏的。

为了得到相反的结果,你可以这样做:

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 的构建方式。

关于php - 赋予 PHP include() 文件父变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211877/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com