Jump to content
php.lv forumi

Problēma!


!Crj.

Recommended Posts

Veltīgi te daži izsakās tik noliedzoši par objektu lietošanu PHP. Ja jums jāraksta liels projekts, tad labot bagus, kā arī nākotnē izmainīt funkcionalitāti ir daudz vienkāršāk ar objektiem, nekā ložņāt pa visu kodu. Otrkārt, ir daudz lietu, kuras atkārtojas no projekta uz projektu (piemēram, templašu lietošana :D ). Vienreiz uzrakstījuši objektu, jūs varat viņu lietot visos nākamajos projektos, ievērojami sev atvieglojot dzīvi :)

Kā piemērs:

<?
include("Parse.inc");

$prs = new Parse("template.html");

$prs->setValue(array('%%vards%%','%%uzvards%%','%%vecums%%','%%mails%%','%%adrese%%','%%telefons%%'),array($vards,$uzvards,$vecums,$mails,$adrese,$telefons));
echo $prs->replace(0);
?>

Un Parse.inc:

<?
Class Parse {

var $tags = array();
var $file;

Function Parse($file) {
       $this->file = $file;
}
Function setValue($tags,$values) {
        if(is_array($tags)) {
           for($i = 0;$i < sizeof($tags); $i++) {
               $this->tags[$tags[$i]] = $values[$i];
           }
        }
        else {
              $this->tags[$tags] = $values;
        }
}
Function replace($mode) {
        if(!$mode) {
           $tpl = file($this->file);
           $tpl = join(' ',$tpl);
        }
        else {
           $tpl = $this->file;
        }
        $tags = $this->tags;
        $search = array();
        $replace = array();

        while(list($key,$val) = each($tags)) {
              array_push($search,'/'.$key.'/');
              array_push($replace,$val);
        }
        return preg_replace($search,$replace,$tpl);
}

}

?>

Un šis failiņš Parse.inc man jau vairākus gadus ceļo no projekta uz projektu :P

Link to comment
Share on other sites

  • Replies 59
  • Created
  • Last Reply

Top Posters In This Topic

Pie kam, jebkāds templeišu sistēma te nav nepieciešama.

 

Sveiks, %%username%%

 

aizvietojam ar

 

Sveiks, <?=$username?>

 

Inklūdojam templeitu (pašās koda beigās). Un nav nepieciešama šāda templeitu sistēma nevienā acī.

Link to comment
Share on other sites

un es saprastu, a būtu vismaz im modifikatori (//im) bet še tev!

dotajā gadījumā nav nepieciešamības pēc //im modifikatoriem, kaut arī leitot viņus varēja. Nedomāju, ka tas ļoti saīsinātu vai uzlabotu kodu. //i pilnīgi noteikti nē, jo var būt gadījums, kad tev ir %%vards%% un %%VARDS%% - tie tomēr ir dažādi tagi :)

lietojot //m būtu jātaisa

$fh = fopen($file,'r');
$tpl = fread($fh,filesize($file));
fclose($fh);

manā saprašanā, tas ir pārak gari un sarežgīti :)

 

Inklūdojam templeitu (pašās koda beigās). Un nav nepieciešama šāda templeitu sistēma nevienā acī.

Dizainerim un vēl jo vairāk lietotājam bieži nav ērti strādāt ar tagiem, kurus viņš neredz gatavā dizainā. <?=$vards ?> ir ērti tikai ja pats taisi templeitu, dizainerim ērtāk ir %%vards%%.

 

str_replace() pilnīgi noteikti varēja, tas man ir no smaga Perl mantojuma :)

 

Labi, lai nebūtu pretenziju Parse.inc

<?
Class Parse {

var $tags;
var $values;
var $file;

Function Parse($file) {
       $this->file = $file;
}
Function setValue($tags,$values) {
        $this->tags = $tags;
        $this->values = $values;
}
Function replace($mode) {
        if(!$mode) {
           $tpl = file($this->file);
           $tpl = join(' ',$tpl);
        }
        else {
           $tpl = $this->file;
        }
        return str_replace($this->tags,$this->values,$tpl);
}

}

