Olen uusi PHP:n luokissa (class), joten törmäsin seuraavanlaiseen ongelmaan:
Haluan tehdä kolme luokkaa: pääluokan (Main), turvallisuusluokan (Security) ja tietokantaluokan (Database). Jokainen luokista jakautuu eri tiedostoihin (luokannimi.php). Tässä esimerkki:
/inc/Main.php
<?php class Main { function __construct() { echo "Aloitettiin Main\n"; } public function teeJotain() { echo "Tein jotain Main-luokassa.\n"; } public function omaVirhe($teksti) { echo "Virhe: {$teksti}"; } public function security() { return [Security-luokka]; } public function database() { return [Security-luokka]; } }
/inc/Security.php
<?php class Security { function __construct() { echo "Aloitettiin Security\n"; } public function salaa($salasana) { return password_hash($salasana, PASSWORD_DEFAULT); } }
/inc/Database.php
<?php class Database extends PDO { function __construct() { // yhdistetään tietokantaan tässä parent::in avulla echo "Aloitettiin Database ja yhdistettiin tietokantaan\n"; } public function teeHaku() { // tämä tietysti try ja catch ympärille, koska virheiden käsittely $haku = $this->prepare("SELECT * FROM jostain"); $haku->execute(); [main-luokka tai mistä ikinään aloitettiin kutsu]->omaVirhe("testivirhe"); // EI saa olla staattinen kutsu eli Main::omaVirhe(teksti) return $haku->fetch(); } }
Miten voisin siis saada esim. käytettyä indexissä teeHaku-funktiota näin:
/index.php
<?php require_once 'inc/Main.php'; $main = new Main(); print_r($main->db()->teeHaku()); ?>
Olen saanut yllä olevan toimimaan jotenkin tekemällä yksityisen (private) variablen Main-luokan sisään, johon luon kaikki luokat, kun __constructia kutsutaan ja sen jälkeen luon nimeä vastaavat funktiot jotka returnaa ko. variablet. Ongelmana on, ettei luoduissa luokissa (Database sekä Security) voi (tai en tiedä voiko) kutsua pääluokkaa (Main) ilman staattista (Main::jokinFunktio()) kutsua.
Huomiona se, että Database-luokassa ollaan extendattu PDO-luokasta.
tl;dr:
- Haluan saada $luokka->jokinToinenLuokka()->toisenLuokanFunktio();
toimimaan ja toisenLuokanFunktio voisi käyttää $luokka:a ilman staattista kutsua
- Miten /inc/Database.php:n rivi 12 toimimaan
PS. Ei ole väliä, miten toisia luokkia kutsutaan: $luokka->toinenluokka->funktio()
tai $luokka->toinenluokka()->funktio()
.
Voit kyllä antaa Main-olion muille olioille muodostimen parametrina (ja tallentaa sen yksityiseen jäseneen):
$this->database = new Database($this);
Mutta miksi virheet pitäisi ilmoittaa Main-luokkaan? Mikset heitä poikkeuksia, kuten yleensä kuuluu?
Virhe oli vain esimerkki funktiosta, joka sijaitsee Main-luokassa. Kiitos vinkistä, ei tullut mietittyä tuota!
Aihe on jo aika vanha, joten et voi enää vastata siihen.