• 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

Object Storage Arubacloud
0 głosów
91 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,770 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 182 wizyt
0 głosów
1 odpowiedź 326 wizyt
pytanie zadane 25 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 630 wizyt

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...