【问题标题】:PHP include scope classPHP 包含范围类
【发布时间】:2026-01-28 14:30:01
【问题描述】:

所以我有这个问题,我有 3 个类似的文件

2.php

<?php
$variable = 4;
?>

1.php

<?php
class foo {
function bar() {include_once('2.php');}
}
?>

index.php

<?php
include_once('1.php');
$foo = new foo;
foo->bar();
echo $variable;
?>

为什么它告诉我变量没有价值? 如果我喜欢这个

<?php
include_once('1.php');
$foo = new foo;
foo->bar();
include_once('2.php');
echo $variable;
?>

它也不起作用。 只有这样

<?php
include_once('1.php');
$foo = new foo;
//foo->bar();
include_once('2.php');
echo $variable;
?>

它会起作用,有什么解释吗? 谢谢

【问题讨论】:

    标签: php class include scope


    【解决方案1】:

    您混淆了includeinclude_once

    当您使用后者时,文件加载和变量声明只会发生一次。如果你在方法范围内这样做,它不会在全局范围内再次声明。反之亦然。

    【讨论】:

    • 它的行为应该如此。您应该解释为什么您预期会有不同的结果。
    • 所以,我希望包含能够像在全局空间中那样工作。如果我包含某些内容,则包含的所有内容在包含后都应该可见。我正在制作的类是一个包装器,用于在 Include 失败时引发特殊错误。这一切都有效,除了包含本身。
    • 包含在全局范围内不起作用。它总是在本地范围内运行脚本。本地范围可能偶然是全局范围,但并非总是如此。如果你在一个方法中运行它,那么 var 只会在那里声明。
    • 那么,我怎样才能把它放在一个方法中,但让它像在全局范围内一样包含在内?
    • 你不能。包含脚本本身必须全球化变量,如果这是应该发生的。
    【解决方案2】:

    $variable的作用域只在bar()函数内

    见:http://php.net/manual/en/language.variables.scope.php

    【讨论】:

    • 如果我没记错的话,在 php 4 中我做了类似的事情并且它工作了,我怎样才能让它以同样的方式在 index.php 上可见?
    • 好吧,在您的第一个索引示例中,您没有包含 1.php,这会使 foo 未定义,因此这可能是个问题。