| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Keskustelut - PHP - PHP5 tietotyypitrso 15:21 16.11.07 Vielä toinen kysymys mihinkä en ole löytänyt vastausta. Onko php:ssä nykyisin mahdollista määritellä esim. tämän kaltaisia juttuja: type: vieraskirja_viesti { kirjoitus: STRING kirjoitettu: STRING kirjoittaja_id: INTEGER } type: vieraskirja_viestit { viestit: array of vieraskirja_viesti } class vieraskirja { function tallenna_viesti($uusi_viest: vieraskirja_viesti) { } function lue_viestit() { // luetaan viestit return viestit // tyypiltään vieraskirja_viestit } } .... Vai onko PHP vielääkin näin rajoittunut? Voiko tällaisia asioita tehdä mitenkään muuten järkevästi kuin hirveällä kikkailemisella.. editoitu: 15:36 16.11.07 Ezku 15:35 16.11.07 Ei voi. PHP on heikosti ja dynaamisesti tyypitetty. Pari juttua onnistuu: arrayn sekä objektityypin pakotus funktion tai metodin määrittelyssä. editoitu: 15:56 16.11.07 tsuriga 15:55 16.11.07 Väännän juuri melkoista purkkaa / h4xia, jolla olisi tarkoitus saada PHP venymään moniperintään, oikeaan overloadiin ja vahvaan tyypitykseen. Vahvaa tyypitystä varten funktioiden parametrit tarkastetaan funktion alussa. Ongelmia riittää. rso 16:07 16.11.07 Uskomatonta. Aikalailla nopeasti ne rajat tulivat vastaan.. En jaksaisi alkaa tekemään mitään purkkakoodia ja epäjohdonmukaisuuksia.. ilmoittele tsuriga kun ja jos saat jotain käyttökelpoista. qin 16:54 16.11.07 Eipä tommoset ole ennenkään haitanneet. rso 17:03 16.11.07 Ei varmasti ole tarvittu, mutta veikkaisinpa, että paljon johdonmukaisempaa ja "järkevämpää" koodia saisi väännettyä. Riippuu tietenkin projekteista, mutta joissakin monimutkaisissa ratkaisuissa saattaa olla tarvetta johdonmukaisuuteen ja eräänlaiseen helppouteen toteuttaa kokonaisuutta. tsuriga 17:10 16.11.07 Kieltämättä on itekin tullut kaivattua tietotyyppejä funktiomäärityksiin tässä kun blogisoftaa olen ehtinyt itelle. Parhaimmissa tuntuu olevan noin neljäsosa OOP:tä ja loput satunnaisia funktioita siroteltuna sen tuhannelle sivulle, kunnon dokumentaatioista ei tietokaan. Siinäpä sitten arvailet, että mitä tietoa muuttuja sisältää, ja millä arvoilla tämä muuttuja paukuttaa vertailulausekkeista totuusarvoksi truen. Tuo tekeillä oleva h4xini ei kyllä tähän tuo juurikaan parannusta tähän koodin helppolukuisuuteen, vielä tarvitaan kommentteja kertomaan parametrien tietotyypit. remix 18:15 16.11.07 Itse en PHP:stä tiedä, mutta jos haluaa vahvaa tyypitystä, moniperintää, yms. työkaluja, niin eikö kannattaisi vaihtaa kieltä? Ikinä ei ole mitään hyvää seurannut siitä, että yritetään pakottaa kieli johonkin, mihin sitä ei ole tarkoitettu. Aikaiseksi saadaan vain monimutkaisia ja raskaita rakenteita, jotka karkaavat käsistä ennen pitkää. Tuhmahepo 18:43 16.11.07 Sanoisin kyllä jos ei tiedä mitä tietoa mikäkin muuttuja sisältää ja funktiot ei pysy käsissä nii turha on syyttää PHP:tä. Yhtä epäjohdonmukaista purkaa sitä saa kirjoitettua oli kieli mikä hyvänsä. Speksaamalla ja kommentoimalla metodit saat jo melko vahvasti tyypitettyä tauhkaa, olettaen tietysti että myös noudatat niitä. editoitu: 19:03 16.11.07 tsuriga 18:43 16.11.07 remix kirjoitti: Itse en PHP:stä tiedä, mutta jos haluaa vahvaa tyypitystä, moniperintää, yms. työkaluja, niin eikö kannattaisi vaihtaa kieltä? Toki, kunhan läpällä kokeilen, idea lähti Oma MySQL-luokka -threadistä. editoitu: 19:12 16.11.07 rso 19:09 16.11.07 Kyllähän PHP venyy aika pitkälle ja pystyy juurikin siihen kaikkeen, mihin se on tarkoitettukin. Kysymys oli siitä, että vahva tyypitys ym. olisi myös PHP:ssä fiksu ominaisuus joka helpottaisi kirjoittamista ja helpottaisi koodin tekemistä tai pikemminkin sen havaitsemista johdonmukaisemmaksi. Esimerkiksi tuo minun aloitus viestissä kirjoittamani tyyppimäärittelyesimerkki toisi paljon selkeyttä pienellä vaivalla ja aikaresurssit voisi käyttää taas johonkin muuhun osa-alueeseen. Speksausta voi ja pitää käyttää, mutta tuo antaisi edes jonkinlaisen "standardin". Mahtoikohan olla oikea termi tähän.. eis 22:03 16.11.07 Mitä pitemmälle PHP:hen tutustuu sitä enemmän alkaa hylätä ajatukset "standardista" sen suhteen. Jos sitä haluaa niin kyllä kannattaa katse suunnata muualle. editoitu: 22:32 16.11.07 rso 22:31 16.11.07 Joo, oon kyllä koodannut PHP:tä noin 6-7 vuotta. Ajattelin, että jo tässä vaiheessa (5 versio) PHP:stä olisi kehitetty enemmän "koodariystävällisempi" kieli. Ei sitten.. Noh, onhan esim. luokkaominaisuudet hieman kehittyneet 4-versioon nähden. Rytmis 01:37 17.11.07 Yksi osa tuosta onnistuu, voit metodin signaturessa määritellä Type Hintingiä käyttäen mitä luokkaa parametrin pitäisi edustaa. Eipä sitäkään kyllä kovin laadukkaasti olla toteutettu, skalaarityypit eivät näes käy: Type Hints can only be of the object and array (since PHP 5.1) type. Traditional type hinting with int and string isn't supported. qin 20:18 17.11.07 Kyllä taitaa olla PHP väärä kieli tommoseen täydellisen toteutustavan / tehokkuuden tavoitteluun. Itse ainakin jään painimaan mieluiten käytettävyysongelmien kanssa: miten voisin toteuttaa tämän asian käyttäjäystävällisemmin? Tekninen toteutus ei ole se kaikkein kriittisin asia, vaikka toki pyrin välttämään pahimmat tietoturva/tehokkuus-sudenkuopat. editoitu: 14:24 19.11.07 tsuriga 12:35 18.11.07 Kun en tarkemmin tiedä, millon saan koko viritelmän valmiiksi niin dumppaanpa tähän sen pätkän, jota voi käyttää vahvan tyypityksen simulointiin. Kommentit, lisäluokat ja esimerkit laitan koodikirjastoon kunhan saan valmiiksi ja testattua. PHP <?php final class XOOPValidator { private static $_settableTypes = array( 'int', 'bool', 'float', 'string', 'array' ); public static function validateParameters( $parameters, $expectedTypes, $castTo = false ) { $returningParameters = array(); // if array has undefined amount of values and is expected to contain only certain type if ( is_array( $expectedTypes ) === false ) { $expectedTypes = array_fill( 0, count( $parameters ), $expectedTypes ); } // require equal amount of parameters and expected types if ( count( $parameters ) === count( $expectedTypes ) ) { // loop through parameters and see if they are of expected type foreach ( $parameters as $param ) { if ( self::_varIsOfType( $param, current( $expectedTypes ) ) === false ) { // cast to expected type if requested if ( $castTo === true ) { self::_castToType( $param, current( $expectedTypes ) ); } else { return false; } } // if (var is not of type) $returningParameters[] = $param; next( $expectedTypes ); } // foreach (params) } // if (params as many as types) else { return false; } return $returningParameters; } // method validateParameters private static function _varIsOfType( $var, $type ) { /* * Test for type case-sensitively. */ if ( $type === 'array' ) { return is_array( $var ); } elseif ( $type === 'bool' ) { return is_bool( $var ); } elseif ( $type === 'float' ) { return is_float( $var ); } elseif ( $type === 'int' ) { return is_int( $var ); } elseif ( $type === 'resource' ) { return is_resource( $var ); } elseif ( $type === 'string' ) { return is_string( $var ); } else { return ( $var instanceof $type ); } } // method _varIsOfType private static function _castToType( &$var, $type ) { // use setType if possible if ( in_array( $type, self::$_settableTypes ) === true ) { setType( $var, $type ); } // otherwise assume object casting else { $var = unserialize( preg_replace( "/^O:[0-9]+:\"[^\"]+\":/i", "O:" . strlen( $type ) . ":\"" . $type . "\":", serialize( $var ) ) ); } } // method _castToType } // class XOOPValidator ?> EDIT: PHP5:ssa ei tosin voi näköjään castata luokkainstanssiksi tyyliin (Class)$var.. Kahtuu jos tuohon on jotain kiertotietä. ReflectionAPI ehkä.. EDIT2: Päivitin. Nyt funktiolle voi antaa myös yhden tietotyypin, eli voi määritellä taulukon sisältämään vain tiettyä tyyppiä. Aika purkkahan tämä nyt on, varsinkin kun joutuu aina suorittamaan testauksen erikseen sijoituksia tehdessä. Yksi vaihtoehto olisi tietysti tehdä säilöntäluokka arvoille ja ylikirjoittaa __set-metodi. EDIT3: Löyty manuaalin kommenteista funktio objektin toisen tyyppiseksi objektiksi "castaamiseen" (objektin id muuttuu, mutta muuten tuntuu pelittävän melko hyvin), melkoonen h4x. |
![]() Haku
|