Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP ja luokan funktion kutsuminen ulkoisesta tiedostosta

xxmss [09.06.2019 23:26:39]

#

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

require "../../func/tietokanta.php";

$ilmolista = new OmatFunktiot();

$kid = 99;
$auto = 1;

$ilmoasetukset = $ilmolista->muodosta_ilmoasetukset($kid, $auto);

print "<pre>";
print_r($ilmoasetukset);
print "</pre>";

Metabolix [10.06.2019 11:36:25]

#

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));

xxmss [10.06.2019 17:28:14]

#

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?

Metabolix [10.06.2019 18:48:53]

#

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;
}

Vastaus

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

Tietoa sivustosta