PHP Academy · Oppitunti

Staattiset ominaisuudet ja metodit

Käyttäkää staattisia jäseniä ja ymmärtäkää, milloin niitä kutsutaan ilman ilmentymää.

Oppitunti 3/413 vaihetta

Staattiset ominaisuudet ja metodit on ilmainen PHP Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu PHP Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PHP Academy-kurssilla on yhteensä 4 oppituntia.

Johdanto: staattiset ominaisuudet ja metodit

Staattiset jäsenet kuuluvat luokalle itselleen eivätkä millekään yksittäiselle oliolle. Niitä käytetään luokan ulkopuolelta muodossa ClassName::member tai luokan sisällä muodossa self::. Ne ovat yhteisiä kaikille olioille.

Keskeiset käsitteet

Staattisten ominaisuuksien ja metodien keskeiset käsitteet:

  • Määritellään static-avainsanalla
  • Käytetään ::-operaattorilla (nimiavaruuden tarkistusoperaattori)
  • Luokan sisällä käytetään self::; luokan ulkopuolelta ClassName::
  • Myöhäinen staattinen sidonta tehdään komennolla static::

Staattinen ominaisuus

Esimerkki:

<?php
class AppConfig {
    private static array $settings = [];

    public static function set(string $key, mixed $val): void {
        self::$settings[$key] = $val;
    }

    public static function get(string $key, mixed $default = null): mixed {
        return self::$settings[$key] ?? $default;
    }
}

AppConfig::set('debug', true);
echo AppConfig::get('debug') ? 'debug on' : 'debug off';

Staattinen metodi

Jatkoa:

<?php
class MathHelper {
    public static function clamp(float $v, float $min, float $max): float {
        return max($min, min($max, $v));
    }

    public static function lerp(float $a, float $b, float $t): float {
        return $a + ($b - $a) * $t;
    }
}

echo MathHelper::clamp(150, 0, 100); // 100
echo MathHelper::lerp(0, 100, 0.5);  // 50

Singleton-malli

Harjoitus:

<?php
class Database {
    private static ?Database $instance = null;

    private function __construct() {
        echo 'Connected to DB';
    }

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

$db1 = Database::getInstance();  // 'Connected to DB'
$db2 = Database::getInstance();  // no output — same instance
echo ($db1 === $db2) ? 'same' : 'different'; // same

Staattinen laskuri

Syventävää:

<?php
class EventEmitter {
    private static int $instanceCount = 0;

    public function __construct() {
        self::$instanceCount++;
    }

    public static function count(): int {
        return self::$instanceCount;
    }
}

new EventEmitter();
new EventEmitter();
new EventEmitter();
echo EventEmitter::count();  // 3

Myöhäinen staattinen sidonta

Edistynyt käyttö:

<?php
class ParentClass {
    public static function create(): static {
        return new static();  // resolves to calling subclass
    }

    public function getClass(): string {
        return static::class;  // late static binding
    }
}

class ChildClass extends ParentClass {}

$obj = ChildClass::create();
echo $obj->getClass();  // ChildClass

Staattinen tehdas

Käytännön malli:

<?php
class Response {
    private function __construct(
        private int   $status,
        private mixed $body
    ) {}

    public static function ok(mixed $data): self {
        return new self(200, $data);
    }

    public static function notFound(): self {
        return new self(404, ['error' => 'Not Found']);
    }

    public function toJson(): string {
        return json_encode(['status' => $this->status, 'body' => $this->body]);
    }
}

echo Response::ok(['users' => []])->toJson();

Staattisten ja ilmentymäkohtaisten jäsenten kompromissit

Parhaat käytännöt:

<?php
// Static: no object needed, but harder to test/mock
class Validator {
    public static function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}

// Instance: injectable dependency, testable
class ValidatorService {
    public function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}
// Prefer instance classes in larger applications

Käytännön malli

Kootaan kokonaisuus staattisten ominaisuuksien ja metodien käytännöllisen mallin avulla.

Yleiset sudenkuopat

Välttäkää näitä yleisiä virheitä staattisten ominaisuuksien ja metodien käytössä:

  • Staattiset jäsenet ovat yhteisiä kaikille olioille
  • Suosikaa periytettävissä luokissa myöhäistä staattista sidontaa (static::) self::-rakenteen sijaan
  • Singletonit ovat yleinen, mutta joskus liikaa käytetty malli
  • Staattisia metodeja on vaikeampi korvata testidoubleilla yksikkötesteissä

Pikatarkistus

Mikä avainsana käsittelee luokan sisällä staattista ominaisuutta perinnän huomioiden (myöhäinen staattinen sidonta)?

Kertaus: staattiset ominaisuudet ja metodit

Olette perehtyneet staattisiin ominaisuuksiin ja metodeihin. Muistakaa seuraavat pääkohdat:

  • Staattiset jäsenet ovat yhteisiä kaikille olioille
  • Suosikaa periytettävissä luokissa myöhäistä staattista sidontaa (static::) self::-rakenteen sijaan
  • Singletonit ovat yleinen, mutta joskus liikaa käytetty malli
  • Staattisia metodeja on vaikeampi korvata testidoubleilla yksikkötesteissä
Aloita maksutta

Opi PHP tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
49
Oppitunnit
195

Usein kysytyt kysymykset

Onko oppitunti ”Staattiset ominaisuudet ja metodit” ilmainen?

Kyllä – oppitunnin ”Staattiset ominaisuudet ja metodit” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko PHP Academy-kurssin, päivitä CoddyKit PROhon. PHP Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Staattiset ominaisuudet ja metodit”?

Käyttäkää staattisia jäseniä ja ymmärtäkää, milloin niitä kutsutaan ilman ilmentymää. Harjoittelet PHP Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni PHP Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin PHP Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Staattiset ominaisuudet ja metodit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä PHP Academy-oppitunnilla?

Kyllä. Jokainen PHP Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Luokat, ominaisuudet ja metodit
  2. Rakentajat ja tuhoajat
  3. Staattiset ominaisuudet ja metodit
  4. Taikametodien yleiskatsaus
← Takaisin: PHP Academy