Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Videoannonse
Annonse
Eventuelt:

error_reporting(0);

6118364[/snapback]

 

Det kan anbefales å bruke error_reporting(E_ALL) for å tvinge PHP til å vise alle feil (også notices) mens du utvikler lokalt, og heller sette error_reporting(0) når du slenger det opp på produksjonsserver. PHP slenger ikke ut feilmeldinger og notiser uten grunn, så å luke dem ut ved rett og slett å fikse koden kan sterkt anbefales. :)

Lenke til kommentar
Gjest Slettet+6132

Eneste jeg pleier å slå av er noticer, små slurvefeil som lager noticer fikser jeg når jeg gidder, ikke et sekund før ;)

Lenke til kommentar

E_ALL|E_STRICT (php 5.x)

Jeg er perfeksjonist, en notice er like ille som en fatal error etter min bok.

Når jeg gir fra meg prosjektet derimot, er det 0 (error_reporting (0))

 

Ellers la jeg akkurat merke til set_error_handler(), dette virker som en veldig interessant funksjon. Fin måte å kunne få tak i error på, uten å avsløre ovenfor klienten eller skrive mange egene feilrapporteringsfunksjoner.

Lenke til kommentar

<?php
function errorToExceptionHandler($severity, $message, $file, $line) { 
   if (error_reporting() & $severity) 
       throw new ErrorException($message, 0, $severity, $file, $line); 
}
?>

Kan anbefale å bruke denne når eller hvis du vil benytte deg av set_error_handler()

Endret av Fjoggs
Lenke til kommentar

Ja det krever php5 siden php4 ikke har Exceptions.

 

Har kun brukt php5 det siste året, så tenkte faktisk ikke på at ikke alle har mulighet til å benytte den.

 

Vil på det sterkeste anbefale å oppgradere til php5.

Det har vært en del snakk om kompatibilitets (er det et norsk ord?..) problemer, men det er mulig å kompilere php5 med ekstra støtte for php4, hvis det skulle være nødvendig. Allikevel med php5.1 så skal de aller fleste php4 programmene fungerer uten ekstra vanskeligheter.

 

Edit:

Det er vel strengt tatt kun php programmer som benytter seg av massiv "References" knyttet til object behandlig som vil oppleve en del knot, i tilleg til de som har laget konstanter med navn public, static, private, protected.

Endret av Fjoggs
Lenke til kommentar
Et problem jeg hele tiden støter på er at jeg støtt og stadig får error i egenlagde funksjoner. Problemet er som regel ikke relatert til selve funksjonen, men input-en. Da hadde det jo vært genialt å gi en debug-feilmelding som angir hvor den ble kalt. Noen som har noen ideer?

6111453[/snapback]

 

I PHP 5 bruker du bare exceptions, i PHP 4 blir det verre selvsagt (Og det er vell god grunn til å tro at du bruker PHP 4).

Hva skal skje når du opplever feil med input da? Avslutte programmet? Fortsette mens du hopper over akkurat den biten?

Lenke til kommentar
  • 2 uker senere...

Siden denne tråden dauet, tenkte jeg å lage litt liv ved å lage en hyperlink!

 

What's new in PHP5

 

Veldig god oversikt på hva som er nytt i PHP5 (med eksempler). Ble uhyre inspirert til å progge noe når jeg leste den :hmm:

 

 

 

EDIT

Og siden jeg er så godt i gang kan jeg jo tipse om at Zend Studio 5.2 er ute. Har allerede testet den nye versjonen, og det er faktisk merkbare ytelsesforbedringer (spesielt når man bruker "OS look and feel").

Endret av Loomy
Lenke til kommentar
Gjest Slettet+6132

Er Smarty å anbefale? Vil utvide prosjektet mitt med egne templates, men når det kommer til OOP sier hjernen min "stopp". Sitter og leser på dokumentasjonen til Smarty nå, men vet ikke om jeg orker å ta meg bryet med å bytte til en template engine. Blir jo en god del omskriving av kode :p

Lenke til kommentar

