PHP: функция внутри функции, а затем включить с внутренними функциями - PullRequest
2 голосов
/ 27 января 2012

Я проверил следующее, и оно не работает. Есть ли подобный способ достижения этого?

Класс компиляции, который формулирует шаблон :

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 ]

4 голосов
/ 27 января 2012

С руководство :

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

Итак, по сути, вы не можете делать то, что пытаетесь сделать._metadata всегда будет глобальной функцией, если она определена с синтаксисом function _metadata() {.Нормальный синтаксис функции поддерживает только глобальные функции.

Однако , PHP 5.3 вводит то, что называется «анонимные функции» .Они могут быть назначены переменной.Поскольку переменные могут быть ограничены областью действия функции (они являются глобальными, если вы явно так говорите), вы можете ограничить их следующим образом.

Например:

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

Это можно затем вызвать в header.php с помощью:

<?php $_metadata(); ?>

Обратите внимание, что это является менее стабильным: например, можно переопределить переменную, чтобы она быладругая анонимная функция - или вообще не функция.В конечном счете, самым безопасным решением является использование языка шаблонов, который решает эти проблемы для вас.Если нет, вы можете согласиться с тем, что вам придется использовать глобальные функции или анонимные функции.

1 голос
/ 27 января 2012

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

Но на самом деле вам не нужно определять функцию _metadata(), вы можете просто выполнить всю логику функции внутри include_header() и затем сохранить все в переменной $metadata, которая будет напечатана во включении с простой <?php echo $metadata; ?>.

Если вам действительно нужно определить функцию, вы можете использовать функцию create_function() или (только для PHP> 5.3) anonymous function. Поскольку они будут заключены в переменную, которая имеет область действия функции, они не будут доступны снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...