在函数

时间:2016-07-12 23:10:42

标签: php function scope global-variables require

在我正在处理的页面中,我要做的第一件事就是包含我的tools.php文件。说,index.php

require("../scripts/tools.php");

接下来,我创建一个自定义css

$custom_css = [
    $link([
        "rel"   => "stylesheet",
        "type"  => "text/css",
        "media" => "screen",
        "href"  => BASE . "css/layout-list.css",
        ]),
];

并使用自定义require函数包含head元素,该函数在tools.php

中声明
req("template/head.php");

我使用自定义require的原因是因为每次进入文件夹结构时,我都需要在每条路径上增加../。我不想手动添加它们。

base()中有tools.php个功能,它会自动计算返回主文件夹所需的../,并将其分配给BASE常量。此BASE常量用于req()函数

function req($path) {
    require(BASE . $path);
}

这种(有点)有效。问题是,由于(实际)需求在函数内部被调用,head.php无法访问$custom_cssindex.php无法访问head.php内的任何变量。

我提出的解决方案是在使用它之前声明变量是全局的。

所以,如果我必须从$custom_css index.php访问head.phphead.php我会这样做:

global $custom_css;
if (!isset($custom_css)) {
    $custom_css = [];
}

如果我必须从head.php访问index.php中的变量,我必须在head.php内全局声明变量:

global $head_var;
$head_var = 4;

这个过程看起来非常累人和多余。有没有办法改变require效果的位置?即使文件包含在函数中,也要使包含文件中的所有变量都为全局?

1 个答案:

答案 0 :(得分:0)

如果您的所有自定义Imports System.Runtime.InteropServices Public Structure Bools Public b1, b2, b3, b4, b5 As Boolean End Structure Sub Main() Dim bools = New Bools With {.b2 = True, .b4 = True} ' {False, True, False, True, False} Dim size = Marshal.SizeOf(bools) ' 20 Dim intArray%(size \ 4 - 1) 'As Integer ' { 0, 0, 0, 0, 0 } Dim Ptr = Marshal.AllocHGlobal(size) Marshal.StructureToPtr(bools, Ptr, False) Marshal.Copy(Ptr, intArray, 0, size \ 4) ' { 0, 1, 0, 1, 0 } Marshal.FreeHGlobal(Ptr) End Sub 所做的都是req中定义的常量,为什么不直接使用常量?

tools.php