Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Staattiseen metodiin tieto mistä sitä on kutsuttu

AkeMake [05.10.2018 22:02:15]

#

Minulla on kaksi luokkaa, Foo ja Bar, joista toinen sisältää staattisen metodin foo() ja toinen funktion bar(). Funktion sisältä kutsutaan tätä staattista metodia. (Hmm.. Meneeköhän nyt metodit ja funktiot sekaisin? Mikähän niiden käytännön ero on?)

Kysymys siis kuuluu, että voiko tämän staattisen metodin sisällä mitenkään tietää mistä luokasta (Bar) kyseistä staattista metodia kutsuttiin (tai paremminkin tiedostopolkua sen luokan sisältävään tiedostoon) ilman, että kyseinen funktio bar() lähettää tätä tietoa parametrinä? Onko tähän olemassa esim jotain valmista php-kutsua?

class Foo {
   public static function foo() {

      /*
       * Koodia...
       */

      return $lahdeLuokka;
   }
}

class Bar {
   private function bar() {
      return Foo::foo();
   }
}

$olio = new Bar();
print $olio->bar();

// Tulostaisi joko "Bar" tai tiedostopolun Bar-luokan sisältävään tiedostoon

Metabolix [05.10.2018 23:58:51]

#

AkeMake kirjoitti:

Meneeköhän nyt metodit ja funktiot sekaisin? Mikähän niiden käytännön ero on?

Yleensä metodilla tarkoitetaan luokan jäsenfunktiota. Staattisuus on nimityksestä riippumaton lisämääre. Joskus funktiolla tarkoitetaan erityisesti luokan ulkopuolista funktiota, mutta toisaalta metodi on myös funktio, kuten function-avainsana kertoo. Nimitykset ovat erilaisia eri ohjelmointikielissä, vaikka asiat olisivat samat.

AkeMake kirjoitti:

Kysymys siis kuuluu, että voiko tämän staattisen metodin sisällä mitenkään tietää mistä luokasta (Bar) kyseistä staattista metodia kutsuttiin (tai paremminkin tiedostopolkua sen luokan sisältävään tiedostoon) ilman, että kyseinen funktio bar() lähettää tätä tietoa parametrinä?

Tieto löytyy funktiolla debug_backtrace. Nimi kertoo, ettei tämä ole mikään vakaa ja suositeltava ratkaisu.

Hyvä funktio (tai metodi) toimii aina samalla tavalla ja ennakoitavasti. Kutsujan selvittäminen tekee funktiosta epäjohdonmukaisen ja yllättävän. On vaikea keksiä tilannetta, jossa tuo olisi hyödyllistä tai järkevää.

The Alchemist [06.10.2018 10:34:50]

#

Kaikki muuttuvainen tieto tulee antaa funktiolle nimenomaan muuttujina. Eli kyllä: joudut antamaan tiedostopolun parametrina. Siinä ei ole mitään väärää. Sen sijaan kuulostaa kyseenalaiselta, että yrität ilmeisesti käpistellä kooditiedostoja dynaamisesti ohjelmakoodissa.

Mikäli olet rakentamassa jotain debug-juttuja, niin lopeta saman tien. Monet php-kehykset Symfony etunenässä tekevät jo tämän paremmin. Käytä valmista koodia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta