• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyświetlanie listy obiektów klas dziedziczących

VPS Starter Arubacloud
0 głosów
89 wizyt
pytanie zadane 20 maja 2022 w PHP przez MKolaj15 Bywalec (2,270 p.)
edycja 21 maja 2022 przez MKolaj15

Witam, mam stworzone 3 klasy, które dziedziczą po sobie: Car, NewCar, InsuranceCar. W drugim pliku znajduje się formularz, w którym na początku użytkownik ma wybrać jedną z tych trzech opcji. Zważywszy na to, że klasy posiadają rożną ilość pól, to w zależności od wyboru, ma ukazać się kolejny odpowiedni formularz w celu wprowadzenia danych do konstruktora wybranej klasy. Po uzupełnieniu wszystkich pól i przesłaniu drugiego formularza ma ukazać się lista utworzonych obiektów wraz z opisem (funkcja toString). Tu pojawia się mój problem, chciałem stworzyć tablicę przechowywującą te obiekty, ale po przesłaniu formularza wyświetlają się tylko informacje o obiekcie, który właśnie stworzyliśmy. Dodatkowo niezależnie od wyboru klasy, wyświetla się zawartość toString dla klasy Car. Mój kod:

<?php
    class Car{
        protected static int $ile = 0;
        protected $model;
        protected $cena;
        protected $kurs;

        public function __construct(){
            self::$ile++;
        }

        public function __get($property) {
            if ($property === 'model') {
                return $this->model;
            }
            if ($property === 'cena'){
                return $this->cena;
            }
            if ($property === 'kurs'){
                return $this->kurs;
            }
        }

        public function __set($property, $value) {
            if ($property === 'model') {
                $this->model = $value;
            }
            if ($property === 'cena'){
                $this->cena = $value;
            }
            if ($property === 'kurs'){
                $this->kurs = $value;
            }
        }

        public function value(){
            return $this->cena * $this->kurs;
        }

        public function __toString(): string
        {

            return "Ile: " . self::$ile . "\n" .
                "Model: $this->model\n".
                "Cena: $this->cena\n".
                "Kurs: $this->kurs\n";
        }

    }

    class NewCar extends Car{
        private $alarm;
        private $radio;
        private $climatronic;

        public function __construct($model, $cena, $kurs, $alarm, $radio, $climatronic)
        {
            if(is_string($model) && is_numeric($cena) && is_numeric($kurs) && is_bool($alarm) && is_bool($radio)  && is_bool($climatronic)) {
                self::$ile++;
                $this->model = $model;
                $this->cena = $cena;
                $this->kurs = $kurs;
                $this->alarm = $alarm;
                $this->radio = $radio;
                $this->climatronic = $climatronic;
            } else {
                die("Podano niewłaściwe wartości");
            }
        }

        public function __get($property) {
            if ($property === 'alarm') {
                return $this->alarm;
            }
            if ($property === 'radio'){
                return $this->radio;
            }
            if ($property === 'climatronic'){
                return $this->climatronic;
            }
        }

        public function __set($property, $value) {
            if ($property === 'alarm') {
                $this->alarm = $value;
            }
            if ($property === 'radio'){
                $this->radio = $value;
            }
            if ($property === 'climatronic'){
                $this->climatronic = $value;
            }
        }

        public function value()
        {
            if($this->alarm == true) {
                return ($this->cena + ($this->cena * 0.05)) * $this->kurs;
            } elseif ($this->radio == true) {
                return ($this->cena + ($this->cena * 0.075)) * $this->kurs;
            } elseif ($this->climatronic == true){
                return ($this->cena + ($this->cena * 0.1)) * $this->kurs;
            } elseif ($this->climatronic == true && $this->radio == true){
                return ($this->cena + ($this->cena * 0.175)) * $this->kurs;
            } elseif ($this->climatronic == true && $this->alarm == true){
                return ($this->cena + ($this->cena * 0.15)) * $this->kurs;
            } elseif ($this->radio == true && $this->alarm == true){
                return ($this->cena + ($this->cena * 0.08)) * $this->kurs;
            } elseif ($this->radio == true && $this->alarm == true && $this->climatronic == true){
                return ($this->cena + ($this->cena * 0.18)) * $this->kurs;
                return ($this->cena + ($this->cena * 0.18)) * $this->kurs;
            }
        }

        public function __toString(): string
        {
            return "Ile: " . self::$ile . "\n" .
                "Model: $this->model\n".
                "Cena: $this->cena\n".
                "Kurs: $this->kurs\n".
                "alarm: $this->alarm\n".
                "radio: $this->radio\n".
                "klimatyzacja: $this->climatronic\n";
        }

    }

    class InsuranceCar extends NewCar{
        private $firstOwner;
        private $years;

        public function __get($property)
        {
            if ($property === 'firstOwner') {
                return $this->firstOwner;
            }
            if ($property === 'years') {
                return $this->years;
            }
        }

        public function __set($property, $value) {
            if ($property === 'firsOwner') {
                $this->firstOwner = $value;
            }
            if ($property === 'years'){
                $this->years = $value;
            }
        }

        public function __construct($model, $cena, $kurs, $alarm, $radio, $climatronic, $firstOwner, $years)
        {
            if(is_string($model) && is_numeric($cena) && is_numeric($kurs) && is_bool($alarm) && is_bool($radio) && is_bool($climatronic) && is_bool($firstOwner) && is_numeric($years)) {
                $this->model = $model;
                $this->cena = $cena;
                $this->kurs = $kurs;
                $this->alarm = $alarm;
                $this->radio = $radio;
                $this->climatronic = $climatronic;
                $this->firstOwner = $firstOwner;
                $this->years = $years;
            } else {
                die("Podano niewłaściwe wartości");
            }
        }

        public function value()
        {
            if($this->firstOwner){
                return $this->cena - (($this->cena * 0.1) * $this->years) - ($this->cena * 0.5);
            } else{
                return $this->cena - (($this->cena * 0.1) * $this->years);
            }
        }

    }

    $cars = array();

    if(isset($_POST['model']) && isset($_POST['cena']) && isset($_POST['kurs'])) {
        $object = $_POST['model'];
        $object = new Car();
        $object->__set('model', $_POST['model']);
        $object->__set('cena',  $_POST['cena']);
        $object->__set('kurs',  $_POST['kurs']);
        array_push($cars, $object);
    } elseif(isset($_POST['model']) && isset($_POST['cena']) && isset($_POST['kurs']) && isset($_POST['alarm']) && isset($_POST['radio']) && isset($_POST['klimatyzacja'])){
        $object = $_POST['model'];
        $object = new NewCar($_POST['model'], $_POST['cena'], $_POST['kurs'], $_POST['alarm'], $_POST['radio'], $_POST['klimatyzacja']);
        array_push($cars, $object);
    } elseif(isset($_POST['model']) && isset($_POST['cena']) && isset($_POST['kurs']) && isset($_POST['alarm']) && isset($_POST['radio']) && isset($_POST['klimatyzacja']) && isset($_POST['pierwszyWlasciciel']) && isset($_POST['lata']) ){
        $object = $_POST['model'];
        $object = new InsuranceCar($_POST['model'], $_POST['cena'], $_POST['kurs'], $_POST['alarm'], $_POST['radio'],  $_POST['klimatyzacja'], $_POST['pierwszyWlasciciel'], $_POST['lata']);
        array_push($cars, $object);
    } else {
        echo "<p style='color: #ff0817'>Proszę uzupełnić wszystkie pola.</p>";
    }

    foreach ($cars as $car){
        echo"<p>" . $car->__toString() . "</p>";
    }

