我测试过以下内容并不起作用。是否有类似的方法来实现这一目标?
制定模板的编译类:
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
,它具有专门用于模板的下划线功能 - 但我更愿意看看原始查询是否可行。
提前谢谢。
答案 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
。由于它们将被封装在具有函数范围的变量中,因此它们将无法在外部使用。