PHP.EE FOORUM   
Nimi:   Pass:   Mäleta mind! 
   Teemad | php.ee esilehele | registreeri | Märgi kõik teemad loetuks | #php.ee Skype vestlus | RSS
UUS TEEMA  OTSI  Lehekülgi: 1
Objektorienteeritud programmeerimine PHP's
Postitaja: PHP.ee 2002-08-21 05:46:10
Artikli "Objektorienteeritud programmeerimine PHP's" kommentaarid kirjuta siia
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: X 2002-08-23 16:29:05
Noh,
klass ei ole siiski ju ainult meetodite kogum, vaid pigem meetodite ja atribuutide kogum. Ning kui nimetada juba klassi funktsioone meetoditeks, siis tuleks ka nimetada ju klassi muutujaid
atribuutideks. Üldiselt märgiks veel nii palju, et igal väiksema asja puhul ei tasu ka nüüd OOP-d kasutada, OOP-d võiks kasutada just selliste asjade puhul eelkõige, mida hiljem võib mõningate muutustega jälle vaja olla.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: zxc 2002-08-25 13:07:16
tore küll, aga oleks hea, kui saaks näha sama artikli järge (advanced), kus tehakse mingi reaalne lahendus valmis:) midagi sellist, mida "tõelises" elus kasutatakse ja vaja ka läheb ;)
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: Y 2002-09-05 20:30:40
Enamus inimestele jääbki mõistmatuks, miks peaks keeruliseks minema ja kasutama (ja laiendama) mingeid klasse, kui saab ka includeda vajalikud funktsioonid (nt andmebaasifunktsioonid) include failist.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: copraonu 2002-10-03 12:31:50
Enamus inimestele jääbki mõistmatuks, miks peaks keeruliseks minema ja kasutama (ja laiendama) mingeid klasse, kui saab ka includeda vajalikud funktsioonid (nt andmebaasifunktsioonid) include failist

maitse asi. imho objektide peale minnes on organiseerimine kergem - koodis on n2ha mis asjaga mingit operatsiooni teostatakse jne. laiendamine (extendimine) lubab teha lisapluginaid algsele jubinale jne. oleks ma t88andja, saadaks ma t88soovija pikale lainele kui too ei tea muffigi objektorienteeritusest.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: X 2002-10-15 15:23:25
TSITEERITUD:
maitse asi. imho objektide peale minnes on organiseerimine kergem - koodis on n2ha mis asjaga mingit operatsiooni teostatakse jne. laiendamine (extendimine) lubab teha lisapluginaid algsele jubinale jne. oleks ma t88andja, saadaks ma t88soovija pikale lainele kui too ei tea muffigi objektorienteeritusest.

Siis oleksid Sa küll kahjuks väga lühinägelik t88andja. Esiteks ei ole PHP siis objektorienteeritud keel, vähemalt senimaani on OOP pool küllaltki nõrk olnud (uue Zend mootoriga siis kaasneb juba parem tugi) ning seega on OOP PHP-s eelkõige koodi aeglustanud. PHP-s on API'de moodustamine ainult struktuurprogrammeerimise abil küllalt mõttekas ja pole sugugi nii segane, kui vastavaid funktsioone hoida kindlates failides ning muutujate anda kindla tüübi järgi nimed. Pealegi, kui Sa kui t88andja tõesti sooviksid ainult puhast OOP koodi, siis pole PHP OOP teab mis raske ning vähegi kauem PHP-ga tegelenud programmeerijale ei teki sellega tutvumine erilisi raskusi.

BTW ma ei ürita kuidagi maha teha OOP programmeerimist või öelda, et PHP-s OOP-d teha ei või, kuid ma lihtsalt mainin, et PHP ei ole siiski mõeldud objektorienteeritud keelena ning senimaani on OOP tugi vägagi nõrk olnud. Ma ei ole seni näinud rakendust, mida ilma OOP-ta märgatavalt raskem oleks teha (funktsioone ja faile õigesti struktueerides), see muidugi ei tähenda, et ma PHP-s OOP'd ka ise kirjutanud poleks.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: stepz 2002-10-23 07:02:28
TSITEERITUD:

