• 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

0 głosów
41 wizyt
pytanie zadane 20 maja w PHP przez MKolaj15 Bywalec (2,050 p.)
edycja 21 maja 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 przez Wiciorny Ekspert (221,630 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 przez MKolaj15 Bywalec (2,050 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 144 wizyt
0 głosów
1 odpowiedź 74 wizyt
0 głosów
1 odpowiedź 307 wizyt

88,311 zapytań

136,904 odpowiedzi

305,517 komentarzy

58,593 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...