Altså, Smarty er etter min meninger særdeles overkomplisert i forhold til det folk faktisk trenger. Det er ikke noe problem å lage seg en god template-motor på rundt 100 linjer (inkludert kommentarer) som gjør eksakt det du trenger og ingenting mer. Samtidig så lærer man jo litt av det og får ting eksakt som man vil ha det. F.eks kan man slippe unna å sette hver eneste lille variabel i templaten, noe man må med Smarty.

Lenke til kommentar
Gjest Slettet+6132
Altså, Smarty er etter min meninger særdeles overkomplisert i forhold til det folk faktisk trenger. Det er ikke noe problem å lage seg en god template-motor på rundt 100 linjer (inkludert kommentarer) som gjør eksakt det du trenger og ingenting mer. Samtidig så lærer man jo litt av det og får ting eksakt som man vil ha det. F.eks kan man slippe unna å sette hver eneste lille variabel i templaten, noe man må med Smarty.

6234235[/snapback]

 

Problemet er bare at jeg ikke aner hvilket hjørne av problemet jeg skal pusse på først ;)

Hvor starter man når man skal lage en template engine? Hva trenger man? Må den være OOP? (Kan ikke OOP selv). Alt jeg vet om template engines er at du har vanligvis en klasse som parser templatefiler og kompilerer output :roll:

Lenke til kommentar
Problemet er bare at jeg ikke aner hvilket hjørne av problemet jeg skal pusse på først ;)

Hvor starter man når man skal lage en template engine? Hva trenger man? Må den være OOP? (Kan ikke OOP selv). Alt jeg vet om template engines er at du har vanligvis en klasse som parser templatefiler og kompilerer output :roll:

6234581[/snapback]

 

Selvfølgelig må den ikke være OOP. Det er ikke noen gode grunner hvorfor den faktisk skal være OOP uansett siden en templatemotor skal jo være kjappest mulig ;)

Lenke til kommentar

hva med å bruke en super template engine jeg har brukt på sidene mine?

WEP::template engine (0.3)

 

template.class.php

<?php
/******************************************************************************
*                             template.class.php (Template engine)            *
*******************************************************************************
* WEP: Web Extended Potal                                                     *
* Open-Source Project by W4N                                                  *
* =========================================================================== *
* Software Version: 1.0a                                                      *
* Software by:      W4N (http://www.w4n.org)                                  *
*******************************************************************************
* This program is free software; you may redistribute it and/or modify it     *
* under the terms of GNU General Public Lisens (GPL) version 2.0              *
*                                                                             *
* This program is distributed in the hope that it is and will be useful,      *
* but WITHOUT ANY WARRANTIES; without even any implied warranty of            *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                        *
*                                                                             *
******************************************************************************/

