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

Klasy i metody PHP

+1 głos
107 wizyt
pytanie zadane 23 kwietnia 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 przez Bizuma Gaduła (3,290 p.)
wybrane 23 kwietnia 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 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 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 przez Bizuma Gaduła (3,290 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 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 przez Bizuma Gaduła (3,290 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 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 przez Bizuma Gaduła (3,290 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 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ź 98 wizyt
pytanie zadane 2 stycznia w JavaScript przez Oskar Szkurłat Bywalec (2,060 p.)
0 głosów
1 odpowiedź 104 wizyt
0 głosów
3 odpowiedzi 475 wizyt
pytanie zadane 5 kwietnia 2020 w C i C++ przez nanautzin Użytkownik (890 p.)

85,852 zapytań

134,629 odpowiedzi

298,887 komentarzy

56,719 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 807p. - rucin93
  2. 806p. - nidomika
  3. 806p. - CC PL
  4. 803p. - Whistleroosh
  5. 761p. - adrian17
  6. 754p. - Michal Drewniak
  7. 751p. - Mikbac
  8. 747p. - Mateusz Bogdan
  9. 686p. - Argeento
  10. 683p. - tokox
  11. 649p. - ScriptyChris
  12. 642p. - s. Dorota Kowalewska
  13. 609p. - Vinox
  14. 601p. - Marcin Harasimowicz
  15. 551p. - TheLukaszNs
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

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

...