webForumDet fria alternativet

Tips på förbättring med mera

PHP

13 svar · 806 visningar · startad av yador

Medlem sedan mars 2004455 inlägg
Frågan#1

Hejsan!
Jag har precis gjort denna koden nedan klar och vill nu ha tips på om jag kan förbättra något innan jag fortsätter med mera.

class Page {
	var $dtd;
	var $title;
	var $head;
	var $body;
	
	function __construct() {
        	$this->dtd = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">";
	}
	
	function setTitle($what){
		$this->title = $what;
	}
	
	function getTitle(){
		return $this->title;
	}
	
	function addTextInHead($data) {
        	$this->head[count($this->head)] = $data;
	}

	function eraseTextInHead($which) {
		if(!is_numeric($which) || (!isset($this->head[$which]))) {
			return;
		}
		unset($this->head[$which]);
	}

	function eraseAllTextInHead(){
		$this->head = "";
	}
	
	function getTextInHead($which) {
		if(!is_numeric($which) || (!isset($this->meta[$which]))) {
			return;
		}
		return  $this->meta[$which];
	}
	
	function getAllTextInHead(){
		$ret;
		foreach($this->head as $value){
			$ret = $ret . $value;
		}
		return $ret;
	}
	
	function __toString() {
		$ret = $this->dtd . "\n";
		$ret = $ret . "<html>\n";
		$ret = $ret . "<head>\n";
		if(isset($this->title)){
			$ret = $ret . "<title>" . $this->title . "</title>\n";
		}
		if(!empty($this->head)){
			foreach($this->head as $value){
				$ret = $ret . $value;
			}
			$ret = $ret . "\n";
		}
		$ret = $ret . "</head>\n";
		$ret = $ret . "<body>\n";
		$ret = $ret . $this->body . "\n";
		$ret = $ret . "</body>\n";
		$ret = $ret . "</html>\n";
		return $ret;
	}
}

class XPage {
	var $page;
	var $col1_text;
	var $col2_text;
	
	function __construct() {
		$this->page=new Page();
		date_default_timezone_set("Europe/Stockholm"); //så date funkten i updateBdy i Xpage inte får några varningar...
		$this->updateBody();
	}
	

	function addTextInCol1($text){
		if(empty($text)){
			return;
		}
		$this->col1_text[count($this->col1_text)] = $text;
		$this->updateBody();
	}

	function addTextInCol2($text){
		if($text == ""){
			return;
		}
		$this->col2_text[count($this->col2_text)] = $text;
		$this->updateBody();
	}
	
	function eraseTextInCol1($which){
		if(!is_numeric($which) || (!isset($this->col1_text[$which]))){
			return;
		}
		unset($this->col1_text[$which]);
	}
	
	function eraseTextInCol2($which){
		if(!is_numeric($which) || (!isset($this->col2_text[$which]))){
			return;
		}
		unset($this->col2_text[$which]);
	}

	function getCol1Text($which){
		if(!isset($this->col1_text[$which])){
			return;
		}
		return $this->col1_text[$which];
	}
	
	function getAllCol1Text(){
		$ret = "";
		foreach($this->col1_text as $value){
			$ret = $ret . $value;
		}
		return $ret;
	}
	
	function getCol2Text($which){
		if(!isset($this->col2_text[$which])){
			return;
		}
		return $this->col2_text[$which];
	}
	
	function getAllCol2Text(){
		$ret = "";
		foreach($this->col2_text as $value){
			$ret = $ret . $value;
		}
		return $ret;
	}
	
	function __toString() {
		return $this->page->__toString();
	}
	
	function updateBody(){
		$this->page->body = "<div id=\"header\">\n<h1>Welcome</h1>\n</div>\n";
		$this->page->body = $this->page->body . "<div id=\"wrapper\">\n";
		$this->page->body = $this->page->body . "<div class=\"coloum one\">\n";
		if(!empty($this->col1_text)){
			foreach($this->col1_text as $value){
				$this->page->body = $this->page->body . $value;
			}
		}
		$this->page->body = $this->page->body . "\n</div>\n";
		$this->page->body = $this->page->body . "<div class=\"coloum two\">\n";
		if(!empty($this->col2_text)){
			foreach($this->col2_text as $value){
				$this->page->body = $this->page->body . $value;
			}
		}
		$this->page->body = $this->page->body . "\n</div>\n";
		$this->page->body = $this->page->body ."</div>\n";
		$this->page->body = $this->page->body . "<div id=\"bottom\">\nCopyright &copy; " . date("Y",time()) . " " . $_SERVER["HTTP_HOST"];
	}
}

function str_exist_in($str,$exist){
	if(gettype($str) != "string" || gettype($exist) != "string"){
		return;
	}
	for($i=0;$i<strlen($str);$i++){
		if($str[$i] == $exist[0]){
			if($exist == substr($str,$i,strlen($exist))){
				return true;
			}
		}
	}
	return false;
}

