首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用作为公共属性的对象

如何调用作为公共属性的对象
EN

Stack Overflow用户
提问于 2017-12-15 23:33:14
回答 3查看 49关注 0票数 2

以两个类的以下示例为例:

代码语言:javascript
复制
class Yolo {
    public function __invoke() {
        echo 'YOLO';
    }
}

class Swag {
    public $yolo;
    public function __construct() {
        $this->yolo = new Yolo();
    }
}

是否可以通过Yolo实例调用Swag对象?(new Swag())->yolo();抛出警告而不调用__invoke

PHP警告:未定义错误:调用未定义方法Swag::yolo()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-15 23:50:26

在PHP 7中,您可以直接调用它(只需要额外的大括号):

代码语言:javascript
复制
((new Swag())->yolo)();

在PHP 5中,需要一个临时变量:

代码语言:javascript
复制
$y=(new Swag())->yolo;
$y();
票数 3
EN

Stack Overflow用户

发布于 2017-12-15 23:48:44

问题是,您试图在Swag类上调用函数yolo()。在您的情况下,您必须使用公共类变量并对其调用子类。

代码语言:javascript
复制
var_dump((new Swag())->yolo);

那是你的目标。当您使用()时,您尝试调用类,而不是类变量。

票数 1
EN

Stack Overflow用户

发布于 2017-12-15 23:51:58

你甚至不需要让它成为一种公开的方法。但是,由于可调用方法是在运行时创建的,因此可能必须手动重路由调用:

代码语言:javascript
复制
class Yolo {
    public function __invoke() {
        echo 'YOLO';
    }
}

class Swag {
    private $yolo;
    public function __construct() {
        $this->yolo = new Yolo();
    }

    function __call($method, $args) {
          if(is_callable($this->$method))
          {
            return call_user_func_array($this->$method, $args);
          }
     }
}


(new Swag())->yolo();

首先检查被调用的方法是否存在以及它是否实际可调用,这可能是个好主意。

但是这个例子可以作为概念的证明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47841141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档