PHP嵌套函数给出了“在不在对象上下文中时使用$ this”错误

时间:2013-09-04 16:51:01

标签: php

我正在尝试使用内置的array_filter函数过滤数组。根据PHP手册中的示例,我必须提供回调函数的名称。所以,这是我尝试过的:

// This function is a method 
public function send($user_id, $access, $content, $aids)
{
    // check if user is allowed to see the attachments
    function is_owner($var)
    {
        return $this->attachment_owner($var, $user_id);
    }

    $aids = implode(';', array_filter(explode(';', $aids), 'is_owner'));
}

这是我得到的错误:

  

致命错误:当不在文件名行号的对象上下文中时使用$ this。

如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您可以通过使其成为类

的成员来避免使用嵌套函数
... inside a class
function is_owner($var)
{
    return $this->attachment_owner($var, $user_id);
}

public function send($user_id, $access, $content, $aids)
{
// check if user is allowed to see the attachments


$aids = implode(';', array_filter(explode(';', $aids), array($this, 'is_owner')));
... 

参考文献:

What are nested functions for

Array_filter in the context of an object, with private callback

答案 1 :(得分:2)

因为你正在使用PHP> 5.4.0,您可以创建anonymous function甚至使用 $ this

public function send($user_id, $access, $content, $aids)
{   
    // check if user is allowed to see the attachments
    $is_owner = function ($var)
    {
        return $this->attachment_owner($var, $user_id);
    }
    $aids = implode(';', array_filter(explode(';', $aids), $is_owner));

然而,我会选择蒂姆的解决方案,因为它更清洁。

答案 2 :(得分:1)

一种解决方案是使用匿名函数:

$aids = implode(';', array_filter(explode(';', $aids), function($var) { return $this->attachment_owner($var, $user_id); }));