2012-01-26 2 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(); - нигде в классе. Я не хочу писать $this->_metadata(); только в файле шаблона _metadata();. Это достижимо?

В качестве альтернативы можно создать внешний файл, например functions.php, который имеет функции подчеркивания специально для шаблона - но я бы скорее посмотрел, возможен ли исходный запрос.

Заранее спасибо.

ответ

4

От the manual:

Все функции и классы в PHP имеют глобальную область видимости - они могут быть вызваны вне функции, даже если они были определены внутри и наоборот.

Таким образом, по сути, вы не можете делать то, что вы пытаетесь сделать. _metadata всегда будет глобальной функцией, если он определен с помощью синтаксиса function _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

Я пытаюсь избежать 'echo',' print' и т. Д. Я хочу использовать функцию. – escproxy

+1

@Alex вы должны использовать 'echo',' print' и т. Д., Так или иначе, то, что вы сейчас имеете, ничего не сделает. – Esailija

+0

Я имел в виду, вне функции. Конечно, функция 'echo',' print' будет внутри функции. Спасибо, тем не менее :) – escproxy