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

Klasy i metody PHP

VPS Starter Arubacloud
+1 głos
613 wizyt
pytanie zadane 23 kwietnia 2021 w PHP przez Tukan Nowicjusz (190 p.)

Dzień dobry, otrzymałem zadanie w którym należy utworzyć klasę auto, w której będą metody - przyspiesz (zwiększającą prędkość o 5), - zwolnij (zmniejszającą prędkość o 5). Prędkość nie powinna mieć wartości ujemnej.
Następnie tworzyć klasę potomną: osobowka i zdefiniować metody:  wsiadanie (+1 pasażer), wysiadanie (-1 pasażer), zdefiniować pole max_liczba_pasazerow
Aby mógł wysiąść ostatni pasażer (kierowca) samochód musi stać (prędkość = 0). Liczba pasażerów w osobowce nie może przekroczyć wartości max.
Utworzyć klasę potomną (od auto) - cieżarówka. Zdefiniować metody: zaladuj (+10 ladunku),  rozladuj (-10 ladunku), zdefiniować pole - max_ladunek
Zaladunek i rozladunek są możliwe jedynie gdy ciezarówka się nie porusza. Wartość ladunku nie może przekroczyć max.

Zadanie wydaje się dość proste natomiast wyskakuje mi bląd w lini 29, czyli " if ($this->liczba_pasazerow > max_liczba_pasazerow)". I teraz moje pytanie jest to bląd związany ze składnią czy może potrzebuje tutaj utworzyć osobnę pole dla tej metody? 
Proszę jedynie o wskazówki, nie o rozwiązanie zadania. 
Z góry dziękuje za pomoc. 

<?php

class auto 
{
    public $predkosc;
    public $ladunek;
    public $liczba_pasazerow;


function przyspiesz()
{
    return $this -> predkosc + 5;
}    

function zwolnij()    
{
    if($this -> predkosc > 0)
        $this->predkosc-5;
}
        
} //koniec klasy auto 

class osobowka extends auto
{
    public $max_liczba_pasazerow=4;
    
    function wsiadanie()
    {
         if ($this->liczba_pasazerow > max_liczba_pasazerow)
             echo "Brak dostępnych miejsc";
         else
            $this->liczba_pasazerow+1;        
    }
    function wysiadanie()
    {
         if ($this->predkosc == 0 && liczba_pasazerow > 0) 
            $this-> liczba_pasazerow-1;
    }
    
}//;koniec klasy potomnej osobowka

class ciezarowka extends auto
{
    public $max_ladunek = 3500; //w kg 
    
    function zaladuj()
    {
        if ($this-> predkosc==0 && ladunek < max_ladunek)
            $this-> ladunek+10; 
        
    }
        
        
    function rozladuj()
    {
        if ($this predkosc ==0 && ladunek > 9)
            $this->ladunek-10;
    }
}//koniec klasy potomnej ciezarowka 

$osobowka = new osobowka();
$ciezarowka = new ciezarowka(); 

$osobowka -> przyspiesz();
$osobowka -> zwolnij();
$osobowka -> wsiadanie();
$osobowka -> przyspiesz();
$osobowka -> zwolnij();
$osobowka -> wysiadanie();


?>


 

1 odpowiedź

0 głosów
odpowiedź 23 kwietnia 2021 przez Bizuma Gaduła (3,650 p.)
wybrane 23 kwietnia 2021 przez Tukan
 
Najlepsza
To tylko składnia. Zapomniałeś o $this-> wskazując na "max_liczba_pasazerow". Generalnie z tego co widzę to masz taką tendencję, że w pierwszej zmiennej w if'ie używasz $this a w kolejnych już nie. Np jeszcze linia 36, 48, a w 56 to zapomniałeś dla pierwszej zmiennej strzałeczki a w drugiej tak samo jak wcześniej $this.
komentarz 23 kwietnia 2021 przez Tukan Nowicjusz (190 p.)
Faktycznie masz rację, wynika to z faktu brak doświadczenia w programowaniu ogólnie.

Dzięki za pomoc.
komentarz 23 kwietnia 2021 przez Tukan Nowicjusz (190 p.)

@Bizuma, A widzisz jeszcze jakieś błędy? Bo nie mogę przypisywać różnych wartości dla $predkosc, $ladunek, $liczba_pasazerow. Nie wiem czy ustawic to w getterze i settrze, czy jakos inaczej? 

komentarz 23 kwietnia 2021 przez Bizuma Gaduła (3,650 p.)

Wklej proszę poprawiony do tej pory kod i będziemy kombinować. Ale tak, chyba rozumiem o co może Ci chodzić. Weźmy dla przykładu klasę auto i pierwszą metodę przyspiesz();

class auto 
{
    public $predkosc;
    public $ladunek;
    public $liczba_pasazerow;
 
 
function przyspiesz()
{
    return $this -> predkosc + 5;
}    
 
function zwolnij()    
{
    if($this -> predkosc > 0)
        $this->predkosc-5;
}
         
}

Zwróć uwagę, że wywołanie metody przyspiesz jedynie ZWRACA nowo obliczoną prędkość ale nie przypisuje jej do pola w klasie.

Jeżeli metoda przyspiesz ma zmieniać wartość pola w klasie to powinna wyglądać raczej tak: 

class auto 
{
    public $predkosc;
    public $ladunek;
    public $liczba_pasazerow;
 
 
function przyspiesz()
{
    $this -> predkosc = $this -> predkosc + 5; //wcześniej był tu return a nie przypisanie
}    
 
function zwolnij()    
{
    if($this -> predkosc > 0)
        $this->predkosc-5;
}
         
}

No i podobnie jak wcześniej robisz taką pomyłkę w wielu miejscach.

