Функция внутри публичной функции? - PullRequest
0 голосов
/ 26 октября 2011
class ea_framework {

    public function outer() {

        function inner() {

        }

    }

}

Это кажется невозможным?

Я действительно новичок в PHP-классах, и мы будем благодарны за любые советы!

Вот мой тестовый пример:

# Site Class
class ea_framework {

    public function __construct() {
        $this->init();
    }

    public function init() {
        $this->header();            
    }

    public function header() {

        function head_start() {

            # Doctype
            echo "<!DOCTYPE html>\n";
            # Begin HTML
            echo "<html class='".agent()."'>\n";
            # Begin HEAD
            echo "<head>\n";

        }

        $this->head_start();

    }

}

$bro = new ea_framework();

Ошибка:

Fatal error: Call to undefined method ea_framework::head_start() in /home/tfbox/domains/ibrogram.com/public_html/i/construction/core/run.php on line 31

Ответы [ 3 ]

3 голосов
/ 26 октября 2011

Если вы используете PHP 5.3 или выше, вы можете попробовать

$inner = function() { ... }
...
$inner();
2 голосов
/ 26 октября 2011

Работает нормально, но не очень полезно.

PHP выполнит outer() при первом вызове.Внутри он найдет объявление функции для функции inner(), которую он проанализирует.Теперь у вас есть функция global inner, доступная для использования.Обратите внимание, что функция не является частью класса, это просто обычная глобальная функция.Если outer() когда-либо вызывается снова, PHP снова встретит объявление функции для функции с именем inner и остановит выполнение, жалуясь, что вы can't redeclare function inner on line ....

Поэтому, пока он работает (в зависимости отто, что вы хотите достичь), это не очень полезный шаблон.

2 голосов
/ 26 октября 2011

Это работает для меня в PHP 5.2.5 и в PHP 5.2.11 .

В руководстве ничего не говоритсятребования к заметной версии, поэтому я ожидаю, что это сработает в любой версии PHP5 - и, возможно, поздней версии PHP4.


Обновление

Ваш тестовый набор немногонарушена, поскольку ваша внутренняя функция не является членом вашего класса, но вы пытаетесь назвать ее таковой.

Внутренняя функция фактически становится global функция (и вы получите ошибку переопределения, если вызовете внешнюю функцию более одного раза!).

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

Итак, я бы рекомендовал этого не делать.

Если вы все еще действительно этого хотите, звоните $head_start(), а не $this->head_start().

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