Siis oleksid Sa küll kahjuks väga lühinägelik t88andja. Esiteks ei ole PHP siis objektorienteeritud keel, vähemalt senimaani on OOP pool küllaltki nõrk olnud (uue Zend mootoriga siis kaasneb juba parem tugi) ning seega on OOP PHP-s eelkõige koodi aeglustanud. PHP-s on API'de moodustamine ainult struktuurprogrammeerimise abil küllalt mõttekas ja pole sugugi nii segane, kui vastavaid funktsioone hoida kindlates failides ning muutujate anda kindla tüübi järgi nimed. Pealegi, kui Sa kui t88andja tõesti sooviksid ainult puhast OOP koodi, siis pole PHP OOP teab mis raske ning vähegi kauem PHP-ga tegelenud programmeerijale ei teki sellega tutvumine erilisi raskusi.

BTW ma ei ürita kuidagi maha teha OOP programmeerimist või öelda, et PHP-s OOP-d teha ei või, kuid ma lihtsalt mainin, et PHP ei ole siiski mõeldud objektorienteeritud keelena ning senimaani on OOP tugi vägagi nõrk olnud. Ma ei ole seni näinud rakendust, mida ilma OOP-ta märgatavalt raskem oleks teha (funktsioone ja faile õigesti struktueerides), see muidugi ei tähenda, et ma PHP-s OOP'd ka ise kirjutanud poleks.

Programmeerija, kes oskab OOP'st, oskab üldjuhul ka abstraktselt mõelda. Peale selle objektorienteeritus PHP's ei ole päris see, mida selle all tavaliselt mõeldakse. Objekte on mõistlik kasutada PHP all suhteliselt tagasihoidlikult koodi struktueerimiseks ja uuesti kasutamiseks segamini traditsioonilise lahendusega, mitte rakendades täielikke OOP põhimõtteid. Sealjuures kaotamata märkimisväärselt töökiiruses. Tänu sellele on mul õnnestunud oluliselt lühemalt ja kiiremini teha osasid asju, mis sellisel kujul ei oleks ilma objekte kasutamata võimalikud olnud.

PHP OOP funktsionaalsuse puudujäägid ei takista minuarust seda praegu effektiivselt ära kasutamast. Tõsisemad puudujäägid, mis PHP5's on plaanis parandada on korraliku overloadimise toe puudus, mis teeks developimise oluliselt lollikindlamaks ja kiiremaks. Ebaintuitiivne objekti viite liigutamine. Kui otseselt ära ei märgi, et sa liigutad viidet objektile, tehakse koopia, mis on AEGLANE. Ja dereferentseerimine ning try-catch.
Need teeksid võimalikuks sarnase hüpoteetilise konstruktsiooni, mis tegeleks sisestatud suvandite salvestamisega.

PHP kood:
 
try {
   
user(_CURRENT_USER)->defaultSettings(get_class($this->targetObject($option)))->$option $optionValue;
}
catch (
userInputError $myException) {
  
$input->inputValueError($myException$option);
}

Kusjuures see käituks nii, et globaalne funktsioon "user" tagastaks vastava tunnusega kasutaja objekti, võttes selle näiteks mingist globaalsest massiivist, luues vajaduse korral uue. Kasutaja objekti konstruktor ei hangi defauldis mingeid andmeid, seega overhead minimaalne. Kasutaja objekti Seadete meetod tagastab muudetava objekti tyybi seadete objekti, mille klass on näiteks laiendus mingile üldisele seadete manageerimise objektifunktsionaalsusele. See seadete objekt oleks ülelaetud propertydega, tänu millele kontrollitakse kas uus seade väärtus on sellele objekti tüübile vastuvõetav ja vastaval juhul salvestatakse see kuskile, (näiteks seadete objekti, kus objekti destruktor uuendab andembaasi). Kui selle väärtustamise käigus tekiks exceptioni mis kuulub klassi userInputError, siis kutsutakse välja hetkel kasutatava sisendiobjekti vea meetod seade parameetriga. See sisendobjekt hoolitseb siis ise kasutajale vea teatamise eest.

