Menu
Coddy logo textTech

Słowo kluczowe final

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 24 z 91.

Chociaż dziedziczenie i nadpisywanie metod zapewniają elastyczność, czasami trzeba uniemożliwić zmianę określonych klas lub metod. Słowo kluczowe final zabezpiecza kod, gwarantując, że określone implementacje nie mogą zostać zmienione przez klasy potomne.

Gdy oznaczysz metodę jako final, żadna klasa potomna nie może jej przesłonić:

<?php
class BankAccount {
    protected $balance;
    
    public function __construct($balance) {
        $this->balance = $balance;
    }
    
    final public function getAccountId() {
        return "ACC-" . spl_object_id($this);
    }
}

class SavingsAccount extends BankAccount {
    public function addInterest() {
        return $this->balance * 0.05;
    }
}

$account = new SavingsAccount(1000);
echo $account->getAccountId();

Wynik:

ACC-1

Metody getAccountId() nie można nadpisać w klasie SavingsAccount ani w żadnej innej klasie potomnej. Chroni to kluczową funkcjonalność, która musi pozostać spójna we wszystkich typach kont.

Możesz również oznaczyć całą klasę jako final, aby zapobiec dziedziczeniu:

<?php
final class SecurityManager {
    public function authenticate($user) {
        return "Authenticating $user";
    }
}

$security = new SecurityManager();
echo $security->authenticate("admin");

Wynik:

Authenticating admin

Żadna klasa nie może dziedziczyć po SecurityManager. Jest to przydatne w przypadku klas, w których bezpieczeństwo ma szczególne znaczenie, lub gdy projekt klasy jest ukończony i nie powinien być modyfikowany.

Najważniejsze: Użyj final w metodach, aby zapobiec ich przesłanianiu, jednocześnie umożliwiając dziedziczenie, lub w klasach, aby całkowicie uniemożliwić dziedziczenie. To narzędzie do ochrony krytycznego kodu, który musi działać dokładnie zgodnie z założeniami.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system zarządzania dokumentami, który pokazuje, jak słowo kluczowe final chroni kluczowe funkcje przed modyfikacją przez klasy potomne.

Utworzysz trzy współpracujące ze sobą pliki do zarządzania różnymi typami dokumentów, przy jednoczesnym zabezpieczeniu wybranych funkcji:

  • Document.php: Zdefiniuj klasę Document, która będzie klasą bazową dla wszystkich dokumentów. Powinna mieć publiczną właściwość $title i chronioną właściwość $author. Konstruktor przyjmuje tytuł i autora. Dodaj metodę final o nazwie getSignature(), która zwraca "Signed by: [author]". Tej funkcji bezpieczeństwa nie mogą nigdy zmieniać klasy potomne. Dodaj także zwykłą metodę getContent(), która zwraca "Document: [title]".
  • Report.php: Zdefiniuj klasę Report, która rozszerza klasę Document. Na początku dołącz plik Document. Ta klasa dodaje właściwość $department. Konstruktor powinien przyjmować tytuł, autora i dział: użyj parent::__construct() dla dwóch pierwszych argumentów, a następnie ustaw dział. Nadpisz metodę getContent(), aby zwracała "Report: [title] ([department])". Klasa Report dziedziczy metodę getSignature() oznaczoną jako final, której nie może zmienić.
  • main.php: Dołącz plik Report. Otrzymasz trzy dane wejściowe: tytuł dokumentu, nazwisko autora i dział. Utwórz obiekt Report z tymi wartościami. Wypisz wynik działania metody getContent() w pierwszym wierszu, a następnie wynik działania metody getSignature() w drugim wierszu.

To wyzwanie pokazuje, jak metody final chronią kluczowe funkcje: generowanie podpisu pozostaje spójne we wszystkich typach dokumentów, podczas gdy inne metody, takie jak getContent(), mogą być dostosowywane przez każdą klasę potomną. Klasa Report może zmienić sposób wyświetlania treści, ale format podpisu jest zablokowany w klasie nadrzędnej.

Spróbuj swoich sił

<?php
require_once 'Report.php';

// Odczytaj dane wejściowe
$title = trim(fgets(STDIN));
$author = trim(fgets(STDIN));
$department = trim(fgets(STDIN));

// TODO: Utwórz obiekt Report z wartościami wejściowymi

// TODO: Wypisz wynik getContent()

// TODO: Wypisz wynik getSignature()
?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online