function CssLink($in){
	return "<link type=\"text/css\" rel=\"stylesheet\" href=\"" . $in . "\" />";
}

function JavascriptLink($in){
	return "<script src=\"" . $in . "\" />";
}

Håller nämligen just nu på att försöka lära mig php och vill gärna lära mig programmera bra php kod i början innan det kommer som en vana liksom. Är jag på rätt väg fressten?

Fråga 2:
Vad är det för skillnad på att skriva:

var $something;

mot bara

$something;

Har nämligen inte riktigt fattat det :(

Mycket Tacksam för svar

Tack på förhand!

Medlem sedan mars 2004455 inlägg
#2

Vet inte någon svar på fråga 2 i alla fall?

Medlem sedan aug. 2004903 inlägg
#3

gissar på att du kan använda var för att deklarera en variabel... normalt sätt i andra programmerings språk deklarerar du variablen innan (eller i samma veva) du fyller den med saker..

exempelvis java

int enVariabel1;
String enVariabel2;
double enVariabel3;
boolean enVariabel4;

Antar att du kan göra samma sak i PHP. var borde stå för varchar, vilket man kan säga är motsvarigheten till String i javan.

Medlem sedan mars 2004455 inlägg
#4

Hejsan Tulork!
Jag kan använda var för att deklarera en variabel, men man kan också göra det utan. Men jag vet inte skillnaden om man deklarerar en variabel med var eller utan. Det enda jag vet hittills är att om man ska skapa en klass så måste alla variabler vara deklarerade med var i början i klassen, men jag fattar inte varför och det är just detta jag vill veta.

Medlem sedan aug. 2004903 inlägg
#5

Antagligen för att den måste veta vilken typ av data variablen ska innehålla.

(Jag gissar nu bara)

Medlem sedan mars 2004455 inlägg
#6

Men i php så bestäms variabelns typ av vad den tilldelas för värde.

Medlem sedan aug. 2004903 inlägg
#7

jupp... som sagt, är inte så insatt i just det.

Medlem sedan juni 20014 421 inlägg
#8

Tulork har helt fel. Var är en gammal kvarleva från php 4 och äldre tiden. var indikerar kort och gott att det är en variabel, jag tror att det alltid har varit valbart - men är inte helt säker. I php 5 är det deprecated och om det används i t.ex en klass så likställs det med public.

@Tulork, PHP är löst typat vilket innebär att oavsett hur du skapar variabeln kan du alltid byta det mot ett annat värde av annan typ, kalllat type juggling.
Du kan type casta i php, dock innebär det att du har ett värde och tvingar det till att bli t.ex en int. Det är dock inte helt säkert då det kan ske vissa oberäkneliga konverteringar, men vet man vad man gör så kan det vara trevligt att använda.
http://se.php.net/language.types.type-juggling

back to yador.
Koden du har skrivit är väl sådär, visserligen har du skapat en klass, men det känns inte som om du riktigt har greppat alla fördelar med OOP. Du har mest kapslat in dina funktioner i något som kan liknas vid ett namespace. När jag skriver projekt bruka jag utgå från att koden ska vara anpassad till det aktuella projektet, men väldigt enkel att återvinna. Jag hade alltså inte skrivit en klass för att bygga upp en sida. Jag hade skrivit ett klass-baserat templatesystem.
Istället för att fylla klassen med html så skriver jag templates i html och en enklare form av php, en template kan integreras i en annan template osv. Typ:

Källfilen products-add.php:

<?php
define("INCLUDED",true);
define( "ABSPATH" , dirname( __FILE__ ) . "/" ) ;

try {
		require_once("inc/php/general.php");
		require_once("inc/php/config.php");
		$tmpl=new Template();
		
	} catch (Exception $e) {
		die($e->getMessage());
	}

try {
	
		$tmpl->categories=CategoryHandler::getCategories($db,$langID);
		$tmpl->colors=ColorHandler::getColors($db,$langID);
		$tmpl->title="Add product";
		$tmpl->exec(TMPL);
		
} catch (Exception $e) {
		die($e->getMessage());
}
?>

TMPL i $tmpl->exec(TMPL); blir dynamiskt definad i config.php, där den tar namnet på den aktuella filen som användaren besöker, lägger till en sökväg till templated mappen och hämtar upp en fil med samma namn.

Templaten för products-add.php, heter alltså likadant men ligger i en annan mapp, ser ut såhär:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=UTF-8">
		<title><?= @$title ?></title>
	</head>
	<body>
		<form action="product-save.php" method="post" enctype="multipart/form-data">
		<? @->exec(TMPLDIR."product-form.php") ?>
		<? @->exec(TMPLDIR."list-categories.php") ?>
		<? @->exec(TMPLDIR."list-colors.php") ?>
		<input type="submit">
		</form>
	</body>
</html>

product-form.php ser ut såhär (projektet är inte helt klart, därav lite mageic-numbers i hidden-fält):

<h3>Information</h3>
<input type="hidden" name="show" value="1">
<input type="hidden" name="pub" value="1">
<input type="hidden" name="lang[]" value="1">
<label>Namn: <input type="text" name="title"></label>
<label>Art. Nr: <input type="text" name="art"></label>
<label>Price: <input type="text" name="price[]"></label>
<label>Bild: <input type="file" name="media"></label>

list-categories.php ser ut såhär:

<h3>Categories</h3>

	<select name="cat[]" multiple="multiple">
	<? foreach(@$categories as $category): ?>
		<option id="<?= $category["cID"]?>"><?= $category["title"]?></option>
	<? endforeach; ?>
	</select>

list-colors.php ser ut såhär:

<h3>Colors</h3>

	<select name="color[]">
	<? foreach(@$colors as $color): ?>
		<option id="<?= $color["cID"]?>"><?= $color["title"]?></option>
	<? endforeach; ?>
	</select>

När templatemotorn har parsat allt ser det ut såhär:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=UTF-8">
		<title>Add product</title>
	</head>
	<body>
		<form action="product-save.php" method="post" enctype="multipart/form-data">
		<h3>Information</h3>
<input type="hidden" name="show" value="1">
<input type="hidden" name="pub" value="1">
<input type="hidden" name="lang[]" value="1">
<label>Namn: <input type="text" name="title"></label>
<label>Art. Nr: <input type="text" name="art"></label>
<label>Price: <input type="text" name="price[]"></label>
<label>Bild: <input type="file" name="media"></label>
		<h3>Categories</h3>

	<select name="cat[]" multiple="multiple">
			<option id="4">Filidutter</option>
		</select>
		<h3>Colors</h3>

	<select name="color[]">
			<option id="1">Vit</option>
			<option id="2">Svart</option>
			<option id="3">Röd</option>
		</select>
		<input type="submit">
		</form>
	</body>
</html>

Min @-syntax kke ser lite konstig ut, i själva verket byts det ut mot en referens till template-objektet när template-motorn parsear templaten. (Det blev mycket template där). Men hänger du med på vad jag menar? Istället för att bygga en specifik pageklass kan du kke bygga en motor som kan tolka en template och generera en sida åt dig. Jag använder mig även av __autoload() i php för att själv slippa inkludera alla class-filer jag behöver, utan detta sköter php åt mig.

Du borde ta en titt på sidan för oop i php5 också:
http://se.php.net/manual/en/language.oop5.php

Medlem sedan aug. 2004903 inlägg
#9

Tack för upplysningen colione :)