class template
{
private $output = '';
private $template = 'Default';
private $blocks = array();
public $tags = array();

function template($template = '')
{
 if($template)
 {
 	$this->template = $template;
 }
}

function add_html($file, $tags = array())
{
 global $cache;

 $this->tags += $tags;
 $cfile = $this->template.'_'.$file;
 $filetpl = ROOT . '/templates/' . $this->template . '/' . $file . '.tpl';
 $output = $cache->get('tpl', $cfile);
 if(!$output || filemtime(ROOT.'cache/tpl_'.$cfile.'.php') > filemtime($filetpl))
 {
 	echo 'done ' . $output;
 	$html = trim(file_get_contents($filetpl));
 	$html = $this->compile($html);

 	$this->output .= $html;
 	$cache->set('tpl', $cfile, $html);
 }
 else
 {
 	$this->output .= $output;
 }
 return true;

}

function global_tag($tags)
{
 $this->tags += $tags;
}

function compile($html)
{
 // Fix language
 $html = preg_replace('#\{L_([a-z0-9\-_]*)\}#is', "<?php echo \$lang[strtolower('$1')]; ?>", $html);

 // Parse namespace tags
 $btags = array();
 preg_match_all('#\{((?:[a-z0-9\-_]+\.)+)(\$)?([A-Z0-9\-_]+)\}#', $html, $btags);

 $varcount = sizeof($btags[1]);
 for ($i = 0; $i < $varcount; $i++)
 {
 	$namespace = $btags[1][$i];
 	$varname = $btags[3][$i];
 	$new = $this->generate_block_varref($namespace, $varname);

 	$html = str_replace($btags[0][$i], $new, $html);
 }

 // Parse tagss
 $html = preg_replace('#\{([a-z0-9\-_]*)\}#is', "<?php echo \$this->tags['\\1']; ?>", $html);
 // Fix <-- ENDIF -->
 $html = str_replace('<!-- ENDIF -->', ' <?php } ?> ', $html);

 $b = array();
 preg_match_all('#<!-- (.*?) (.*?)?[ ]?-->#', $html, $b);
 $text_blocks = preg_split('#<!-- (.*?) (.*?)?[ ]?-->(.*)#', $html);

 // Breaks into lines

 $nesting_level = 0;
 $nesting_names = array();
 $nesting_names[0] = '.';

 for($i=0;$i<sizeof($text_blocks);$i++)
 {
 	if (!isset($b[1][$i]))
 	{
   $b[1][$i] = '';
 	}

 	switch($b[1][$i])
 	{
   case 'IF':
     	$compile[] = "<?php if ({$b[2][$i]}) { ?>";
     	break;
   case 'ELSEIF':
     	$compile[] = "<?php } elseif ({$b[2][$i]}) { ?>";
     	break;
   case 'ELSE':
     	$compile[] = '<?php } else { ?>';
     	break;
   case 'BEGIN':
     	$nesting_level++;
     	$nesting_names[$nesting_level] = $b[2][$i];
     	$namespace = implode('.', $nesting_names);
     	$namespace = substr($namespace, 2);
     	$namespace = $this->generate_block_data_ref($namespace, false);
     	$compile[] = "<?php \$i_{$b[2][$i]}_count = count($namespace);for(\$i_{$b[2][$i]}=0; \$i_{$b[2][$i]} < \$i_{$b[2][$i]}_count; \$i_{$b[2][$i]}++) { ?>";
     	break;
   case 'END':
     	unset($nesting_names[$nesting_level]);
     	$nesting_level--;
     	$compile[] = '<?php } ?>';
     	break;
   case 'INCLUDE':
     	$compile[] = "<?php $template->tpl_include($b[2][$i])?>";
     	break;
   default:
     // No nothing
     break;
 	}

 }
 $output = '';
 for ($i = 0; $i < sizeof($text_blocks); $i++)
 {
 	$trim_text = trim($text_blocks[$i]);
 	$output .= ((!empty($trim_text)) ? $trim_text : '') . ((!empty($compile[$i])) ? $compile[$i] : '');
 }
 $output = str_replace(' ?><?php ', '', $output);
 return $output;
}

function tpl_include($file)
{
 $filename = ROOT.'cache/tpl_'.$this->template.'_'.$file.'.php';
 $filetpl = ROOT . '/templates/' . $this->template . '/' . $file . '.tpl';
 if(file_exists($filename) && filemtime($filename) > filemtime($filetpl))
 {
 	echo file_get_contents($filename);
 }
 else
 {

 	$html = trim(file_get_contents($filetpl));
 	$html = $this->compile($html);

 	echo $html;
 	$this->write_code($file, $html);
 }
 return true;
}
function print_page()
{
 global $lang, $user;
 eval('?>' . $this->output);
}

function add_javascript($script, $tpl_script = false)
{
 if($tpl_script == false)
 {
 	$this->tags['SCRIPTS'] .= "<script src=\"jscripts/$script.js\" type=\"text/javascript\" />\n";
 }
 else
 {
 	$this->tags['SCRIPTS'] .= "<script src=\"templates/{$this->template}/$script.js\" type=\"text/javascript\" />\n";
 }
}

function redirect($url, $time = 0)
{
 header("refresh:$time;url='$url'");
}

function refresh($time)
{
 header('refresh:' . $time);
}

function assign_block($block, $tags)
{
 if(!isset($this->blocks[$block])) $this->blocks[$block] = array();

 if(strpos($block, '.'))
 {
 	// Nested block.
 	$blocks = explode('.', $block);
 	$blockcount = sizeof($blocks) - 1;
 	$str = '$this->blocks';
 	for ($i = 0; $i < $blockcount; $i++)
 	{
   $str .= '[\'' . $blocks[$i] . '\']';
   $lastiteration = 0;
   eval('$lastiteration = sizeof(' . $str . ') - 1;');
   $str .= '[' . $lastiteration . ']';
 	}
 	// Now we add the block that we're actually assigning to.
 	// We're adding a new iteration to this block with the given
 	// variable assignments.
 	$str .= '[\'' . $blocks[$blockcount] . '\'][] = $tags;';

 	// Now we evaluate this assignment we've built up.
 	eval($str);
 }

 else
 {
 	$this->blocks[$block][] = $tags;
 }
}

function generate_block_data_ref($blockname, $include_last_iterator)
{
 // Get an array of the blocks involved.
 $blocks = explode(".", $blockname);
 $blockcount = sizeof($blocks) - 1;
 $varref = '$this->blocks';
 // Build up the string with everything but the last child.
 for ($i = 0; $i < $blockcount; $i++)
 {
 	$varref .= '[\'' . $blocks[$i] . '\'][$i_' . $blocks[$i] . ']';
 }
 // Add the block reference for the last child.
 $varref .= '[\'' . $blocks[$blockcount] . '\']';
 // Add the iterator for the last child if requried.
 if ($include_last_iterator)
 {
 	$varref .= '[$i_' . $blocks[$blockcount] . ']';
 }

 return $varref;
}

function generate_block_varref($namespace, $varname)
{
 // Strip the trailing period.
 $namespace = substr($namespace, 0, -1);

 // Get a reference to the data block for this namespace.
 $varref = $this->generate_block_data_ref($namespace, true);
 // Prepend the necessary code to stick this in an echo line.

 // Append the variable reference.
 $varref .= '[\'' . $varname . '\']';

 $varref = '<?php echo '.$varref.'; ?>';

 return $varref;

}

function write_code($html, $data)
{
 $file = ROOT.'cache/tpl_'.$this->template.'_'.$html.'.php';

 $fp = @fopen($file, 'wb');
 if($fp)
 {
 	@flock($fp, LOCK_EX);
 	@fwrite ($fp, $data);
 	@flock($fp, LOCK_UN);
 	@fclose($fp);

 	@chmod($file, 0644);
 }
 else
 {
 	die("can't open $file");
 }
}

}
?>