?>

Vērtīgi tomēr ir reizēm ieskatītie savos vecajos kodos. Vel viens arguments par labu OOP - arī jaunā Parse.inc redakcija strādās vacajos skriptos :D

Edited by john.brown
Link to comment
Share on other sites

laikam atkārtošos, bet kāpēc gan nē, viss jaunais ir labi aizmirsts vecais

 

$fh = fopen($file,'r');

$tpl = fread($fh,filesize($file));

fclose($fh);

 

ir viena no pierastākām konstrukcijām, visās valodās. (Piem Pascal: AssignFile(handle,FileName); ... CloseFile(handle);)

 

@join('',@file($file)); dara to pašu:

atver hanldu uz failu

kamēr nav faila beigas, nolasa to rindu pa rindai un saglabā masīvā

aizver handlu un pēc tam ar join vēl saliek kopā - varētu būt pat lēnāk, nekā ja ar fread no handla tiek vienkārši nolasīts viss līdz galam vai handla datu beigām, nevis katrs ceļa chars pārbaudīts uz vienādību \0 vai \n vai kā nu tur.

 

Vēl viens visai ātrs variants iraid

ob_start();

include 'template.php'; //nb - esmu ļoti pret .inc un .tpl paplašinājumiem, cik tādu (svešu) esmu nolasījis...

$tpl=ob_get_clean();

 

vai var pat nepārsēt katru templatre atsevišķi, bet nobliezt visu beigās:

 

<?php

ob_start();

include 'header.tpl';

include 'some.htm';

include 'some.php';

un citādi ?> <b>samaisīts htmls</b> ar %%template%% mainīgiem<?php

utt. arī php var izmantot echo '%%template_mainīgais%% teikumā utt';, piem.

while($r=mysql_fetch_array($q))

echo '%%date%%'.$r['date'].'%%/date%%';

 

un kaut kur pašās beigās:

$allhtml=ob_end_clean();

include 'template_apstrāde.php';

foreach($template_var as $key=>$val)

$allhtml=str_replace('%%'.$key.'%%',$val,$allhtml);

echo $allhtml;

flush();

un var pat to visu $allhtml norepleisotu saglabāt failā