Har blivit utsatt för så många programmeringsspråk de senaste åren (C, Perl, Java, ASP.NET, PHP, Assembler)... har blivit lite svårt att isär dem, så jag skrev vad jag trodde det va... Men du förstår hur jag kom till min slutsats väl? Alltså att det va en deklaration av datatypen på variablen och vad den ska innehålla.

Medlem sedan juni 20014 421 inlägg
#10

Ja.

Medlem sedan mars 2004455 inlägg
#11

Jag tror jag förstår vad du menar, nu när jag har läst igenom hela oop avsnittet på den länken du gav mig. Men om man gör på det sättet så kommer det väl att bildas väldigt många filer och riskeras det inte då att hela webbsidan blir slö? Att läsa in en fil på adress X som sedan i sin tur behöver läsa in en fil på adress Y som sedan i sin tur igen behöver läsa in en fil på adress Z känns som att det kommer ta massa extra tid och kanske belasta servern extra mycket om det är väldigt många som besöker sidan, eller det stämmer inte?

STORT TACK ANNARS colione :)

Medlem sedan juni 20014 421 inlägg
#12

Nja, vid extrem belastning finns det självklart risk för det. Men har du den trafiken så att det skulle märkas av, är det nog dags att uppgradera sig ändå, då det antagligen finns fler flaskhalsar. Jag tycker att den lilla overhead som skapas vid inläsning är väl värt det mot att det blir väldigt mycket enklare att jobba. Du har ju dessutom ett antal minnes- och processintensiva strängkonkateneringar. Hur man än löser det blir det overhead nånstans, det gäller bara att överväga vart man vill ha den och vad det ger tillbaka i minskad arbetsbörda.

Medlem sedan mars 2004455 inlägg
#13

okej, men det är lugnt för min del. Ska försöka programmera som du har visat mig. Jag återkommer om jag får problem.

Tack för hjälpen.

Medlem sedan okt. 20001 285 inlägg
#14

sorry.. men.. $tmpl->exec(TMPL); :l exec.. den kör igång den template classen med den constanten bara ? har inte fått allt klart hur du gör Colione :r

$file = basename($_SERVER['SCRIPT_FILENAME']);
define('TMPL', './templates/'.$file);

267 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)