cache.php (Nytt i 0.3)

<?php

class cache
{
function set($type, $query, $data)
{
 $result = '';
 $file = '';

 switch ($type)
 {
 	case 'sql':
   $file =& $query;
   $result = serialize($data);
   break;
 	case 'tpl':
   $file = 'tpl_' . $query;
   $result =& $data;
   break;
 }
 $this->write($file, $result);
}

function get($type, $query)
{
 $result = false;

 switch ($type)
 {
 	case 'sql':
   $result = $this->read($query);
   if($result)
   {
   	$result = unserialize($result);
   }
   break;
 	case 'tpl':
   $file = 'tpl_' . $query . '.php';
   $result = $this->read($file);
   break;
 }
 return $result;
}

function write($file, $data)
{
 if(defined('EA'))
 {
 	eaccelerator_put($file, $data, 60);
 }
 else
 {
 	$file = ROOT . 'cache/' . $file . '.php';

 	$fp = @fopen($file, 'wb');
 	if($fp)
 	{
   @flock($fp, LOCK_EX);
   @fwrite ($fp, $data);
   @flock($fp, LOCK_UN);
   @fclose($fp);

   @chmod($file, 0644);
 	}
 	else
 	{
   die("can't open $file");
 	}
 }
}

function read($file)
{
 $data = false;
 if(defined('EA'))
 {
 	$data = eaccelerator_get($file);
 }
 else
 {
 	if(file_exists(ROOT . 'cache/' . $file . '.php'))
 	{
   $data = file_get_contents(ROOT . 'cache/' . $file . '.php');
 	}
 }
 return $data;
}
}
?>

