我正在编写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中的封装概念如何?
有什么想法吗?
答案 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类外部进行设置。