Публичная, частная или охраняемая недвижимость? - PullRequest
0 голосов
/ 10 сентября 2018

Я пишу пакет 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;).

Это хорошая практика? Я имею в виду объявление свойства класса как публичного? А как насчет концепции инкапсуляции в ООП?

Есть идеи, пожалуйста?

1 Ответ

0 голосов
/ 10 сентября 2018

Используйте магический метод __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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...