PHP包含错误

时间:2009-12-19 08:38:31

标签: php include header

将我的include标题更改为添加函数后。它禁用了我的php echo用户名代码。

所以它来自

htp://example.com/register.php?r =用户名

HTP://example.com/register.php R =

<?php

function headertop($page) {

 include('header.php');

}

headertop('members');

?>

<div id="myaccount">

<p class="reflink" align="center">To refer others, use this link: <span class="textblue">
             <?php require ("config.php"); echo $url; ?>/register.php?r=<?php echo $row["username"]; ?>
            </span></p>

3 个答案:

答案 0 :(得分:2)

我的猜测是不起作用,因为$row不在范围内。它在header.php中定义,现在是headertop()的本地。

为什么还要以这种方式包含header.php?

答案 1 :(得分:1)

如果在header.php的函数中定义了$row,请尝试添加

global $row

此外,它可能更好的形式,只需将您的所有包括在一个地方。你可能不应该把它放在一个函数中。

答案 2 :(得分:1)

请考虑此代码以了解正在发生的事情:

<?php // bar.php
    $one = 1;
    $two = 2;

<?php // foo.php
    $someVar = 'var';

    function foo()
    {
        $someOtherVar = 'otherVar';
        include 'bar.php';

        // get defined vars in current scope
        print_r(array_keys(get_defined_vars()));
    }

    foo();

    // get defined vars in current scope
    print_r(array_keys(get_defined_vars()));

将输出类似

的内容
Array
(
    [0] => someOtherVar
    [1] => one
    [2] => two
)
Array
(
    [0] => GLOBALS
    [1] => _ENV
    [2] => HTTP_ENV_VARS
    [3] => argv
    [4] => argc
    [5] => _POST
    [6] => HTTP_POST_VARS
    [7] => _GET
    [8] => HTTP_GET_VARS
    [9] => _COOKIE
    [10] => HTTP_COOKIE_VARS
    [11] => _SERVER
    [12] => HTTP_SERVER_VARS
    [13] => _FILES
    [14] => HTTP_POST_FILES
    [15] => _REQUEST
    [16] => someVar
)

正如您所看到的,在foo()的函数范围内,您可以访问bar.php中包含的变量,但是一旦执行该函数并且控制流返回到全局范围,例如,在调用foo()之后,vars不可用,因为它们尚未在函数范围之外导出。如果你在函数范围之外包含了bar.php,例如

include 'bar.php'; // instead of foo()
print_r(array_keys(get_defined_vars()));

你会得到

Array
( 
    ... 
    [16] => someVar
    [17] => one
    [18] => two
)

将大量变量放入全局范围会带来污染全局范围和冒变量名称冲突的风险。也就是说,一个include文件可能有一个$ row变量,另一个可能也有一个,它们会相互覆盖。最好将属于一起的东西封装到类/对象中和/或用Registry pattern替换全局范围。

虽然我非常支持OOP方法,但你仍然可以使用你的功能。只需从函数调用返回所需的变量。

    function foo()
    {
        $someOtherVar = 'otherVar';
        include 'bar.php';

        // this is why I do not like this approach $one pops out all of a sudden.
        // I can deduct, it has to be in bar.php, but if you do that often, your
        // code will be very hard to read.

        return $one;
    }

    $user = foo(); // will contain $one then

    // get defined vars in current scope
    print_r(array_keys(get_defined_vars()));

    // gives
    Array
    (
        ...
        [16] => someVar
        [17] => user
    )

当然,如果您希望在调用foo()期间声明所有变量,则必须将它们放入数组中,因为一次只能返回一个值。但这基本上是当你注意到它变得笨拙并且转换到课堂感觉很自然时(好吧,至少对我而言)。