?>

Formularze: 

<!DOCTYPE html>
<html lang="pl-PL">
<head>
    <meta charset="UTF-8">
    <title>Samochody</title>
</head>
<body>
    <h2>Wybierz usługę:</h2>
    <form action="Formularz.php" method="post">
        <select name="chooseService">
            <option value="Car">Samochód</option>
            <option value="NewCar">Nowy samochód</option>
            <option value="InsuranceCar">Ubezpieczenie samochodu</option>
        </select>
        <p><input type='submit' name="usluga"></p>
    </form>

    <?php
        if(isset($_POST['usluga'])) {
            if (isset($_POST['chooseService'])) {
                if ($_POST['chooseService'] == "Car") {
                    echo "<form action='Zad7.9.2.php' method='post'>";
                    echo "<p>Podaj model: <input type='text' name='model'></p>";
                    echo "<p>Podaj cenę (&#8364): <input type='number' name='cena'></p>";
                    echo "<p>Podaj kurs: <input type='text' name='kurs'></p>";
                    echo "<p><input type='submit'></p>";
                    echo "</form>";
                } elseif ($_POST['chooseService'] == "NewCar") {
                    echo "<form action='Zad7.9.2.php' method='post'>";
                    echo "<p>Podaj model: <input type='text' name='model'></p>";
                    echo "<p>Podaj cenę (&#8364): <input type='number' name='cena'></p>";
                    echo "<p>Podaj kurs: <input type='text' name='kurs'></p>";
                    echo "<p>Alarm: <select name='alarm'>" .
                        "<option value='1'>Tak</option>" .
                        "<option value='0'>Nie</option>" .
                        "</select></p>";
                    echo "<p>Radio: <select name='radio'></p>" .
                        "<option value='1'>Tak</option>" .
                        "<option value='0'>Nie</option>" .
                        "</select></p>";
                    echo "<p>Klimatyzacja: <select name='klimatyzacja'></p>" .
                        "<option value='1'>Tak</option>" .
                        "<option value='0'>Nie</option>" .
                        "</select></p>";
                    echo "<p><input type='submit'></p>";
                    echo "</form>";
                } elseif ($_POST['chooseService'] == "InsuranceCar") {
                    echo "<form action='Zad7.9.2.php' method='post'>";
                    echo "<p>Podaj model: <input type='text' name='model'></p>";
                    echo "<p>Podaj cenę (&#8364): <input type='number' name='cena'></p>";
                    echo "<p>Podaj kurs: <input type='text' name='kurs'></p>";
                    echo "<p>Alarm: <select name='alarm'>" .
                        "<option value='1'>Tak</option>" .
                        "<option value='0'>Nie</option>" .
                        "</select></p>";
                    echo "<p>Radio: <select name='radio'></p>" .
                        "<option value='1'>Tak</option>" .
                        "<option value='0'>Nie</option>" .
                        "</select></p>";
                    echo "<p>Klimatyzacja: <select name='klimatyzacja'></p>" .
                        "<option value='1'>Tak</option>" .
                        "<option value='0'>Nie</option>" .
                        "</select></p>";
                    echo "<p>Pierwszy właściciel?: <select name='pierwszyWlasciciel'></p>" .
                        "<option value='1'>Tak</option>" .
                        "<option value='0'>Nie</option>" .
                        "</select></p>";
                    echo "<p>Ile lat?: <input type='number' name='lata'></p>";
                    echo "<p><input type='submit'></p>";
                    echo "</form>";
                }
            } else {
                echo "<p style='color: red'>Proszę wybrać opcję</p>";
            }
        }
    ?>
