PHP - Hur fungerar klasser och när använder man dem?

Permalänk
Medlem

PHP - Hur fungerar klasser och när använder man dem?

Hej! har under lång tid försökt lära mig hur klasser fungerar och när man ska använda dom. Kan nnån vänlig snälla hjälpa mig förstå??

rubrik
Permalänk
Medlem

Klasser i PHP är ganska lätt.

<?php class KlassNamn{ //detta är namnet som du kommer använda sen för att hänvisa till den här klassen/objektet public $enVariabel; public $enAnnanVariabel; public function __construct($parameterA, $parameterB){ //detta är det som körs om vi skapar en ny $this->enVariabel = $parameterA; //här säger vi åt att vad klassen har ska vara vad som parametern ovan är. En parameter sitter innuti () ovan efter ordet __construct $this->enAnnanVariabel = $parameterB; //detta är samma sak, bara att nu sätter vi andra variabeln till den andra parametern. } public function Addera(){ //en funktion som vi kan anropa senare (se längre ner) return $this->enVariabel + $this->enAnnanVariabel; //detta gör att summan av de båda återges } } //här ska vi nu använda den: $enKlass = new KlassNamn(1, 3); //här är första parametern 1 och andra är 3. Därför blir värdet av enVariabel 1 och värdet av enAnnanVariabel 3. Eftersom vi säger åt PHP att $parameterA = 1 och $parameterB = 3. //nu kan vi anropa Addera: echo $enKlass->Addera(); //på skärmen bör det nu stå: 4 eftersom den slår ihop $parameterA och $parameterB.

Berätta gärna om du vill ha fler exempel. Visa gärna upp kod som du vill ha förklarad också. Glöm bara inte skriva din kod såhär:
[code-tag] (utan -tag)
din kod här
[/code-tag] (utan -tag)

Du kan också skicka PM om du har mer direkta frågor

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Moderator
Festpilot 2020, Antiallo

@bennes:
*Rubrik redigerad*

Tänk på att rubriken måste vara lätt tolkad och överskådlig. Det är lättare att få hjälp då.
Du bör även fylla ut med mer tydliga och konkreta frågor. Ingen kan lära dig PHP åt dig.

Visa signatur

 | PM:a Moderatorerna | Kontaktformuläret | Geeks Discord |
Testpilot, Skribent, Moderator & Geeks Gaming Huvudadmin

Permalänk
Medlem

@freddyfresh: tusen tack för ditt inlägg men en sak jag inte har förstått är hur och varför man använder this och self

Permalänk
Medlem

en kille hjälpte mig använda klasser till ett yatzyspel men har inte lyckats klura ut hur jag använder en html knapp för å rolla.
här kommer php koden:
[code-tag]

class Dice
{
protected $rolls = 0;
protected $numDice = 5;
protected $dice = [];
protected $sides = 6;

public function __construct(int $numDice = null)
{
if ($numDice) {
$this->numDice = $numDice;
}

foreach(range(1, $this->numDice) as $die) {
$this->dice[$die] = null;
}
}

public function roll(): array
{
$this->rolls++;

foreach ($this->dice as $die => $value) {
$this->dice[$die] = mt_rand(1, $this->sides);

}

return $this->dice;
}

public function getNumRolls(): int
{
return $this->rolls;
}
}

$dice = new Dice;

for ($i = 0; $i < 10; $i++) { // roll the dice 10 times
$result = $dice->roll();
$roll = array_sum($result);
$last = array_pop($result);
#$rolls = implode("*", $result) . " and a $last";
$rolls = implode("*", $result)."*".$last;

echo "Roll #{$dice->getNumRolls()} is $roll. You rolled a $rolls.<br>";

}
$_SESSION["roll7"] = $rolls;

[/code-tag]

Permalänk
Medlem
Skrivet av bennes:

@freddyfresh: tusen tack för ditt inlägg men en sak jag inte har förstått är hur och varför man använder this och self

self använder du när du accessar statiska metoder och variabler. $this så accessar du metoder och variabler av den specifika instansen av klassen som du befinner dig i för tillfället.
Det finns en del "specialare" kring detta, men tänk $this för att referera till det nuvarande objektet och self för att referera till den nuvarande klassen.

static tillkom senare också och refererar till en given klass i en hirarki som för tillfället är den instansierade.

Säg att du har en klasshirarki där B ärver från A.
I A finns sedan en statisk funktion A::foo()

I A::foo() så använder du self. Om du gör en instans av A eller B här så kommer self i A::foo här referera till klassen av typ A i båda fallen.

Om du istället använder static i A::foo(), eller innan detta keyword kom get_called_class(), så kommer du få A i de fall du instansierat ett object av typen A och B i de fall du instansierat ett object av typen B.

Visa signatur

Huvudriggen är en Gigabyte Aorus Xtreme | 128gb DDR5 6000 | Ryzen 7950X | 3080Ti
Utöver det är det för många datorer, boxar och servar för att lista :P

Permalänk
Medlem

Låt säga att jag sja göra ett yatzy spel med php. Hu5r sdre koden ut för att kasta tärningarna? Jag använder rand(1,6) för att slumpa ett tärningskast men förstår inte hur jag ska returnera kasten från funktionen. Går väl göra med hjä'lp av en array, men känns som att de34t finns en bättre sätt.

class roll_dice { public $nummerofdices; static $timesrolled=0; public $d1; function roll_dice2() { $d1=rand(1,6); // $d2=rand(1,6); // $d3=rand(1,6); // $d4=rand(1,6); // $d5=rand(1,6); $this->$timesrolled++; return $d1;

/

Permalänk
Medlem

PHP är relativt bra dokumenterat och du bör kunna se ganska mycket information här:
https://www.php.net/manual/en/function.rand.php

Du returnerar kastet ovan genom ordet ___return____ som står innan $d1 som är din instans av en random ($d1). Enda är att du aldrig sätter värdet av "public $d1". Det gör du genom att: $this->d1 = rand(1,6);

Du kan behålla return men det beror på hur du lagt upp din kod.

Följande sätter bara din variabel $d1 till det i klassen, men den ger inget tillbaka när du anropar koden

$this->d1 = rand(1,6);

Denna gör både och

$this->d1 = rand(1,6); return $this->d1;

Denna gör bara en return och sätter aldrig värdet av d1

return rand(1,6);

Här skapar man en som man ger tillbaka, så som du gjort ovan, men den som du ser sparar inte till klassen, den har inte $this->d1 som säger åt klassen att ta sitt egna värde och göra något med den (se andra exemplet här för hur).

$d1 = rand(1,6); return $d1;

Ett exempel med din egen kod vore:

class roll_dice { public $nummerofdices; //en variabel för antal tärningar static $timesrolled=0; //antal gånger en person kastat tärningen public $d1; //vad värdet av senaste kastet var function roll_dice2() //funktionens namn som anropas { $this->d1=rand(1,6); //sätt värdet av d1 till en slumpad siffra där 1 är lägst och 6 högst // $d2=rand(1,6); // $d3=rand(1,6); // $d4=rand(1,6); // $d5=rand(1,6); self::$timesRolled++; //öka antal kast med 1 (++) (minska är tvärtom, --) return $this->d1; //ge tillbaka värdet till anropet } }

För att göra din kod relativt lättläst hade jag ändrat till:

class Dice { public $numberOfDices; //en variabel för antal tärningar static $timesRolled=0; //antal gånger en person kastat tärningen public $lastThrow; //vad värdet av senaste kastet var function Roll() //funktionens namn som anropas { $this->lastThrow = rand(1,6); //sätt värdet av d1 till en slumpad siffra där 1 är lägst och 6 högst self::$timesRolled++; //öka antal kast med 1 (++) (minska är tvärtom, --) return $this->lastThrow; //ge tillbaka värdet till anropet } }

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk

Något sånt här kanske är en bra start. Koden kan innehålla syntaxfel, har ingen editor eller webserver här just nu.

class Dice { public function roll(): int { return rand(1, 6); } } class Yatzy { private $dices = []; public function __construct(array $dices) { $this->dices = $dices; } public function playRound(): array { $hand = []; foreach ($this->dices as $dice) { $hand[] = $dice->roll(); } return $hand; } } // Create five dices $dices = []; for ($i = 0; $i < 5; $i++) { $dices[] = new Dice(); } // Instantiate the Yatzy game $yatzy = new Yatzy($dices); // Play a round of Yatzy! $hand = $yatzy->playRound(); var_dump($hand);