@magary4

В чем идея методов getServiceLocatior/setServiceLocator?

Часто вижу в классах

getServiceLocator() {
      return $this->serviceLocator;
}


Какую пользу из этого можно извлечь?
  • Вопрос задан
  • 421 просмотр
Решения вопроса 1
27cm
@27cm
TODO: Написать статус
Если вопрос именно о ServiceLocator в Zend Framework, то эти методы предоставляют доступ к ServiceManager, который позволяет получать другие объекты (сервисы) приложения.

Например, есть класс User, и мы хотим в нём обращаться к сервису для аутентификации. Это можно сделать так:
namespace Application\Entity;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class User implements ServiceLocatorAwareInterface
{
    protected $serviceLocator = null;

    public function __construct(ServiceLocatorInterface $serviceLocator) 
    {
        $this->setServiceLocator($serviceLocator);
    }

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
        return $this;
    }

    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }

    public function getAuthService()
    {
        return $this->getServiceLocator()->get('AuthService');
    }
}


Тоже самое можно написать короче, используя трейт:
namespace Application\Entity;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;

class User implements ServiceLocatorAwareInterface
{
    use ServiceLocatorAwareTrait;

    public function __construct(ServiceLocatorInterface $serviceLocator) 
    {
        $this->setServiceLocator($serviceLocator);
    }

    public function getAuthService()
    {
        return $this->getServiceLocator()->get('AuthService');
    }
}


В качестве альтернативы можно использовать Dependency Injection.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Достоинства геттеров и сеттеров
  • Используя геттеры и сеттеры вы можете осуществлять контроль за тем, какие именно данные содержатся в свойствах объекта, и отклонять любые некорректные значения.
  • Так же вы можете осуществлять дополнительные операции перед тем, как установить или получить значение свойства (например, если обновление данного свойства должно вызывать некоторое действие, такое как оповещение пользователя).
  • При установке значения, которое является объектом или массивом, вы можете явно указать тип переменной в сигнатуре функции(прим. public function setBar(Bar $bar)). К большому сожалению, PHP не позволяет проделывать тоже самое с типами int и string!
  • Если значение свойства должно получаться из внешнего источника или среды исполнения, вы можете использовать ленивую загрузку данных — таким образом ресурсы, требуемые для загрузки данных, будут задействованы непосредственно во время получения значения свойства. Разумеется, в данном случае нужно соблюдать осторожность, и не следует получать данные из внешнего источника при каждом обращении к свойству. Будет лучше сделать одно обращение к базе данных и заполнить значения всех свойств сразу, чем делать это для каждого в отдельности.
  • Вы можете сделать свойство доступным только на чтение или только на запись, путём создания только геттера или только сеттера.
  • Вы можете добавить геттеры и сеттеры в интерфейс для того, чтобы отобразить их в API.

Недостатки геттеров и сеттеров
  • Для разработчиков, которые используют прямой доступ к свойствам, геттеры и сеттеры кажутся настоящей головной болью! Для каждого свойства нужно определить само свойство, геттер и сеттер; и для того чтобы использовать данное свойство в коде, нужно осуществлять дополнительные вызовы метода — намного легче написать $foo->bar++; вместо $foo->setBar($foo->getBar() + 1); (хотя, конечно, можно добавить ещё один метод $foo->incrementBar();)
  • Как уже отмечалось выше, существуют небольшие дополнительные расходы, затрачиваемые на вызов метода.
  • Имена геттеров и сеттеров принято начинать с глаголов get и set, но данные глаголы так же могут использоваться и в других методах, которые ни коим образом не относятся к свойствам класса.

Отсюда
Ответ написан
Akdmeh
@Akdmeh
PHP, Yii2, Music
Обычно есть смысл в дополнительной проверке данных, сокрытии реального получения данных (нас не интересует внутренняя реализация и ее можно в любой момент изменить, а интересует только результат).
Кстати, интересное решение есть в Yii2 в классе Object (если не ошибаюсь) - там пусть и используется "магия", но довольно логичная и удобная. Нужен свой getter/setter - напиши его, а если его нет - пользуйся магическим методом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы