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.
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ä.
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...
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>
Aihe on jo aika vanha, joten et voi enää vastata siihen.