2012-01-26 107 views
2

我测试了以下内容,但它不起作用。有没有类似的方法来实现这一目标?PHP:函数内的函数,然后包含内部函数

一个编译类制定一个模板

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();函数中使用 - 在课堂上无处。我不想在模板文件_metadata();中编写$this->_metadata();。这是可以实现的吗?

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

预先感谢您。

回答

4

the manual

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

所以,基本上,你不能做你想做的事情。如果使用function _metadata() {语法定义它,则_metadata将始终为全局函数。正常的函数语法只支持全局函数。

但是,PHP 5.3引入了一些叫做"anonymous functions"的东西。这些可以分配给一个变量。由于变量可以将限定为一个函数作用域(如果明确地这样说,它们只是全局变量),所以可以用这种方式限制它们。

例如:

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

这可能随后在header.php被称为有:

<?php $_metadata(); ?> 

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

+0

我喜欢这个。谢谢:) – escproxy

1

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

但你其实并不需要定义一个_metadata()功能,您可以只执行其中include_header()所有的功能逻辑,然后保存一切都在变$metadata,将在包括印有简单的<?php echo $metadata; ?>

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

+0

我试图避免'回声','打印'等我想使用一个函数。 – escproxy

+1

@Alex无论如何,你必须使用'echo','print'等等,你现在拥有的东西什么都不会做。 – Esailija

+0

我的意思是,在功能之外。当然'echo','print'将会在函数内部。谢谢你:) – escproxy