Kirjautuminen

Haku

Tehtävät

Keskustelu: Projektit: PHP-projekti: framework

Teuro [02.07.2010 13:00:14]

#

Tämä on osa PHP-projektia.

Laitan nyt uuden langan pystyyn tuota virinnyttä keskustelua varten. Kerätään yhteen nippuun kaikki "yleiset toiminnot", eli syötteen siivous, tiedoston avaus ja lukitus, kirjoitus, lukon poisto, sulkeminen jne... omaan kirjastoon, joka tulee ladattavaksi paketiksi. Scriptit siis käyttävät tuon kirjaston palveluita. Saisi ainakin vähän yhtenäistettyä tosiaan noita koodeja.

trilog [02.07.2010 13:33:06]

#

Itseäni häiritsee eniten tässä tuo käytön epäselvyys. Skriptejä käytetään eri tavalla, jolloin se on sekavaa ja vaikeaa. Siksi joku oliopohjainen pohjatoteutus voisi olla hyvä. Tärkein kysymys onkin ehkä, onko PHP 4:n tukeminen todella niin tärkeää, että skriptien tekemisessä pitää käyttää vanhoja tapoja. PHP 4:n virallinenkin tuki päättyi jo lähes kaksi vuotta sitten, joten jos joku sitä vielä käyttää, niin olisi jo aika siirtyä uudempaan versioon. Tämä tosin olisi aika iso muutos, joten en tiedä onko järkevää enää tässä vaiheessa käydä muuttamaan hommaa näin paljolti. Tosin osa skripteistä on tehty jo oliopohjaisesti, joten niiden muuttaminen tähän systeemiin kävisi aika helposti. Nykyisellään skriptit ovat lähinnä koodivinkkimäisiä.

Triton [02.07.2010 20:33:12]

#

Itsekkään en ole vähään aikaan törmännyt yhteenkään hostauspalveluun, jossa ei PHP5:sta olisi jo käytössä. Itse suosisin ajatusta, että ensin väännettäisiin joku MVC-malli pohjalle josta saataisiin periytettyä tarvittat mallit, näkymät ja kontrollerit. Vielä kun toteutetaan tuohon päälle esim. loader-luokka, jonka avulla nuo muut kirjastot saataisiin helposti ladattua käytöön. Testailin vähän aikaa sitten tuollaisen tekemistä ja sain sen jopa suhteellisen helpostin toimimaan...

trilog [03.07.2010 22:00:10]

#

Triton kirjoitti:

Itse suosisin ajatusta, että ensin väännettäisiin joku MVC-malli pohjalle josta saataisiin periytettyä tarvittat mallit, näkymät ja kontrollerit.

Luonnostelin vähän:

<?php
interface Base {
    // Ohjaa mallia ja näkymää.
    public function handle(array &$GET, array &$POST, array &$COOKIE);

    // Palauttaa tulostettavan XHTML:n näkymästä.
    public function toXHTML();
}

Oikeastaan tässä onkin kaikki, mitä tarvittaisiin periaatteessa. Tämä jättää implementaation varaan, miten näkymät ja mallit toteutetaan.


Tässä vielä esimerkki yksinkertaisesta luokasta, joka ylläpitää numeroarvoa. Numeroarvoa voidaan lisätä ja vähentää GET-parametreilla.

<?php
abstract class NumeroLuokka implements Base {
    protected $views = array( // kaikki tuetut näkymät
                                "show" => "ViewNumeroLuokka::show",
                            );
    protected $current_view = "show"; // nykyinen näkymä
    public $data; // ulospäin näkyvä data

    public function handle(array &$GET, array &$POST, array &$COOKIE) {
        // vaihdetaan näkymään vain, jos näkymä on tuettu
        if (isset($GET["view"]) && in_array($GET["view"], array_keys($this->views)))
            $this->current_view = $GET["view"];

        // haetaan mallin data talletuksesta
        $this->fetch_data();

        // käsitellään käyttäjän pyytämät toiminnot, ja ohjataan niiden mukaan mallia
        if (isset($GET["action"])) {
            switch ($GET["action"]) {
                case "increment":
                    $this->increment(1);
                    break;

                case "decrement":
                    $this->increment(-1);
                    break;
            }
        }
    }

    public function toXHTML() {
        // kutsutaan näkymää
        return call_user_func($this->views[$this->current_view], $this);
    }

    abstract protected function fetch_data();
    abstract protected function increment($amount);
}

Näkymiä tällä luokalla on vain yksi; show:

<?php
class ViewNumeroLuokka {
    static public function show(NumeroLuokka $obj) {
        return "<p>arvo on <b>{$obj->data}</b></p>";
    }
}

Lopuksi vielä tekstitiedostoa käyttävä implementaatio luokasta:

<?php
class NumeroLuokkaTeksti extends NumeroLuokka {
    protected function fetch_data() {
        $this->data = ((file_exists("numeroluokka.dat")) ? intval(file_get_contents("numeroluokka.dat")) : 0);
    }

    protected function increment($amount) {
        file_put_contents("numeroluokka.dat", $this->data + $amount);
    }
}

... ja käyttöesimerkki:

<?php
$numeroluokka = new NumeroLuokkaTeksti();
$numeroluokka->handle($_GET, $_POST, $_COOKIE);
?>
<html>
<head></head>

<body>

<?php
echo $numeroluokka->toXHTML();
?>

</body>
</html>

Vastaus

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

Tietoa sivustosta