Moi,
Voi olla VÄHÄN tyhmä kysymys, mutta mitä eroa mahtaa olla, että kutsunko funktiota esimerkiksi:
a) Perimällä...
$etunimi = Test::palautaNimi("Etunimi"); $sukunimi = Test::palautaSukunimi("Sukunimi");
b) Luomalla olion...
$test = new Test(); $etunimi = $test -> palautaNimi("Etunimi"); $sukunimi = $test -> palautaSukunimi("Sukunimi");
Onko tällä suorituskyvyn kannalta merkitystä vai mitä...? Itse luon aina olion, mutta näin esimerkin, jossa oli aina käytetty joku::funkkari(); -tapaa, enkä täysin ymmärrä näiden eroa.
Ei tietenkään ole hyötyä luoda olioita, jos kaikki luokan jäsenet ovat staattisia. Ne ovat kuitenkin poikkeustapaus; tavallisten jäsenten kohdalla on pakko luoda olioita. Lukisit nyt edes opasta, siinä on heti ensimmäisenä esimerkki tilanteesta, jossa ::-merkintää ei voi mitenkään käyttää.
Käytät myös vääriä termejä. Perintä liittyy koodeihin, joissa esiintyy sana extends. Tästäkin kerrotaan oppaassa.
Luokka::Funktio() tarkoittaa staattista funktiota (kaikille olioille yhteinen)
Lisäys:
Yritäppä luoda seuraava luokka staattisilla funktioilla:
<?php $a = new Luokka(); $a->SetJotain(123); echo $a->GetJotain(); // 123 $b = new Luokka(); $b->SetJotain(456); echo $b->GetJotain(); // 456 ?>
Lyhyesti selitettynä kaksoispiste: staattinen funktio (joka oliolle yhteinen) ja nuoli: olion "oma" funktio (jossa käytetään siis omia jäsenmuuttujia.
Eli olio on hyvä luoda, jos oliosta tarvitaan myöhemmin useampi kuin yksi ilmentymä? Eli ilmentymä tarkoittaa:
$a = new Luokka(); $a->SetJotain(123); //Ilmentymä? echo $a->GetJotain(); //Toinen ilmentymä?
Ja vähän tarkennusta (käytännön esimerkkejä), eli mitä tarkoittaa:
1. "Kaikille olioille yhteinen"?
2. "Staattiset funktiot ovat luokkien jäsenfunktioita"?
3. Jäsenmuuttuja? Tarkoittaako se esimerkiksi private $nimi;
Ja oppaan ensimmäisessä esimerkissä ei voi käyttää :: -merkintää, koska siinä on annettu __construct:lle arvo ja määritelty jäsenmuuttuja ehkäpä?
Kun taas tälläisessä tapauksessa voi käyttää vai...
Olioita voi käyttää ihan mihin tahansa. Php:n nykytrendi on suunnata kohtin täysin puhdasta olio-ohjelmointia, eli tyyliä jossa ei käytetä globaaleita funktioita ollenkaan. Tämä ei kuitenkaan tarkoita sitä, että kaikki funktiot välttämättä käärittäisiin jonkin luokan sisälle staattisiksi funktioiksi; pelkkä luokan luominen ei ole olio-ohjelmointia.
Olioiden tarkoitus on selkeyttää ohjelmakoodin rakennetta ja vähentää spagettimaisuutta. Globaaleiden funktioiden yhdistetty haitta ja etu on se, että niitä voi kutsua ihan missä tahansa. Funktion kutsuminen mielivaltaisesti ei kuitenkaan ole hyvä asia, koska se johtaa pitkällä aikavälillä siihen, että koodia on vaikea muuttaa tai jopa korjata rikkomatta jotain toimivaakin.
Luokkia ja olioita käyttämällä voidaan rajoittaa funktioiden ja muuttujien näkyvyyttä, jolloin voidaan paremmin kontrolloida sitä, mitä asioita missäkin voidaan tehdä. Eli pakotetaan järkevöittämään ohjelmien arkkitehtuuria.
punppis kirjoitti:
Luokka::Funktio() tarkoittaa staattista funktiota (kaikille olioille yhteinen)
Korjaan hieman tätä käsitystä. Staattiset funktiot eivät ole varsinaisesti kaikille olioille yhteisiä tai edes kaikille kyseisestä luokasta luoduille olioille yhteisiä vaan ne liittyvät nimenomaan siihen luokkaan missä ne on määritelty, ei olioon tai olioihin. Tämä tarkoittaa mm. sitä että staattisissa funktioissa ei ole oliokontekstia (ei voi viitata $this-muuttujaan) mutta on luokkakonteksti (voi viitata samaan luokkaan sanomalla self tai "yläluokkaan" sanomalla parent tai jopa "alaluokkaan" sanomalla static). Staattisten funktioiden käyttämiseksi luokasta ei edes tarvitse olla olemassa yhtään oliota tai olioiden luominen kyseisestä luokasta voi olla jopa mahdotonta (abstrakti luokka).
Suorituskykyeroja ei kannata huolehtia staattisten ja ei staattisten metodien välillä.
Sen sijaan staattiset metodit eivät pidä yllä eivätkä käytä tilaa (kuten esimerkistä huomasit) mikä on yksi olio-ohjelmoinnin perusprinsiippi. Joudut myös tuottamaan "tightly coupled" koodia staattisten metodien kanssa (mikä haitaa mm. koodin uudelleenkäyttämistä ja testaamista).
Itse en näe staattisia metodeja tietyissä tilanteissa välttämättä pahana, mutta usein kannattaa miettiä onko syytä korvata staattiset metodit ihan perinteisillä funktioilla.
timoh kirjoitti:
Joudut myös tuottamaan "tightly coupled" koodia staattisten metodien kanssa (mikä haitaa mm. koodin uudelleenkäyttämistä ja testaamista).
Miksi tämä mielestäsi liittyy erityisesti staattisiin metodeihin ja miten staattiset metodit eroavat mielestäsi tämän suhteen "tavallisista" metodeista?
Request kirjoitti:
$a = new Luokka(); $a->SetJotain(123); //Ilmentymä? echo $a->GetJotain(); //Toinen ilmentymä?
No ei todellakaan näin.
Tukki kirjoitti:
Miksi tämä mielestäsi liittyy erityisesti staattisiin metodeihin ja miten staattiset metodit eroavat mielestäsi tämän suhteen "tavallisista" metodeista?
Sitä meinasin, että esim. Class::something() on sidottu Classiin. Mutta juu tosiaan onhan nuo mahdollista määrittää muuttujina.
Pitäisikö olio-aloittelijan tulla sotkemaan pakkaa..
mitä noilla luokilla voittaa kun pelkillä functioillakin pärjää? suorituskyky? koodi menee ninusta sekavammaksi.
olen tehnyt mm. tälläisia purkkavirityksiä
func.php
ja käyttö sitten
index.php
Anteeksi tyhmyyteni, mutta noin saan varsinaiset sivut siisteiksi helpoiten.
Ei tuollaiseen käytetäkkään olioita. Toivottavasti HTML-koodisi ei muuten ole oikeasti tuolla funktioiden sisällä..
Ajattele vaikka itseäsi henkilönä. Sinulla on nimi, syntymäaika ja asuinpaikka. Voit yhdistää ne yhteen paikkaan, olioon. Jos käyttäisit näitä "normaaleja funktioita", pärjäisit vielä ihan hyvin yhden henkilön kanssa. Entäpä jos sinulla on monta henkilöä, joilla kaikilla on nimi? Luotko yhtä monta muuttujaa kuin henkilöitäkin? Vai miten olisi olio?
Wikipediassa näytti olevan suomeksi pari esimerkkiä.
Ok, tuo on vähän monimutkaisempaa korkeamman tason juttua. Ehkä joskus voisi tutkia noitakin. Kiitos, poistun keskustelusta, tosin vielä kiinnostaa miksi ei html functioihin, avaaan uuden keskustelun
Macro kirjoitti:
Toivottavasti HTML-koodisi ei muuten ole oikeasti tuolla funktioiden sisällä.
(Sanotaan nyt tässäkin keskustelussa, ettei jää epäselväksi...) Miksi ei? Minusta taas on hyvin toivottavaa, että sivun yläosa ja alaosa ovat funktioissa – olisihan aivan äärettömän typerää kirjoittaa ne joka sivulle erikseen, ja funktioilla vältytään myös globaaleja muuttujia koskevilta ongelmilta.
Jatkokeskustelua tästä sekä aiempi keskustelu ylä- ja alaosista.
Metabolix kirjoitti:
Macro kirjoitti:
Toivottavasti HTML-koodisi ei muuten ole oikeasti tuolla funktioiden sisällä.
Miksi ei?
Tarkoitin noita echo-rivejä, joka käy toisen keskustelun koodinpätkästä ilmi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.