公共,私有或受保护的财产?

时间:2018-09-09 21:58:27

标签: php laravel phpunit

我正在编写Laravel软件包,但遇到了问题。程序包将分派执行以下操作的工作:

class ExampleJob
{
    protected $exampleProperty;

    function __construct($parameter)
    {
        $this->exampleProperty = $parameter;
    }
}

我需要测试此作业是否以正确的$参数分派(此值是从数据库中检索的,并且根据情况,它将是一个不同的值)。

根据文档,Laravel允许这样做:

Bus::assertDispatched(ShipOrder::class, function ($job) use ($order) {
    return $job->order->id === $order->id;
});

但这意味着$ order属性必须是公共的(在我的情况下,我是:protected $ exampleProperty;)。

这是一个好习惯吗?我的意思是宣布一个阶级财产为公共? OOP中的封装概念如何?

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

使用魔术方法__get

class ExampleJob
{
    protected $exampleProperty;

    function __construct($parameter)
    {
        $this->exampleProperty = $parameter;
    }

    public function __get($name)
    {
        return $this->$name;
    }
}

$exampleJob = new ExampleJob(42);

// echoes 42
echo $exampleJob->exampleProperty;

// gives an error because $exampleProperty is protected.
$exampleJob->exampleProperty = 13;

找不到公共属性时,将调用__get方法。在这种情况下,您只需返回受保护的属性$ exampleProperty。这使属性$ exampleProperty可以作为公共属性读取,但是不能从ExampleJob类外部进行设置。