如何在方法内部的函数中使用$ this?

时间:2011-04-27 17:39:44

标签: php oop cakephp

我有一个类方法内的函数。

在方法中我可以参考$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 个答案:

答案 0 :(得分:6)

不要在另一个函数中创建函数,试试这个:

class View {
    var $property = 5;

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

        $this->inner();
    }

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

        echo $this->property;
    }

}

答案 1 :(得分:1)

为什么不用参数传递它?

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

        echo $instance->property;
    }

    inner($this);

答案 2 :(得分:1)

我还不能评论,所以我发布了这个答案。

这个问题似乎与我有关的CakePHP,我认为你过度了View。例如,请考虑从Post Views

中阅读CakePHP Blog Example

总结一下:如果你在CakePHP视图中,那么你只需输出带有嵌入式PHP的HTML。 View可以访问Controller操作中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; ?>

此外,我建议查看Elements,如果符合要求的条件,您可以有条件地加入它们。)。

答案 3 :(得分:0)

当PHP遇到函数定义时,它将函数定义到全局范围。因此,虽然您在方法中声明了您的函数,但函数的范围实际上是全局的。因此,从$this内访问inner()的唯一方法是将其作为参数传递。即便如此,它的行为也会与$this略有不同,因为您不在对象的范围内。