【问题标题】:Call to undefined method when using $this使用 $this 时调用未定义的方法
【发布时间】:2015-04-23 15:00:01
【问题描述】:

我在使用$this 时遇到了一些问题。

我有一个控制器:

class UserController {
    public function show() {
        // prepare $array from database
        if ok
            return Response::toJson($array);
        else
            return Response::respondWithError("errorMessage");
    }
}

还有响应类:

class Response
{
    private function respond($array)
    {
        //do som
    }

    public function toJson($array)
    {
        // do som
        $this->respond($array);
    }

    public function respondWithError($message)
    {
        // do som
        $this->respond($array);
    }
}

我得到了错误:

调用未定义的方法 UserController::respond()

为什么$this 指的不是Response 类而是UserController?以及如何从foo() 调用respond() 方法?

【问题讨论】:

  • 您正在静态调用Response::foo,然后$this->respond(); 正在尝试访问Response 实例的方法。
  • 所以我必须返回 Response::respond() ?
  • 不清楚你在做什么,但你可以return self::respond();
  • 我编辑了代码。我正在尝试创建一个处理 json 响应的类,从应用程序的每个控制器调用。所以我想将数据(或错误)提供给 Response 类,并让它在内部管理并以 json 形式返回。我制作了两个静态方法并使用了 self:: 并且它有效。只是想知道这是否是一个好方法。
  • 你知道$this是什么以及static对方法做了什么吗?

标签: php class methods this


【解决方案1】:

首先你把$foo当成静态的,所以声明成静态的,这样就更清楚了...
您不能在静态方法上使用 $this...
你可以将respond()设为静态,然后使用self::respond()

【讨论】:

  • 我正在使用您的答案。只是想知道这是否是实现我目标的正确方法。
  • 如果您不想这样做,则必须创建类 Response 的对象,因此您不需要所有静态关键字
  • 感谢您的解释。你的回答解决了我的问题。
【解决方案2】:

您不能在 STATIC 方法中使用方法,因为那样会破坏encapsulation of OO

【讨论】:

    【解决方案3】:

    你不能在foo中使用$this,你也必须定义respond静态:

    class UserController {
        public function show() {
            // do something
            return Response::foo($array);
        }
    }
    class Response {
        private static function respond() {
            // do something
        }
    
        public static function foo($array) {
            // do
            return self::respond();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      相关资源
      最近更新 更多