Esialgu tundub lihtsa asja jaoks keeruline struktuur, aga suurte projekti puhul aitab korralik objektorienteeritud struktuur kokkulepitud nimekonventsioonidega oluliselt
1) Loetavus: Selle koodi peale vaadates on üldiseid põhimõtteid teades väga lihtne järeldada, mis toimub. (eeldades, et funktsioonid teevad seda, mis neil eeldatud on)
2) Laiendatavus: Lisad uue mooduli mille parameetreid seadistada vaja, võid kasutada kas default funktsionaalsust, mõnda spetsialiseeritud klassi, või laiendada enda tarbeks defaulti. Kõik need võtavad oluliselt vähem aega, kui uue seadistusosa kirjutamine. Samas tulevad kaasa kõik kasutajaga suhtlemise funktsioonid, ja seadistus oleks kasutatav kõikide erinevate sisendmoodustega, mis eelnevalt kasutatavad.
3) Hallatavus: Loogiliselt samad funktsionaalsusega koodi saab hoida ühes kohas. Kui vaja seda funktsionaalsust täiendada, parandada, muuta, siis tuleb teha seda ainult ühes kohas.
4) Developemise kiirus: Kõik eelnev eeldab, et tehtav on korralikult läbimõeldud ja komponentide funktsionaalsused on läbimõeldud. Tänu sellele on arvatavasti ka eraldatud ülesanne kergesti selgeteks tegevusteks, mis saab laiali jagada üldiseks API'ks. Tänu sellele on enamus koodi juba valmis planeeritud pseudokoodi/flowcharti API süntaksi järgi kirja panemine, kus on minimaalselt korduvaid tegevusi ja kood on lihtne ja loogiline.

Minu arust need eelised kaaluvad ülesse igasuguse kiirusekaotuse. Korralik programmeerija maksab oluliselt rohkem kui natukene rauda, see kehtib eriti kõrgemate elatustasemete puhul, kuhu ka meie liigume.
Enamus sellest funktsionaalsuset, mis ma kirjeldasin on praegu kasutatav natukene pikema süntaksiga. Ning ilma objektorienteerituseta selle lahendamine on kas lihtsalt tülikas, aga pahatihti ka väga keeruline ja vigadealdis. Peale selle, on see lähenemine tavaliselt ka objektidele suunatud mõtlemisega, lihtsalt on kasutamata jäetud keele tugi selle asja oluliselt lihtsamalt ja loetavamalt lahendamine.

------
Minu väga unised mõtted

PS: tegu on näitega, mis ei pretendeeri mingile geniaalsusele, lihtsalt ideede näitlikustamiseks

Viimati muudetud: 23-10-2002 07:03:56
Muutja: stepz
Põhjus: postscriptum

RE: Objektorienteeritud programmeerimine PHP's
Postitaja: mrq 2002-11-20 12:08:29
Olen isegi mõelnud ja teinud asju niivõrd naavõrd objekteeritult, kuid kardan, et PHP koodi ei ole võimalik selliselt üldse ehitada, kuna see ikkagi muutub liiga aegalseks võrreldes sellega, et kui tekitan klassi muutujad ning siis, et neid kasutada tuleb need registreerida ning alles siis saan funktsiooni poole pöörduda, kuigi oleks võinud seda teha juba läbi PHP funktsiooni enese.

Samas on tunda see, et kui sa tekitad ühe suure "kerneli" funktsioonidega, siis see on täilik pidur. Kood tuleb liigendada ja kasutada require("vajalik_funk.php"); vastavalt vajadusele.
See omakorda tähendab seda, et iga kord, kui midagi tahan teha hakkan otsast pihta oma koodi läbi kammima, mis võtab aega.
PHP viga ongi see, et ei ole võimalik valmis kompileerida n.ö. ühte paketi, vaid seda tehakse igakord, kui kasutaja värskendab lehte. Seega on nõutud, et see mida me koodi jooksutamiseks kasutame oleks võimalikult lühidalt kirjutatud, sest vastasel juhul võtab see ju oma kompileerimisega hirmus kaua aega.