eksempel:

include('template.class.php');
include('cache.php');

// ROOT
define('ROOT', './');
/*
 mappe struktur
  /
   cache
   jscripts
    js1.js
    js2.js
   templates
    template1
     images
    template2
     images
    template3
     images
   index.php
   cache.php
   template.class.php
   /* Andre filer og mapper */
*/
// om du bruker Eaccelerator
// define('EA', 1);
$cache = new cache();

// Språk arrayen
$lang['min_side'] = 'FooBar';
$lang['copyright'] = '© Me';
// hvis du bruker template() så brukes Default som template
$template = new template('Navn_På_Template');
// Legg til en code (/templates/navn_På_Template/header.tpl)
$template->add_html('header');
// Block system
$template->assign_block('a', array('YEAR' => 2005));
$template->assign_block('a', array('YEAR' => 2006));
// Legg til body med parse tags
$template->add_html('body', array('ME' => 'LoLmans'));
// print alt sammen
$template->print_page();

header.tpl

<html>
<head>
<title>{TITLE}</title>
{SCRIPTS}
</head>
<body>
<h1>{L_MIN_SIDE}</h1>

body.tpl

This is {ME} page!<br />
<!-- BEGIN a -->
Block example: <b>{L_COPYRIGHT} {YEAR}</b><br />
<!-- END a -->

 

Skulle fungere. Resten finner du ut selv.

 

EDIT: glemte $template->print_page(); i index.php

Endret av hotstian
Lenke til kommentar
Altså, Smarty er etter min meninger særdeles overkomplisert i forhold til det folk faktisk trenger. Det er ikke noe problem å lage seg en god template-motor på rundt 100 linjer (inkludert kommentarer) som gjør eksakt det du trenger og ingenting mer. Samtidig så lærer man jo litt av det og får ting eksakt som man vil ha det. F.eks kan man slippe unna å sette hver eneste lille variabel i templaten, noe man må med Smarty.

6234235[/snapback]

Litt av problemet til php-miljøet er jo nettop at folk skriver sine egne ting helt uten grunn.

Smarty er for komplisert for 99% av de som bruker det. Windows er også mer komplisert enn noen av brukerne faktisk behøver, det er de færreste som skriver sitt eget os av den grunn.

Av samme grunn bør man ikke skrive sitt eget templatespråk så fremt man ikke har ekstraordinære behov.

 

Jeg vil anbefalle å bruke smarty, det er raskt, du sparer tid siden du ikke må utvikle det selv, det har all funksjonalitet du ikke er klar over om du kanskje får bruk for senere.

 

Så fremt man ikke har behov utover det programvare som finnes i dag så er det ikke fornuftig å skrive selv med mindre man gjør det for å lære å lage det, ikke faktisk å bruke det.

 

Fordelene ved å bruke smarty (eller en annen kjent templatemotor):

* Du har 0 utviklingstid selv

* Antageligvis raskere enn det du skriver selv

* Funksjonalitet i fleng

* Den dagen du plutselig får flere utviklere på prosjektet er sjansen ganske stor for at de ikke må lære seg et helt nytt templatesystem

 

Fordelen ved å skrive selv:

* Du lærer

 

Og jeg har både brukt smarty og skrevet templatemotor selv for hw.no, med kompleksitet omtrent på samme nivå som smarty, noe jeg angrer litt på at vi gjorde til tross for at vi har behov smarty ikke kan dekke så lett så jeg tror jeg er i en god posisjon til å kommentere ;)

Lenke til kommentar
Gjest Slettet+6132
Findus: Helt enig! Hvorfor finne opp hjulet på nytt?

6242515[/snapback]

 

Kunne jo hende det ble rundere :D

Findus: Takk for et bra svar, tror heller jeg skal prøve å sette meg inn i smarty alikevel.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...