Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在方法内部的函数中使用$this?_Php_Oop_Cakephp - Fatal编程技术网

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

Php 如何在方法内部的函数中使用$this?,php,oop,cakephp,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

我有一个在类方法中的函数

在方法中,我可以引用$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();
你可以在这里测试

有什么办法可以让这一切顺利进行吗? 我知道我可以将$this作为参数传入,但还有其他方法吗?使用global$也会出现错误


如果你好奇我为什么需要这个,那是因为我的方法是MVC模型中的一个视图,或者看起来是这样的-我在使用Cake,在视图中我需要使用一个函数,在函数中我需要引用$this。

不要在另一个函数中创建函数,尝试以下操作:

class View {
    var $property = 5;

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

        $this->inner();
    }

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

        echo $this->property;
    }

}

为什么不用参数传递它呢

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

        echo $instance->property;
    }

    inner($this);

当PHP遇到函数定义时,它将函数定义到全局范围中。因此,尽管在方法中声明了函数,但函数的作用域实际上是全局的。因此,从内部访问$this的唯一方法是将其作为参数传递。即使这样,它的行为也会与$this稍有不同,因为您不在对象的范围内。

我还不能评论,所以我将发布此答案

这个问题似乎与我有关,我认为你做得太过分了。作为一个例子,考虑从

总而言之:如果您在CakePHP视图中,那么您只需输出带有嵌入式PHP的HTML。视图可以访问您在控制器操作中设置的变量,即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; ?>

此外,我还建议查看,如果满足所需条件,您可以有条件地包含它们

CakePHP仍然是PHP4吗?如果可以,请使用PHP5类语法。@Felix,我不知道你的意思。我正在使用PHP5。你能举个例子吗?在PHP4中没有办法指定属性的可见性,但在PHP5中你可以。例如,您应该将$property定义为private:private$property=5;。更多信息:@felix,噢,好的,我明白了,这只是一个简单的例子,我在实践中添加了访问修饰符。我想到了这一点,但函数是对其他东西的回调,所以它被间接调用。我想也许我可以重写调用回调的另一个类来传递引用。@John还说,传递的任何东西都不能访问任何私有或受保护的对象vars@Neal谢谢是的,我想我只需要重新思考一下这个问题。谢谢,据我所知,我不能这么做,我必须遵循这个框架。整个视图似乎是一个方法,我需要多次调用函数。也许视图不应该有功能-我需要总是创建帮助程序来代替?我会重新考虑这一点,然后走另一条路。谢谢