Elikkäs, hieman OO-ohjelmointi vielä hakusessa ja kaivattaisiin neuvoa kuinka seuraava ketjutus saataisiin toimimaan php-luokassa.
$demo = new demoClass(); $demo->styles->add('path/to/file.css');
Ja itse luokka:
class demoClass { public $styles; public $scripts; public function __construct() { $this->styles = array(); $this->scripts = array(); } public function add($file) { // tähän pitäisi saada toiminto, jolla $file lisätään muuttujaan return $this; } }
Hommahan olisi perin yksinkertainen, jos tekisin molemmille muuttujille oman setterin, mutta tuo ensin kuvattu olisi huomattavasti selkeämpi, koska käyttäisin samaa logiikkaa ketjutukseen myös muille tuleville metodeille.
Olen syvästi kiitollinen kaikesta avusta!
Varsinainen ketjutus han on jo periaatteessa valmis, joten kysymys ei liity OOP:hen vaan mitä ilmeisemmin merkkijonojen manipulointiin?
$demoClass = new demoClass; $demoClass->add('style.css') ->add('form.css') ->add('script.js') ->add('jquery.js');
Lähestymistapasi vaikuttaisi muutenkin keskittyvän ongelmien keksimiseen kuin ratkomiseen.
Jep, ketjutushan on periaatteessa valmis, mutta miten voisin toteuttaa tuon niin, että sama add() metodi lisäisi tiedoston ketjussa edeltävään muuttujaan?
$demo->styles->add('path/to/file.css'); // lisätään tiedosto $styles taulukkoon $demo->scripts->add('path/to/file.js'); // lisätään tiedosto $scripts taulukkoon
Ehdottamallasi tavalla luokassa pitäisi olla oma setter molemmille taulukoille, jota haluaisin vältää.
$demo->addStyles('path/to/file.css'); $demo->addScripts('path/to/file.js');
Ongelmathan on tehty ratkottaviksi, jota tässä koitan ainakin kovasti yrittää :)
greenie kirjoitti:
Ongelmathan on tehty ratkottaviksi
Minusta on ihan tyhmää tehdä ongelmia, ellei kyseessä ole joku php-haaste -tyylinen juttu. Kyllä ohjelmoinnissa tulee ongelmia eteen ratkottavaksi ihan riittävästi ilmankin että niitä tarvitsee itse tehdä.
Eli tahtooko tämä nyt sanoa, että esittämäni malli ei ole mahdollinen vai, että se olisi järkevä toteuttaa toisella tavalla?
Nyt jengi tuntuu vain saivartelevan kaivavani verta nenästä, mutta mitään perusteluja varsinaiseen kysymykseen ei irtoa. Sitten vielä ihmetellään miksi täällä keskustelu hiipuu..
No mun mielestä nyt on vaan jotenkin hölmöä tehdä asioita kielelle epätyypillisellä tavalla ihan vaan sen takia että se on mahdollista. Sitten koodia ylläpidessä on vaan enemmän mietiettävää että "mitähän tää oikeen tekee".
Mutta siis toki haluamasi asia (jos sen oikein ymmärsin) on mahdollista tehdä.
class MyArray extends ArrayObject { public function add($file) { $this[] = $file; return $this; } } class demoClass { public $styles; public $scripts; public function __construct() { $this->styles = new MyArray(); $this->scripts = new MyArray(); } } $demo = new demoClass(); $demo->styles->add('path/to/file.css')->add('path/to/anotherfile.css');
...
Siis meinaan että tätä
$demo->styles->add('path/to/file.css')->add('path/to/anotherfile.css');
on hirveän vaikea nähdä selkeämpänä kuin tätä
$demo->styles[] = 'path/to/file.css'; $demo->styles[] = 'path/to/anotherfile.css';
Jälkimmäisestä jokainen PHP -koodari näkee heti mitä tapahtuu. Ensimmäisestä pitää käydä vilkuilemassa sieltä luokasta tai dokumentaatiosta.
OK, kiitos vastauksesta!
Ehkä selitin itseäni hieman huonosti, sillä tarpeena ei niinkään olisi ketjuttaa metodeita:
$demo->styles->add('path/to/file.css')->add('path/to/anotherfile.css');
vaan viitata edelliseen muutujaan ketjutetulla metodilla, jolloin nämä kaksi taulukkomuutujaa voisivat jakaa samat metodit:
// $styles taulukko $demo->styles->add('path/to/file.css'); $demo->styles->execute(); $demo->styles->empty(); // $scripts taulukko $demo->scripts->add('path/to/file.js'); $demo->scripts->execute(); $demo->scripts->empty();
Ilmeisesti tuo ei kuitenkaan onnistu vain yhden luokan sisällä vaan apuriksi tarvitaan muita luokkia, joita sitten ajetaan/laajennetaan toisen sisällä - kuten edellisessä esimerkissäsi näytit?
Toki voisin toteuttaa ylempänä olevat metodit myös näin:
// $styles taulukko $demo->addStyles('path/to/file.css'); $demo->executeStyles(); $demo->emptyStyles(); // $scripts taulukko $demo->addScripts('path/to/file.js'); $demo->executeScripts(); $demo->emptyScripts();
Omaan silmääni vain tuo aiempi malli on loogisempi.
Toi sun rajapintasi ei näytä kovin loogiselta. Mitä tarkoittaa css- tai js-tiedostojen suorittaminen? Ja miksi ne sitten tyhjennetään?
Ok, no helpottaa sitten tietysti kun ei käytä vääriä termejä.
Eli haluaisit kytkeä metodin muuttujaan. (Ketjuttamisessa muodostetaan ketju ja ketju taas koostuu samanlaisista lenkeistä.)
PHP:n tapa kytkeä metodi muuttujaan on laittaa se muuttuja metodin parametriksi, eli näin:
add('path/to/file.css', $demo->styles); add('path/to/file.js', $demo->scripts);
-> ei ole mikään "ketjutus" tai "kytkentä" vaan viittaus luokan muuttujaan tai funktioon, jossa siis ennen -> merkkiä on olio ja sen jälkeen muuttujan tai funktion nimi.
The Alchemist kirjoitti:
Toi sun rajapintasi ei näytä kovin loogiselta. Mitä tarkoittaa css- tai js-tiedostojen suorittaminen? Ja miksi ne sitten tyhjennetään?
Tarkoitus on hieman uudelleenkirjoittaa jo olemassa olevaa js/css tiedostojen compiler scriptiä, joka siis käytännössä siistii useista asset tiedostoista yhden selaimelle tarjottavan css/js tiedoston. Skriptiin on heitetty mukaan myös leafon lessphp, joten less-tiedostojen parsiminen onnistuu kivuttumasti serveripäässä.
// lisätään uusi tyylitiedosto taulukkoon $demo->styles->add('path/to/file.css'); // tarkistaa lisättyjen tyylitiedostojen aikaleimat // ja tarvittaessa generoi uuden siistityn filen // muuten palauttaa vain generoidun tiedoston urlin $demo->styles->execute(); // tyhjentää ko. taulukkoon asetetut tiedostot $demo->styles->empty(); // ehkä delete() olisi loogisempi nimi metodille... $demo->styles->delete(); // parametrina voisi syöttää myös nimetyn tiedoston(t), joka poistetaan taulukosta $demo->styles->delete('path/to/file.css');
Grez kirjoitti:
En kutsuisi kyllä tuota ketjuttamiseksi, koska eihän se ole mitään ketjuttamista.
Ketjuttaminen on varmasti terminä päin persettä, mutta antakaa nyt hieman armoa itse opiskeelle nyypälle.
Ajatuksen tämän tyyppiseen logiikkaan olen varastanut ProcessWiren APIsta, joka puolestaan on saanut inpiraationsa jQuerysta.
PW:n APIlla voi tehdä esim. näin:
// haetaan ensimmäinen kuva sivun useita kuvia tukevasta inputista $img = $page->images->first(); // generoidaan 64px leveä ja korkea versio kuvasta ja tulostetaan sen url echo $img->size(64,64)->url;
PW:ssä itsessään löytyy myös muuttujat tyyleille ja skrpteille (ks. cheatsheet -> $config):
// taulukko tyylitiedostoille $config->styles; // tyylitiedoston lisääminen taulukoon $config->styles->add('path/to/file.css');
Olen kovasti tykästynyt PW:n logiikkaan ja siksi olen nyt hieman tämänkin omassa käytössä palvelleen compilerin uudelleenkirjoitusta pohtinut. Ja näihin pohdintoihin täältäkin siis tukea pyydellyt. Hienoa olisi kuitenkin, jos tästä syntyisi kehittävää keskustelua lyttäämisen sijaan. Ja nythän se tästä tuntuukin lähtevän liikeelle, kun saadaan ensin ajatus vietyä läpi. Eikö?
Kannattaa huomioida että Javascript on protytype -tyylinen kieli, jossa "olioihin" voi lisätä esim. funktiota miten haluaa. Samoja juttuja ei voi suoraan soveltaa kaikilta osin PHP:hen.
Noiden esimerkkien taustalla on varmaan paljon koodia siellä ProcessWiressa. Kuten näytinkin, niin toki PHP:ssäkin voit määritellä ne taulukot olioiksi, joille on add() -metodi.
ProcessWire on PHP CMS/CMF, johon myös nuo esimerkit viittaavat.
Ai niin, siis oli saanut inspiraationsa jQuerystä.. mun moka.
Php:ssä taulukoiden ja olioiden sotkeminen on välillä hankalaa siitäkin syystä, ettei taulukko ole olio eikä olioilla voi mitenkään emuloida taulukoita yks' yhteen.
Ja kun itsekin näet jo tuosta toivomastasi syntaksista, että sinun täytyy käyttää useita olioita, niin mikä siinä sitten on niin vaikeaa vain tehdä niin? Jos aikoo pelätä olioita, niin sitten ei kannata käyttää niitä lainkaan, ja muissa tapauksissa käyttää niitä ennakkoluulottomasti.
Koska olio-ohjelmointi on omissa näpeissä todellakin vielä aloittelijan tasolla, halusin kysellä täältä hieman apua ihan selkeällä suomen kielellä, kuinka toivomani syntaksi olisi mahdollista toteuttaa PHP:n avulla.
Olen koittanut opiskella paljon ProcessWiren koodia ja saanutkin siitä runsaasti irti, mutta taidot eivät vielä ole sillä tasolla, että suvereenisti pysyisin kärryillä, kuinka asiat taustalla rakentuvat. En tuota toivomaani logiikkaa kuitenkaan pystymetsästä repinyt vaan ajatus syntyi nimenomaan PW:n APIsta.
Summa summarum: toivomani syntaksi ei onnistu yhden olion sisällä vaan tarvitsen avuksi esitettyä logiikkaa vastauksesta v218543?
En usko että siellä ProcessWiressäkään käytetään vain yhtä ja ainoaa luokkaa.
Eli juu, jos haluat tehdä useita erilaisia olioita, niin tarvitset useita luokkia.
Juu, ei todellakaan käytetä. Yksi luokka laajentaa toista ja niin eteenpäin.. Hieman vain hakusessa mihin kaikki parent:: self:: ym. määreet viittaavat, vaikka kohtalaisen hyvin tälläkin tietopohjalla on PW:n coresta saanut oppia irti.
Taidanpa nyt koittaa väkästellä jonkinmoista esimerkkiä halutusta logiikasta vähän valmiimpana niin palailen sitten tänne uusine kysymyksineni. Kiitos kovasti avusta tähän asti!
Itse käytä seuravaa syntaksia joka on mielestäni selkeä.
<?php print $this->headTitle('XXX Oy Extranet')->setSeparator(' - '); print $this->headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0'); print $this->headLink()->appendStylesheet('/library/css/reset.css') ->appendStylesheet('/library/css/form-reset.css') ->appendStylesheet('/library/css/bootstrap.css') ->appendStylesheet('/layouts/extranet/css/layout.css') ->appendStylesheet('/layouts/extranet/css/navigation.css') ->appendStylesheet('/layouts/extranet/css/layout-max-width-768px.css') ->appendStylesheet('/layouts/extranet/css/layout-max-width-320px.css'); ?>
Minä taas käytän vain php-taulukkoa, johon määritellään tiedostot, ja josta prosessori ne lukee.
Qeijo käyttää tiettyä syntaksia, koska ZF2-kehys "pakottaa" siihen. Tuskin tuon syvempi olemus kovin monelle täällä aukeaa. Esimerkki ei oikeasti kylläkään liity aiheeseen, koska kyseinen snippet tulostaa head-osioon kasan link-tageja eikä css-tiedostojen sisältöä.
The Alchemist kirjoitti:
Qeijo käyttää tiettyä syntaksia, koska ZF2-kehys "pakottaa" siihen. Tuskin tuon syvempi olemus kovin monelle täällä aukeaa. Eimerkki ei oikeasti kylläkään liity aiheeseen, koska kyseinen snippet tulostaa head-osioon kasan link-tageja eikä css-tiedostojen sisältöä.
Mielestäni sippetti liittyy hyvinkin aiheeseen kun kerta tyylitiedostojen "hallintasyntaksista" keskustellaan.
Ps.
Olin missannut täysin että tässä keskusteltiin juuri css-tiedostojen sisällön tulostamisesta, eikä esim. link - tageihin pukeutumisesta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.