Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Useat luokat

joah [13.12.2015 11:24:58]

#

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().

Metabolix [13.12.2015 14:20:17]

#

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?

joah [13.12.2015 14:49:14]

#

Virhe oli vain esimerkki funktiosta, joka sijaitsee Main-luokassa. Kiitos vinkistä, ei tullut mietittyä tuota!

Vastaus

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

Tietoa sivustosta