fwrite($fp=fopen('cache/'.md5($_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']),'w'),$allhtml);

fclose($fp);

 

bet pirms sākt ob_start() pašā sākumā pārbaudīt

if (time()-filemtime($cachefile=md5(_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']))<1800) //e.g. kešs tiek atjaunots katras 3 stundas

{

include $cachefile;

exit;

}//citādi tiek izpildīts tālākais kods - notiek pārsēšana un ieglabāšana kešfailā

?>

Link to comment
Share on other sites

$fh = fopen($file);
$tpl = fread($fh,filesize($file));
fclose($fh);

manā saprašanā, tas ir pārak gari un sarežgīti smile.gif

file_get_contents() nelīdz?

 

Vērtīgi tomēr ir reizēm ieskatītie savos vecajos kodos. Vel viens arguments par labu OOP - arī jaunā Parse.inc redakcija strādās vacajos skriptos

Un programmējot ar funkcijām tas nenotiek? tb pamainot fjas kodu, izsaucamā programma neko nenojauš? Tā nav?

Link to comment
Share on other sites

Var visādi. Cik koderu, tik variantu, kā to realizēt. Runa gāja ne par to, kā izmantot templates vai kā ātrāk nolasīt failu, bet par OOP lietderību PHP.

Konkrētais piemērs tika pievienots īsuma dēļ - diez vai kādam būtu labums, ja es te ievietotu, piemēram, txt datubāzes objektu ar pāris simtiem rindu koda.

Es guvu labumu no šīs diskusijas, t.k. pārskatīju kodu, kuru tiku rakstījis savas PHP kodešanas sākumā pa taisno pārkodējot no Perl.

Galvenais dotajā gadījumā ir tas, ka ne tikai var, bet arī vajag lietot OOP, vēl jo vairāk tas iekš PHP ir realizējams daudz vienkāršāk, nekā, piemēram, iekš Perl.

Link to comment
Share on other sites

Tomēr ir šādas tādas pretenzijas - semantiskas:iekš php class un function raxtīt maziem burtiem

saprātiskas: redzot $this->file drīzāk rodas asociācijas ar $this->filename. Prasās $this->contents vai tml.

f-jai setValue nav nekāda pamata - kāpēc gan nevarētu pa tieši bliezt klases instancē ($parser->tags=array..., $parser->values=..., $parser->replace())

f-ju replace atbrīvotu no liekā else

un vispār - priekš kam value-siem un tag-iem būtu jāizmanto atsevišķi masīvi - vot saputrošos, ka man $tags[123] ir '%%head%%' un uzlikšu $values[121]='<title>...</title>' - labāk pa tiešo masīvs[mainīgais]=vērtība

 

manā variantā clase būtu kaut kas līdzīgs:

class Parse
{
var $file;
var $contents;
var $tags;
function Parse($file='',$tags=array())
{
 static $tpl=array();
 if ($tags) $this->tags=$tags;
 if ($file && !isset($tpl[$file]))
  $tpl[$file]=@join('',@file($this->file=$file));
 return $this->contents=@$tpl[$file];
}

function replace($tags=array(),$file='') {
 if ($file!=$this->file) $this->Parse($file);
 if ($tags) $this->tags=$tags;
 //variants ā - $tags['mainīgais']='vērtība';
 foreach($this->tags as $key=>$value)
  $this->contents=str_replace('%%'.$key.'%%',$value,$this->contents);
return $this->contents;
 //variants bē - $tags['%%mainīgais%%']='vērtība';
return $this->contents=str_replace(array_keys($tags),array_values($tags),$this->contents);
}
}

(un arī tas nav beigu variants)

 

padomā arī pie tā, kā esmu izveitojis parametrmainīgos - vienu un to pašu instanci var izmantot vairāku failu pārsešanai (pie tam kešojot template izejkodu), vai piemērot jaunos mainīgus tam pašam failaum utt.

Edited by Venom
Link to comment
Share on other sites

Funkcija setValue() tika radita tikai paša ērtībām - tā lasāmāks kods iznāk (IMHO).

"Liekais" if..else nes konkrētu slodzi - ja $mode == 0 - parsējam failu, ja $mode == 1 - parsejam $this->file kā rindu. Piekrītu, ka nav gluži korekti, bet reizēm ir tāda vajadzība :)

Izmantot asociatīvo massīvu acīm redzot ir saprātīgak. Vienkārši man nekad nav bijis vairāk par ~5-10 tagiem templatēs - tur saputroties ir grūti. Man patīk kaut kas līdzīgs:

$prs->setValue(array('%%TITLE%%','%%TOOLS%%','%%MSG%%','%%LEFT_HTMLOUT%%','%%RIGHT_HTMLOUT%%','%%SCRIPT%%','%%CHARSET%%'),array($title,$tools,$msg,$left_htmlout,$right_htmlout,$script,$charset));

Tas arī ir perl mantojums - nemīlu maisīt kodu ar HTMLu. Bet paldies par uzlabojumiem :)

Semantiski jau labu laiku rakstu function ar mazo burtu (piedāvatai kods bija pavecs), tiesa, vēl jo projām Class - bet labošos :rolleyes:

saprātiskas: redzot $this->file drīzāk rodas asociācijas ar $this->filename. Prasās $this->contents vai tml.
Pavisam pareizi būtu: $this->template_file_content. Esmu sastapis tikai vienreiz tik pareizi uzrakstītu kodu ar ļoti sīku un apdomātu mainīgo nosaukumiem. Vairumam, tai skaitā arī man, nepietiek pacietības tik gari rakstīt :) Bet tas, protams, nav labi un pareizi.

 

file_get_contents() nelīdz?

Līdzēs vai nē būs atkarīgs no PHP versijas.

Un programmējot ar funkcijām tas nenotiek?

Notiek, protams. Saprāta robežās :)

Edited by john.brown
Link to comment
Share on other sites

2Venom

return $this->contents=str_replace(array_keys($tags),array_values($tags),$this->contents);

 

Pēdējā rindiņa laikam loģiskāka būtu šitāda:

return str_replace(array_keys($this->tags),array_values($this->tags),$this->contents);

Rezultāta Parse varētu būt šāda ,saglabājot iespēju apstrādāt rindas. Tiesa, ari ne galīgā versija

<?php
class Parse {
       var $file;
       var $contents;
       var $tags;

function Parse($file = '',$mode = 0,$tags = array())  {
        static $tpl = array();
        if ($tags) $this->tags = $tags;
        if ($file) {
           $this->file = $file;
           if(!isset($tpl[$file])) {
           	if(!$mode) {
               	$tpl[$file] = join('',file($this->file));
               	$this->contents = $tpl[$file];
               }
               else {
               	$tpl[$file] = 1; $this->contents = $file;
               }
           }
        }
        return $this->contents;
}
function replace($tags = array(),$file = '',$mode = 0) {
        if ($file && $file != $this->file) $this->Parse($file,$mode);
        if ($tags) $this->tags = $tags;
        return str_replace(array_keys($this->tags),array_values($this->tags),$this->contents);
}
}

?>

Tad ir iespēja lietot šādus variantus:

$data = array('%%vards%%' => 'John','%%uzvards%%' => 'Brown');

$prs = new Parse('template.html',0,$data);

echo $prs->replace();

echo $prs->replace($data,'template1.html');

$data = array('%%vards%%' => 'Huan','%%uzvards%%' => 'Kaktus');

echo $prs->replace($data);

echo $prs->replace('','template.html');

$data = array('%%vards%%' => 'Sancho','%%uzvards%%' => 'Gonzales');

echo $prs->replace($data,'<br><b>%%vards%% %%uzvards%%</b>',1);

Edited by john.brown
Link to comment
Share on other sites

nu re kā cilvēkis sāka rosīties ;)

savu mysql klasi lietoju jau kādu otro gadu un arvien atrodu ko pielabot, nesen atkal piesēdos un samazināju kodu par ~30 rindām (pie tam vēl pievienojot funkcionalitāti)

 

 

Att. uz tā tur else izmantošanu:

ja nav $mode, tad $tpl ir $this->file

if(!$mode) {
          $tpl = file($this->file);
          $tpl = join(' ',$tpl);
       }
       else {
          $tpl = $this->file;
       }

$tpl vienmēr ir $this->file, ja vien ne $mode izņēmums

$tpl=$this->file;
if(!$mode)
{
$tpl = file($this->file);
$tpl = join(' ',$tpl);
}

Link to comment
Share on other sites

Ko pielabot vienmēr var atrast :) Manā gadījumā gan biežāk sanāk tā, ka uzrakstu classīti, novedu līdz dzīvīgam izskatam uz to brīdi, un vairs bez galējas nepieciešamības tur iekšā nelienu - laika vienmēr trūkst :(

Bet tāda publiska koda iztirzāšana veicina radošo domu :) Šinī sakarā, varbūt varētu arī pieminēto txt datubāzīti apspriest - vai nu šinī, vai jaunā tredā?

Link to comment
Share on other sites

Vienā no maniem iepriekšējim postiem :)

Kods ir šeit: MICROdb

Sen gribēju viņu pārrakstīt.

Skaidrs, ka pilnīgi jāpārtaisa darbības ar failiem - viņi ir jākešo. Pašlaik viņa galīgi navajadzīgi tos virina. Arī datu meklēšanu noteikti var effektīvaku uztaisīt.

Edited by john.brown
Link to comment
Share on other sites


×
×
  • Create New...