【问题标题】:PHP: Function within a function then include with internal functionsPHP:函数中的函数然后包含内部函数
【发布时间】:2012-02-20 00:25:33
【问题描述】:

我已经测试了以下内容,但它不起作用。有没有类似的方法可以做到这一点?

制定模板的编译类

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-&gt;_metadata (); _metadata ();。这是可以实现的吗?

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

提前谢谢你。

【问题讨论】:

    标签: php class function templates


    【解决方案1】:

    来自the manual

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

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

    然而,PHP 5.3 引入了称为"anonymous functions" 的东西。这些可以分配给一个变量。由于变量可以限定为函数作用域(只有在你明确说明时它们才是全局的),你可以用这种方式限制它们。

    例如:

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

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

    <?php $_metadata(); ?>
    

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

    【讨论】:

      【解决方案2】:

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

      但是你实际上不需要定义_metadata()函数,你可以在include_header()里面执行所有的函数逻辑,然后把所有的东西都存储在变量$metadata中,这个变量会打印在包含一个简单的&lt;?php echo $metadata; ?&gt;

      如果你真的需要定义一个函数,你可以使用函数create_function() 或(仅适用于 PHP > 5.3)anonymous function。由于它们将被封装在具有函数作用域的变量中,因此它们将无法在外部使用。

      【讨论】:

      • 我试图避免echoprint 等。我想使用一个函数。
      • @Alex 你必须使用echoprint 等等。无论如何,你目前拥有的将无济于事。
      • 我的意思是,在函数之外。当然echoprint 将在函数内部。不过还是谢谢你:)
      猜你喜欢
      • 2017-01-06
      • 2011-04-18
      • 2021-02-02
      • 2016-04-07
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多