Olen yrittänyt pilkkoa tiedostoa tietokanta.php pienempiin osiin.
Käyttäjä avaa selaimellaan tiedoston ilmot.php, jonka pitäisi tulostaa taulukko ilmoasetukset.
Tiedosto ilmot.php vaatii tiedoston tietokanta.php, josta kutsutaan tiedostoa muodosta_ilmoasetukset.php. Ongelmia tuottaa muodosta_ilmoasetukset.php:ssä oleva $this->hae_asetukset($kid, $auto), koska en tiedä, miten tuo $this-> pitäisi laittaa.
Osaisikohan joku auttaa? Kiitos.
tietokanta.php
class Tietokanta { protected $yhteys; function __construct() { try { $this->yhteys = new PDO("mysql:host=localhost;dbname=db_name", "username", "password"); $this->yhteys->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $this->yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->yhteys->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->yhteys->exec("SET NAMES latin1"); } catch (PDOException $e) { error_log($e); } } } class OmatFunktiot extends Tietokanta { protected $yhteys; function __construct() { parent::__construct(); } function muodosta_ilmoasetukset($kid, $auto) { require_once "../../func/muodosta_ilmoasetukset.php"; } function hae_asetukset($kid, $auto) { $setup = array(); $setup[$kid][$auto][0] = "off"; $setup[$kid][$auto][1] = "on"; return $setup; } }
muodosta_ilmoasetukset.php
$asetukset = $this->hae_asetukset($kid, $auto); return $asetukset;
ilmot.php
Kopioi tiedoston sisältö siihen, missä include- tai require-rivi on, niin asia selvenee. Toisaalta tuo koodi ei toimi tällä hetkellä oikein, koska return-lause palauttaa arvon include-riville mutta ei funktiosta ulos, eli muodosta_ilmoasetukset ei palauta lopulta mitään ja $ilmoasetukset viimeisessä koodissa on NULL.
<?php # testi.php return "testi";
<?php class A { function f() { # Tässä ajetaan testi.php, mutta funktio ei palauta mitään. include "testi.php"; } function g() { # Tässä ajetaan testi.php, ja funktio palauttaa sen return-rivin tuloksen. # ÄLÄ SILTI TEE NÄIN! return include "testi.php"; } function h() { # Tässä on oikea koodi suoraan. Näin kannattaa tehdä. return "testi"; } } $a = new A(); var_dump($a->f()); # NULL var_dump($a->g()); # string(5) "testi" var_dump($a->h()); # string(5) "testi"
Sinänsä on kyllä äärimmäisen epäselvää hajottaa yhtä luokkaa useampaan tiedostoon, joten tuosta muodosta_ilmoasetukset.php:stä kannattaa välittömästi hankkiutua eroon.
$yhteys-jäsentä ei tarvitse esitellä jälkimmäisessä luokassa.
Tulostuksessa kannattaa muistaa htmlspecialchars. Nyt tuolla print_r:llä tulee mahdollisesti vaarallinen ja HTML:n rikkova tulos.
<?php $a = "<script>alert('moi');</script>\n"; # Vaarallista: print_r($a); # Oikein: echo htmlspecialchars(print_r($a, true));
Metabolix kirjoitti:
Kopioi tiedoston sisältö siihen, missä include- tai require-rivi on, niin asia selvenee.
Tavoitteena on juurikin pienentää tiedostokokoa siirtämällä funktioiden koodit muihin tiedostoihin. Miten se onnistuisi?
xxmss kirjoitti:
Tavoitteena on juurikin pienentää tiedostokokoa siirtämällä funktioiden koodit muihin tiedostoihin. Miten se onnistuisi?
Miksi tällainen tavoite on? Saman luokan funktioita ei ole mitään järkeä jakaa useaan eri tiedostoon, ja varsinkaan funktion sisältöä ei ole järkeä laittaa eri paikkaan kuin funktion nimeä ja parametrilistaa.
Toinen kysymys tietysti on, mitä tekee luokka nimeltä OmatFunktiot ja olisiko järkevää jakaa tämä luokka ylipäänsä useammaksi eri luokaksi. Esimerkiksi jos nämä asetukset eivät ole selvästi tietokannan ominaisuus, voisi olla järkevää tehdä luokka Asetukset, jossa olisi asetuksiin liittyviä funktioita. Jos asetukset pitää hakea tietokannasta, tietokantaolion voi antaa parametrina (tai voi käyttää globaalia oliota).
<?php class Asetukset { public static function hae_asetukset(Tietokanta $t, $kid, $auto) { // ... jotain koodia tänne ... } }
<?php require_once "Tietokanta.php"; require_once "Asetukset.php"; $tietokanta = new Tietokanta(); $ilmoasetukset = Asetukset::hae_asetukset($tietokanta, $kid, $auto);
Jos nyt on jokin pakottava tarve jakaa saman luokan funktioita eri tiedostoihin, siinä voisi käyttää jotain tällaista trait-purkkaviritelmää, jolloin jokainen trait voisi olla omassa tiedostossaan. En suosittele!
<?php trait Asetukset { public function hae_asetukset($kid, $auto) { // ... } }
<?php require_once "Tietokanta.php"; require_once "Asetukset.php"; class OmatFunktiot extends Tietokanta { use Asetukset; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.