PHP kood:
 
<?php
require("kernel.php");//100 000 rida funktsioone, here we go
?>
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: x2 2004-05-03 08:02:22
õige!
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: 2004-07-05 15:27:58
niiet PHP4 OOP sucks?
    Muuda postitust
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: kamm 2004-07-16 23:16:35
kasutan ka ise klasse väga ettevaatlikult, st. ainult eriti universaalsete vajaduste arvutamiseks/toimetamiseks, muidu, arvestades, et vajadused ja ka arusaamad võivad iga päev muutuda ja tavaliselt arenduses see nii ongi. teisalt on mingi uue lahenduse tegemisel kasulik läbi sõeluda kunagi kribatud kood, mitte lihtsalt võtta järjekordne klass.

kui juba klassitada, siis soovitan Python, java vms.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: crimmerf 2005-03-24 09:27:41
see koodi rida ei tööta ju...

kood on selline:
<?php

class text{

function text()
{
$this->text='<h1>Tere</h1>';
}

function add($text)
{
$this->text.=$text;
}

function print_text()
{
echo $this->text;
}

function color_add($text, $color)
{
$text='<span style="color: '.$color.';">'.$text.'</span>';
$this->add($text);
}

}

$must = new text;
$punane = new text;


$must->color_add('olen must text', 'black');
$punane->color_add('olen punane tekst', 'red');

$must->print_text();
$punane->print_text();

?>
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: still no oop 2005-06-18 22:59:06
TSITEERITUD:
tore küll, aga oleks hea, kui saaks näha sama artikli järge (advanced), kus tehakse mingi reaalne lahendus valmis:) midagi sellist, mida "tõelises" elus kasutatakse ja vaja ka läheb ;)
tõesti võiks teha sellist värki, see teksti oma tundub vääga tobe. ma kirjutaks küll nii:
PHP kood:
<?php 

function text() 

return 
'<h1>Tere</h1>'


