PHP:函数内的函数然后包含内部函数

时间:2012-01-26 22:06:09

标签: php class function templates

我测试过以下内容并不起作用。是否有类似的方法来实现这一目标?

制定模板的编译类

private function include_header () {
    function _metadata () {
        // Metadata compiler
        return $metadata;
    }
    include (path . "header.php");
}

的header.php

<html>
<head>
    <?php
        _metadata ();
    ?>
    <title>Hello Stackoverflow!</title>
</head>
<body>
    ...

_metadata ();函数仅在include_header ();函数中可用 - 在类中没有其他地方。我不想仅在$this->_metadata ();的模板文件中编写_metadata ();。这可以实现吗?

或者可以创建一个外部文件,例如functions.php,它具有专门用于模板的下划线功能 - 但我更愿意看看原始查询是否可行。

提前谢谢。

2 个答案:

答案 0 :(得分:4)

来自the manual

  

PHP中的所有函数和类都具有全局范围 - 即使它们是在内部定义的,也可以在函数外部调用它们,反之亦然。

所以,基本上,你不能做你想做的事情。如果使用_metadata语法定义,function _metadata() {将始终是全局函数。普通函数语法仅支持全局函数。

然而,PHP 5.3引入了一个名为"anonymous functions"的东西。这些可以分配给变量。由于变量可以作用域范围(如果你明确说明的话,它们只是全局的),你可以用这种方式限制它们。

例如:

$_metadata = function() {
    // Metadata compiler
    return $metadata;
};

然后可以在header.php中使用:

调用此方法
<?php $_metadata(); ?>

请注意,此 不太稳定:例如,可以将变量重新定义为不同的匿名函数 - 或者根本不是函数。最安全的解决方案是使用模板语言为您解决这些问题。如果没有,您可以接受您必须使用全局函数或匿名函数。

答案 1 :(得分:1)

您无法在PHP中定义嵌套函数。我的意思是,你可以,但没有任何目的,因为它们将具有全局范围,因此它们可以从脚本的任何一点调用。

但实际上你不需要定义_metadata()函数,你可以只执行include_header()中的所有函数逻辑,然后将所有内容存储在变量$metadata中,这将是使用简单的<?php echo $metadata; ?>打印在包含中。

如果您确实需要定义一个函数,可以使用函数create_function()或(仅适用于PHP&gt; 5.3)和anonymous function。由于它们将被封装在具有函数范围的变量中,因此它们将无法在外部使用。