komentarz 24 kwietnia 2021 przez Tukan Nowicjusz (190 p.)
<?php
 
class auto 
{
    public $predkosc;
    public $ladunek;
    public $liczba_pasazerow;
 
 
function przyspiesz()
{
    $this -> predkosc = $this -> predkosc + 5;
}    
 
function zwolnij()    
{
    if($this -> predkosc > 0)
         $this -> predkosc = $this -> predkosc - 5;
}
         
} //koniec klasy auto 
 
class osobowka extends auto
{
    public $max_liczba_pasazerow=4;
     
    function wsiadanie()
    {
         if ($this->liczba_pasazerow > $this -> max_liczba_pasazerow)
             echo "Brak dostępnych miejsc";
         else
            $this->liczba pasazerow = $this -> liczba_pasazerow+1;        
    }
    function wysiadanie()
    {
         if ($this->predkosc == 0 && $this-> liczba_pasazerow > 0) 
            $this-> liczba_pasazerow = $this-> liczba_pasazerow-1;
    }
     
}//;koniec klasy potomnej osobowka
 
class ciezarowka extends auto
{
    public $max_ladunek = 3500; //w kg 
     
    function zaladuj()
    {
        if ($this-> predkosc==0 && $this-> ladunek < $this -> max_ladunek)
            $this-> ladunek= $this -> ladunek + 10; 
         
    }
         
         
    function rozladuj()
    {
        if ($this predkosc ==0 && ladunek > 9)
            $this-> ladunek= $this -> ladunek - 10;
    }
}//koniec klasy potomnej ciezarowka 
 
$osobowka = new osobowka();
$ciezarowka = new ciezarowka(); 
 

 
?>

W tym momencie po poprawieniu mam coś takiego. 

komentarz 24 kwietnia 2021 przez Bizuma Gaduła (3,650 p.)
w metodzie rozładuj() brakuje ci jeszcze jednego $this przed "ładunek" oraz brakuje strzałki pomiędzy $this a prędkość. Również w ostatniej metodzie. Jak to ogarniesz to możesz powiedzieć czy działa czy czegoś jeszcze potrzeba.
komentarz 24 kwietnia 2021 przez Tukan Nowicjusz (190 p.)
<?php
<?php
 
class Auto 
{
    public $predkosc;
    public $ladunek;
    public $liczba_pasazerow;
 
 
function przyspiesz()
{
    $this -> predkosc = $this -> predkosc += 5;
}    
 
function zwolnij()    
{
    if($this -> predkosc > 0)
         $this -> predkosc = $this -> predkosc - 5;
}
         
} //koniec klasy auto 
 
class Osobowka extends Auto
{
    public $max_liczba_pasazerow=4;
     
    function wsiadanie()
    {
         if ($this->liczba_pasazerow > $this -> max_liczba_pasazerow)
             echo "Brak dostępnych miejsc";
         else
            $this->liczba_pasazerow = $this -> liczba_pasazerow+1;        
    }
    function wysiadanie()
    {
         if ($this->predkosc == 0 && $this-> liczba_pasazerow > 0) 
            $this-> liczba_pasazerow = $this-> liczba_pasazerow-1;
    }
     
}//;koniec klasy potomnej osobowka
 
class Ciezarowka extends Auto
{
    public $max_ladunek = 3500; //w kg 
     
    function zaladuj()
    {
        if ($this-> predkosc==0 && $this-> ladunek < $this -> max_ladunek)
            $this-> ladunek= $this -> ladunek + 10; 
         
    }
         
         
    function rozladuj()
    {
        if ($this-> predkosc == 0 && $this ->ladunek > 9)
            $this-> ladunek = $this -> ladunek - 10;
    }
}//koniec klasy potomnej ciezarowka 
 
$osobowka = new Osobowka();
$ciezarowka = new Ciezarowka(); 
echo $osobowka-> zwolnij($predkosc=20);
echo $osobowka-> przyspiesz($predkosc=50);

    
 

 
?>
	

Nie jestem w stanie niczego wypisać na ekranie. Przepraszam za kłopot, ale czego bym nie wpisał albo jakiej składni bym nie użył, niczego nie zwracają te funkcje. 

komentarz 24 kwietnia 2021 przez Bizuma Gaduła (3,650 p.)

Ponieważ twoje metody nic nie zwracają (nie posiadają słowa kluczowego "return"). Obecnie twoje metody zmieniają wartości pól w klasach. Możesz sobie teraz utworzyć nowe metody, które będą zwracać wspomniane wartości albo na końcu tych metod, które już masz dopisać return z nową, już ustawioną wartością. Dodatkowo, o co chodzi z 

echo $osobowka-> zwolnij($predkosc=20);

?

przecież metoda zwonij i przyspiesz nie przyjmują żadnych argumentów.

komentarz 24 kwietnia 2021 przez Tukan Nowicjusz (190 p.)

Faktycznie po wstawieniu "return" działa. 

Jeżeli chodzi o ten fragment kodu "echo $osobowka-> zwolnij($predkosc=20);" to już jakiś akt desperacji chyba, bo siedzę na tym i nic nie działało.

Pozmieniałem tamten kod na przykładowo:

$osobowka = new Auto(); 
$osobowka -> predkosc = 20;
$osobowka -> liczba_pasazerow = 3 ;
echo $osobowka->przyspiesz();

 Testuje dalej to na razie działa. 

Podobne pytania

0 głosów
1 odpowiedź 358 wizyt
pytanie zadane 2 stycznia 2021 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)
0 głosów
1 odpowiedź 187 wizyt
0 głosów
3 odpowiedzi 1,196 wizyt
pytanie zadane 5 kwietnia 2020 w C i C++ przez nanautzin Obywatel (1,510 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 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!

...