function 
color_add($text$color

return 
'<span style="color: '.$color.';">'.$text.'</span>'


echo 
color_add(text().'olen must text''black'); 
echo 
color_add(text().'olen punane tekst''red'); 

?>
ma nüüd ei testinud seda, aga teoorias peaks töötama küll
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: still no oop 2005-06-19 01:06:00
teemaarenduseks: http://www.zend.com/php/beginners/php101-7.php?article=php10
selle lehe lõpus on väike sõnavõtt teemal oop vs procedural programming. ja sellega tuligi küsimus suurele ringile: kui suur peaks olema kood, et seda oopis tasuks kirjutada? ise pakuks lambist mingi 50 Kb ... On ju teada, et väikest skripti tasub ikka "tavalises" stiilis kirjutada ... ja teine küsimus ka: kas oopi programeerijad teevad kõiki projekte oopiga?
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: atw 2005-06-22 19:49:36
Mina teen. Koodi suurus vast ei ole m22rav, vaid see, et igas programmis on vaja sarnaseid funktsioone.

siis teedi valmis klassi, kus on DB, faili, sessioonide jm funktsionaalsus olemas ja kasutad sama asja iga uue t88 p6hjana ning s22stad aega.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: arc 2005-08-22 15:55:23
Tasuks ka seda artiklit lugeda, kus PHP OOP töökiirust analüüsitud.
Artikli lõpus on asjalik lause:
"Therefore, the next time you are developing PHP code, you should consider whether you want faster execution times / less CPU load, or easier to maintain code."
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: arc 2005-08-22 15:56:09
oops, link jäi lisamata :P
http://www.webmasterstop.com/56.html
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: java progeja 2006-04-03 11:37:06
tegelikult ei ole eriti kompetentne rääkima php oop-ist ja maintenence-st jms, kuid paar asja, mis ehk valgustaksid OOP poistiivseid pooli.

Näituseks on leht mis koosneb päisest, menüüst, sisust ja jalusest.
Kõik on ilus ja tehtav nii kaua kuni pole äriloogikat.
Näiteks on lehel sisestusvorm kus osa väljasid on nõutud, e-mailil loomulikult on valideerimine, maa on rippmenüü- nii, et samuti on valideerimine vannabii häkkerite vastu.

Kõik on kena, kuid nüüd on vaja näidata välja ka vigu.
Ehk siis paar lähenemist. Tavaliselt vist on valideerimine päises, ehk siis enne ei näidata ühtegi rida HTML-i kui oled kindel, et kood on valideeritav et hoida koodipuhtust ja vajadusel kasvõi saata kasutaja mõnele teisele aadressile(et jällegi vannabii häkkerid ei satuks vaimustusse reload/refresh/f5-st).

Niisiis, on vaja kapsuleerida veateated. Tavaliselt on neid kolme tüüpi: viga, hoiatus ja teade. Sa võid need loomulikult panna kuhugi kolme map-i: $warnings=Array(), $messages=Array(), $errors=Array(). Aga nüüd on sinul namespace-i probleem ja pannes programmi kokku mitmest moodulist on üsna peavalu, milliseid muutujaid külge pookida- ehk siis dokumentatsioon, dokumentatsioon ja veelkord dokumentatsioon. Vastik.
Mida teeks mina. Ma teeks väga lihtsalt:

Class Messages{
var $messages = Array();
var $errors = Array();
var $warnings = Array();
function addWarning($warning) {
$this->warnings[sizeOf($this->warnings)] = $warnings;
}
/---
jne...
--/
}


OK, nüüd on lihtne siia lisada igatsuguseid kontrolle nagu hasWarnings, hasMessages jne.. Koodiridade arv igatahes väheneb tunduvalt.
Samuti võib ka teateid indekseerida ja grupeerida. Näiteks warnings on hoopis map, kus key on vea esile kutsunud väli ning väärtus on array vigadest vms. Ehk siis tööpõld on lai ja saab ilusasti hakata validaatoreid ehitama.
Samuti saab ehitada ilusa koodi mida kasutada enamus projektide puhul vigade kuvamiseks:

<? if ($messages->hasAnyMessages()) { // see on abimeetod mis uurib kas üldse on mõni teade ?>
<div id="messages">
<? if ($messages->hasErrors()) {
foearch ($messages->getErrors() as $err) {
?><div class="error"><?=$err?></div><?
// ja sama siis ka messages ja warningu kohta
}?>
</div>
<?}?>


Mida ma tahan ütelda, kui teha kommertstooteid, siis ei saa hakata tooteid arendama nullist ja otsast. Korralikult koodi disainides ja OOP-i abil struktureerides saab üsna mõnusa korduvkasututatava koodi mis aasta jooksul toob palju tulu just tänu sellele, et arendus muutub järjest kiiremaks. Mingi hetk võib juhtuda, et ainuke mida hakkad progema on pisike äriloogika ja kujunduse omapärda, kõik muu on modullaarne ja hõlpsalt integreeritav.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: tjah 2008-03-25 18:00:21
Mina ei saand sellest õppetusest midagi aru igastahes.Ja muidu loen ka välja et see OO on suht pointless asi,tundub et lihtsalt kõvamad progrejad teeavad OOd kuna siis nad on teistest üle vms.Muidu ma pakun et ma saan tavalise koodiga paremini hakkama.


Edu.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: swingman 2010-06-16 22:42:56
TSITEERITUD:
Mina ei saand sellest õppetusest midagi aru igastahes.Ja muidu loen ka välja et see OO on suht pointless asi,tundub et lihtsalt kõvamad progrejad teeavad OOd kuna siis nad on teistest üle vms.Muidu ma pakun et ma saan tavalise koodiga paremini hakkama.


Edu.


Täitsa õige jutt. Lihtsad asjad tehakse 1000 korda keerulisemaks, et näidata kui kõvad vennad need "tegijad" on. Samal põhjusel kasutavad nad Windowsi asemel Linuxit - peaasi et eputada saaks! Olen linuxis palju töötanud, - kõige ebastabiilsem ja ettearvamatum asi arvutimaailmas... Tasuta peavalu.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: Ern 2011-03-11 19:18:05
Täitsa naljakas lugeda kuidas PHP tegijad OOP'i avastavad.OK,sorry, ei nori rohkem.OOP ei ole makrod ja seega teoreetiliselt ei saa teha koodi aeglasemaks.OOP tähendab piltlikult ühte väga tarka preprotsessorit,mis tulemusena seab kõik funktsioonid "õigesse ritta" ilma midagi dubleerimata,siis enne masinkoodi genereerimist.Et saada täit selgust OOP'ist,siis osad kompilaatorid võimaldavad kompileerida OOP lähtekoodi ka enne masinkoodi panekut assembleriks.Seal on nagu valgel paberil näha kõik mida OOP on teinud.Muidugi on seal ainult funktsioonid ja suurema programmi puhul väljub selle koodi jälgimine inimvõimete piirilt.Muidugi tuleb sinna andmete klasside vahelise edastamise tõttu koodi juurde,mida muidu asmis või C's ei kirjutaks.Kuid see on suhteliselt vähe ja hakkab rolli mängima üksnes reaalajasüsteemide,kuid kindlasti mitte webimaailma puhul.Nüüd on aga ilmselge miks siis PHP's OOP koodi aeglasemaks teeb.Loomulikult sellepärast,et PHP on interpreteeriv keel,ilma kompileerimiseta.OOP liides kompileeruvas või interpreteerivas keeles on nagu öö ja päev kiirusevahes.Sellegipoolest eelistaksik ka interpreteerivas keeles kasutada ikkagi OOP'i,peamiselt just lähtekoodi vähendamiseks,mis tunduvalt suurendab programmi loetavust ka kõrvalistele isikutele.Muidugi on OOP palju rohkem ka kui siinsed näited,nagu näiteks lisaks - klasside pärandamine,virtuaalfunktsioonid,class templates,static objectid,public/private klassiliikmed ja pärandamine,operaatorite overloading,klassi sõbrad jne.Veel üks põhjus misk kasutatakse OOP'i,on tarkvara arendusplatformiga kaasa tulev hiiglaslik funktsioonide kogum SDK libraritena.Kuna neid funktsioone on tuhandetes,siis ilma neid klassidesse liigitamata ei suudaks selles keegi orienteeruda ning ka funktsioonide nimed saavad otsa.Panin hiljuti üle tüki aja püsti uue MS VisualStudio ja võrdlus PHP ja ASP.NET progemises oli ikka kõvasti rohkem kui hämmastav. Esiteks kõik webformid ja CSS käisid templatedena graafiliselt hiirega lohistades.Teiseks Model-View-Controller arhitektuur eraldab lisaks OOP'ile veelgi programmi loogilisteks osadeks.Kolmandaks isegi klasse ei pea väga palju peast numutama vaid studio ise pakub sulle valikuid juhuks kui pole mingi klassi nimi meeles.Muidugi lisaks veel see et kõike saab kompileerida ja sisuliselt kirjutada programmi nagu see polekski webiprojekt vaid pigem arvutiprogramm, kus on ka sisse ehitatud vastavad eventid mingite sündmuste jaoks.Üldiselt mulje jäi selline et 3h PHP's kribamist võrduks 5min VisualStudios ning 3 lehakülge lähtekoodi PHP oleks kolm rida lähtekoodi VisualStudios.
Aga see on ju kõik aeg millega saaka midagi muud veel kirjutada.
RE: Objektorienteeritud programmeerimine PHP's
Postitaja: lk_ 2012-07-12 20:22:55

Leheküljed: 1

©2002-2013 Martin Rebane & PHP.ee kaasautorid
  0.0162329673767