有没有一种方法可以检查类成员是否在实例化时进行访问?

时间:2018-10-18 07:36:08

标签: php

因此在PHP 5.4及更高版本中,您可以像这样调用实例化方法。

$class = new Foo()->methodName();

我想检查是否在实例化该类时同时使用了一个方法。

是否可以检查是否在没有方法的情况下同时实例化了该类,如果没有,则默认为方法吗?

2 个答案:

答案 0 :(得分:0)

您可以在要检查其类的对象上使用instanceOf。

答案 1 :(得分:-1)

该类的构造函数无法在php中返回值,因此您不能使用封装在构造函数中的单例,并且看起来不错。当然,你可以做这样的事情

// NOT FOR USE
class Foo {
    private static $instance;
    public function __construct($skipIncapsulate = false) {
        if (!$skipIncapsulation && !self::$instance)
        {
             self::instance = new self(true);
        }
    }

    public function bar() {
        // Do what you want with self::$instance
    }
}
  

不要使用上面的示例,这是一个丑陋的解决方案,它还会在控制器中以及使用类时封装不必要的逻辑

最好使用像这样的单例

class Foo {
    private static $instance;

    private function __construct()
    {}

    public static getInstance()
    {
        return self::$instance ?? self::$instance = new self();
    }
}

尽管如此,您仍然可以创建一个new class FooManager,如果定义了Foo类,它将委托该

class FooManager {
    private static $foo;

    public function __construct()
    {
        self::$foo = self::$foo ?? self::$foo = new Foo();
    }

    public function getFoo()
    {
        return self::$foo;
    }
}

// usage in your code
(new FooManager)->getFoo()->bar();
// You can add __call method to use (new FooManager)->foo->bar()

这将简化代码的使用。在构造函数中封装静态自实例不是一个好习惯