</body>
</html>

Byłbym bardzo wdzięczny, gdyby ktoś mógłby mi pomóc i z góry dziękuję.

Edit:

Postanowiłem przechowywać informacje o modelach w ciasteczkach i wyświetlać listę modeli obiektów w oddzielnym pliku. Do każdego modelu samochodu z listy mają pojawić się przyciski "Wyświetl szczegółowe dane" (zapewne za pomocą funkcji toString()), "oblicz cenę" (korzystając z metody value()), "edytuj informacje o samochodzie" oraz "usuń samochód". Czy ktoś były w stanie pomóc mi w skonstruowaniu tak działających przycisków? Nie do końca wiem jak po kliknięciu skrypt ma wybrać akurat dane ciasteczko, odwołać się do danego obiektu i wyświetlić np. informacje o nim. Z góry dziękuję

1
komentarz 20 maja 2022 przez Wiciorny Ekspert (269,120 p.)
Najlepsze są do tego interfejsy. Musisz pamiętać że obiekty i dziedziczenie powoduje jedną rzećż:
Konwersja, rzutowanie czy określenie typu zawsze jest w języku tak typowo obiektowym kaskadowe. Tzn Można rzutować tylko na elementy występujące w hierarchi dziedziczenia Nie inaczej.
Stąd CAR -> nie możesz rzutować na Inny rodzaj np. InsureCar, natomiast InsureCAr juz na Car mozesz.
komentarz 20 maja 2022 przez MKolaj15 Bywalec (2,270 p.)
Dzięki za wskazówki, dopiero zaczynam z obiektowym PHP, więc często nie łapię wszystkiego instynktownie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 181 wizyt
0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 25 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 590 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...