как использовать $ this внутри функции, которая находится внутри метода? - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть функция, которая находится внутри метода класса.

В методе я могу ссылаться на $this, но я не могу в этой функции.Будет возвращена эта ошибка:

Неустранимая ошибка: использование $ this, когда не в контексте объекта в /var/www/john/app/views/users/view.ctp в строке 78

Вот пример того, что я имею в виду:

class View
{
    var $property = 5;

    function container()
    {
        echo $this->property;

        function inner()
        {
            echo "<br/>Hello<br/>";

            echo $this->property;
        }

        inner();
    }

}

$v = new View();
$v->container();

Вы можете проверить это здесь pastie

Есть ли способ обойтизаставить это работать? Я знаю, что могу передать $ this в качестве параметра, но есть ли другой способ?Использование global $this также приводит к ошибке.

Если вам интересно, зачем мне это нужно, то это потому, что мой метод - это представление в модели MVC (или, как мне кажется, я использую Cake), ив представлении мне нужно использовать функцию, а в функции мне нужно обратиться к $this.

Ответы [ 4 ]

6 голосов
/ 27 апреля 2011

не создавайте функцию внутри другой функции, попробуйте это:

class View {
    var $property = 5;

    function container() {
        echo $this->property;

        $this->inner();
    }

    function inner() {
        echo "<br/>Hello<br/>";

        echo $this->property;
    }

}
1 голос
/ 27 апреля 2011

Я пока не могу комментировать, поэтому я публикую этот ответ.

Этот вопрос, похоже, связан с CakePHP, и я думаю, что вы переусердствовали с View . В качестве примера рассмотрим чтение просмотров сообщений из примера блога CakePHP

Подводя итог: если вы находитесь внутри CakePHP View, вы просто выводите HTML со встроенным PHP. Представление имеет доступ к переменным, которые у вас есть set в действии контроллера (т.е. UserProfiles::index). Я бы предложил использовать что-то вроде следующего:

<h2>UserProfile for <?php echo $user->name; ?></h2>
<?php if( $user->isAdmin() ): ?>
<p>You're an admin</p>
<?php else: ?>
<p>You're just a user</p>
<?php endif; ?>

Также я бы посоветовал взглянуть на Элементы , вы можете включить их условно, если выполняются необходимые условия;).

1 голос
/ 27 апреля 2011

почему бы не передать его с параметром?

    function inner($instance)
    {
        echo "<br/>Hello<br/>";

        echo $instance->property;
    }

    inner($this);
0 голосов
/ 27 апреля 2011

Когда PHP встречает определение функции, он определяет функцию в глобальной области видимости. Таким образом, хотя вы объявляете свою функцию в методе, область действия функции на самом деле глобальная. Поэтому единственный способ получить доступ к $this из inner() - это передать его в качестве параметра. И даже тогда он будет вести себя немного иначе, чем $this, потому что вы не попадете в сферу действия объекта.

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