PHP je věda

Objektově orientované programování nejen v PHP

Metody objektů

K zajištění přehlednosti kódu, je potřeba správně nastavit jejich viditelnost. Pokud totiž nastane situace, že chceme kód upravit (Refactoring), máme jistotu, že metody označené jako protected jsou pouze ve zděděných třídách a metody private pouze v dané třídě, kde je metoda definovaná. V případě refactoringu je tedy potřeba hlídat pouze vazby v dané třídě (protected, private) a zachování rozhranní k okolnímu světu musíme hlídat pouze u metod public.

<?php
Class AuthenticationService
{
 
    /**
     * @var UserRepository
     */
    protected $userRepository;
 
    /**
     * @param UserRepository $userRepository
     */
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }
 
    /**
     * @param string $user
     * @param string $password
     *
     * @return User
     * @throws Exception
     */
    public function login($user, $password)
    {
        $encodedPassword = $this->salt($password);
        $userData        = $this->userRepository->findByIdAndPassword($user, $encodedPassword);
        if (!$userData) {
            throw new Exception("Login Failed!");
        }
        return new User($userData["name"], $userData["surname"], $userData["address"], $userData["id"]);
    }
 
    /**
     * @param string $userName
     * @param string $password1
     * @param string $password2
     *
     * @return User
     * @throws Exception
     */
    public function createNewUser($userName, $password1, $password2)
    {
        $user = $this->userRepository->findByName($userName);
        if ($user) {
            throw new Exception("Username already exists!");
        }
        if ($password1 != $password2) {
            throw new Exception("passowords doesn?t match!");
        }
        $password = $this->salt($password1);
        $user     = new User($userName, $password, null);
        $this->userRepository->save($user);
        return $user;
    }
 
    /**
     * @param string $password
     *
     * @return string
     */
    protected function salt($password)
    {
        return md5($password);
    }
}

Jak je v ukázce kódu vidět, třída má tři metody. Dvě metody jsou označeny jako public a jedna jako protected. Sice nic nemluví proti tomu, aby byla metoda salt také public, ale na druhé straně taky nic nemluví pro, aby někdo jiný než tato třída měla možnost solit heslo. A protože naše aplikace nevyžaduje přístup k metodě salt, necháme tuto metodu protected.

Jako public označit jen ty metody, u kterých je to nutné