Powtórka — prosty kalkulator
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 9 z 91.
Wyzwanie
ŚredniZbuduj kompletną klasę Calculator w pliku calculator.php, która demonstruje wszystkie poznane przez Ciebie koncepcje programowania obiektowego. Plik driver.php zaimportuje i przetestuje Twoją klasę.
Twoja klasa Calculator powinna zawierać:
- Właściwość: właściwość
public $resultdo przechowywania bieżącej sumy - Konstruktor (
__construct): ustaw$resultna0i wypisz"Calculator ready" - Destruktor (
__destruct): wypisz"Calculator shutting down" - Metody, z których każda używa
$this, aby zaktualizować i zwrócić wynik:add($number): dodaje liczbę do wynikusubtract($number): odejmuje liczbę od wynikumultiply($number): mnoży wynik przez liczbędivide($number): dzieli wynik przez liczbę, używając dzielenia całkowitego (intdiv). Jeśli liczba wynosi0, wypisz"Error: Division by zero"i zwróć niezmieniony wynikclear(): ustawia wynik ponownie na0getResult(): zwraca bieżący wynik
Wszystkie metody arytmetyczne muszą zwracać nowy wynik po wykonaniu operacji.
Przykładowe użycie:
require_once 'calculator.php';
$calc = new Calculator(); // prints: Calculator ready
$calc->add(5); // result becomes 5
$calc->multiply(3); // result becomes 15
$calc->subtract(2); // result becomes 13
$calc->divide(0); // prints: Error: Division by zero (result stays 13)
$calc->divide(2); // result becomes 6 (integer division)
$calc->clear(); // result becomes 0
// When script ends: prints Calculator shutting downSpróbuj swoich sił
<?php
require_once 'calculator.php';
$testCase = trim(fgets(STDIN));
if ($testCase == "constructor_test") {
$calc = new Calculator();
echo "Initial result: " . $calc->getResult() . "\n";
echo "Calculator created successfully\n";
} elseif ($testCase == "addition_test") {
$calc = new Calculator();
$result1 = $calc->add(10);
echo "After adding 10: " . $result1 . "\n";
$result2 = $calc->add(5);
echo "After adding 5: " . $result2 . "\n";
echo "Final result: " . $calc->getResult() . "\n";
} elseif ($testCase == "subtraction_test") {
$calc = new Calculator();
$calc->add(20);
$result1 = $calc->subtract(8);
echo "After subtracting 8 from 20: " . $result1 . "\n";
$result2 = $calc->subtract(2);
echo "After subtracting 2: " . $result2 . "\n";
echo "Final result: " . $calc->getResult() . "\n";
} elseif ($testCase == "multiplication_test") {
$calc = new Calculator();
$calc->add(5);
$result1 = $calc->multiply(4);
echo "After multiplying by 4: " . $result1 . "\n";
$result2 = $calc->multiply(2);
echo "After multiplying by 2: " . $result2 . "\n";
echo "Final result: " . $calc->getResult() . "\n";
} elseif ($testCase == "division_test") {
$calc = new Calculator();
$calc->add(100);
$result1 = $calc->divide(4);
echo "After dividing by 4: " . $result1 . "\n";
$result2 = $calc->divide(5);
echo "After dividing by 5: " . $result2 . "\n";
echo "Final result: " . $calc->getResult() . "\n";
} elseif ($testCase == "division_by_zero_test") {
$calc = new Calculator();
$calc->add(50);
echo "Initial value: " . $calc->getResult() . "\n";
$result = $calc->divide(0);
echo "Result after division by zero: " . $result . "\n";
echo "Value unchanged: " . $calc->getResult() . "\n";
} elseif ($testCase == "clear_test") {
$calc = new Calculator();
$calc->add(25);
$calc->multiply(3);
echo "Before clear: " . $calc->getResult() . "\n";
$result = $calc->clear();
echo "After clear: " . $result . "\n";
echo "Current result: " . $calc->getResult() . "\n";
} elseif ($testCase == "comprehensive_test") {
$calc = new Calculator();
$calc->add(10);
$calc->multiply(3);
$calc->subtract(5);
$calc->divide(5);
echo "After sequence of operations: " . $calc->getResult() . "\n";
$calc->divide(0);
echo "After division by zero attempt: " . $calc->getResult() . "\n";
$calc->clear();
$calc->add(100);
echo "After clear and add 100: " . $calc->getResult() . "\n";
} else {
echo "Unknown test case\n";
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online