Gå til innhold

[Løst] Omgjør til ObjektOrientert Programmering?


Anbefalte innlegg

Jeg har en kodebit jeg er lei av å kopiere opp et par hundre ganger i en SWITCH, så jeg ønsker å bruke OOP (Object Oriented Programming) for å gjør det om til en CLASS eller METHOD slik at jeg kan sende inn noen variabler og få ut et sett med verdier i en array som kan brukes i en FOREACH.

 

(endel av koden er litt rotete da jeg fortsatt jobber med den og har ikke "pyntet den til")

 

Kodebit:

<?php

//Parametere for MySQL query
$fieldname 		= "kategori"; //Navnet på feltet som skal søkes i (Kategori/underkategori)
$fieldparameter         = ""; //Parameteren man skal søke 
$dbtable 		="produkter"; //navnet på tabellen i databasen
$orderparameter         = "id"; //navnet på feltet som skal sorteres etter
$orderby 		= " ORDER BY ".$dbtable.".".$orderparameter.""; //MySQL komando for sortering; HUSK: Mellomrom først, og evt ' DESC' for å gå fra høyest til lavest

function db_connect()
{
	$connection = mysql_pconnect('mysql5.uniweb.no', '#####', '#####');
	if(!$connection)
	{
		return false;
	}	

	if(!mysql_select_db('frankhau'))
	{
		return false;
	}
	return $connection;
}

//display lines located using array
function db_result_to_array($result)
{
	$res_array = array();
	for ($count=0; $row = mysql_fetch_array($result); $count++)
	{
		$res_array[$count] = $row;
	}
	return $res_array;
}

//locate the product information
function find_products()
{
	db_connect();
	$query = "SELECT * FROM produkter WHERE kategori='ringer'"; //TODO: gjør om statiske verdier til variabler
	$result = mysql_query($query);
	echo mysql_error();
	$result = db_result_to_array($result);
	return $result;
}		

//call function
$products = find_products();

//display result
foreach($products as $product)
{
	$javascript = "location.href='index.php?produkt=".$product['id']."'";
	echo 
	//html code for a product row to be echoed out
	'
	<div class="element" onclick="'.$javascript.'">
		<a class"link" href="index.php?produkt='.$product['id'].'"><img src="images/productimg/'.$product['id'].'_small.jpg" /></a>
		<font>#'.$product['id'].' - '.$product['navn'].'</font><br />
		<font>'.$product['pris'].',-</font>
	</div>
	';
}
?>

 

Det jeg vil er at jeg kan fortsatt bruke FOREACH loop-en jeg har nederst i koden sånn at jeg kan forandre parameterene som går inn i MySQL query-en i forskjellige CASE-er i en SWITCH. Det beste vil være å gjør dette i samme fila om mulig. Dette vil gjør min jobbe 10 ganger lettere da jeg jobber med 20-30 CASE-er alle skal kontakte databasen for å hente ut data. OG det er en ypperlig anledning til å lære noe nytt.

 

Noen som kunne tenke seg å demonstrere hvordan jeg kan løse dette? jeg fant ikke noe bra som beskrev dette med OOP i PHP godt nok.

 

Takk på forhånd for hjelp!

 

-frank

Lenke til kommentar
Videoannonse
Annonse

*blinks* oh jeez..

 

Hvorfor definerer du generiske funksjoner.. hvorfor definerer du funksjoner i det hele tatt inni en switch blokk?

 

Forresten, tror det hadde vært greiere å brukt en array for slikt:

 

$arr['case1'] = array("param1", "param2", "param3");
$arr['case2'] = array("param1x", "param2x", "param3x");

function doMagicStuff($blargh) {
list($param1, $param2, $param3) = $blargh;
// insert magic stuff here
}

if (isset($arr[$val])) {
 doMagicStuff($arr[$val]);
} else {
die("OMG HAX");
}

 

Note: vært en stund siden jeg kodet PHP, så kan ikke garantere at koden ikke har syntax feil

Lenke til kommentar

*blinks* oh jeez..

 

Hvorfor definerer du generiske funksjoner.. hvorfor definerer du funksjoner i det hele tatt inni en switch blokk?

 

Forresten, tror det hadde vært greiere å brukt en array for slikt:

 

$arr['case1'] = array("param1", "param2", "param3");
$arr['case2'] = array("param1x", "param2x", "param3x");

function doMagicStuff($blargh) {
list($param1, $param2, $param3) = $blargh;
// insert magic stuff here
}

if (isset($arr[$val])) {
 doMagicStuff($arr[$val]);
} else {
die("OMG HAX");
}

 

Note: vært en stund siden jeg kodet PHP, så kan ikke garantere at koden ikke har syntax feil

Vel jeg definerer funksjoner inni en SWITCH block fordi det er det mest hensigtsmessige i denne sammenhengen, (SWITCH-en er de forskjellige listene man får opp fra en produktkatalog).

 

Og din måte er kurrant men er bare en annerledes måte å gjør det på, som ikke er helt kopatibelt med andre elementer, tro meg jeg, liker ikke SWITCH men i mitt tilfelle er jeg nesten helt avhengig av den, ergo mitt ønske om å få rullet inn mine MySQL funksjoner i en CLASS jeg kan kalle på for å øke leslighet og gjør redigering enklere.

 

men takk for forslaget! ;)

Lenke til kommentar

<?php

class Method {

	private static $navn;

	/** Kode i en funksjon **/
	public static function Funksjon($var) {
		self::$navn = $var;
		echo 'Hei, ' . self::$navn . '!';
	}

}

$var = 'case2';

switch($var) {

	case 'case1':
		Method::Funksjon('Ola'/** verdier for case 1 **/);
	break;

	case 'case2':
		Method::Funksjon('Per'/** verdier for case 2 **/);
	break;

}

?>

 

Noe slikt? Du har kun hoved-koden din en plass, og erstatter verdier i den i de forskjellige case'ene slik at du kan oppnå forskjellig funksjonalitet..

Lenke til kommentar

function db_connect()
       {
               $connection = mysql_pconnect('mysql5.uniweb.no', '#####', '#####');
               if(!$connection)
               {
                       return false;
               }       

               if(!mysql_select_db('frankhau'))
               {
                       return false;
               }
               return $connection;
       }

function db_result_to_array($result)
       {
               $res_array = array();
               for ($count=0; $row = mysql_fetch_array($result); $count++)
               {
                       $res_array[$count] = $row;
               }
               return $res_array;
       }

 

Kan ikke se noen god grunn til at du må definere noen funksjoner inni en switch, men denne ser jeg virkelig absolutt ingen grunn i det hele tatt å ha inni switchen..

 

db_result_to_array kan forresten lett kastes vekk. Og bytte ut foreach blokken med

 

while ($product = mysql_fetch_array($result, MYSQL_ASSOC)) {
 // foreach koden her.. Som burde være i en funksjon definert utenfor SWITCH'en, ikke copypasted.
}

 

og find_products() kan fint endres til find_products($sql) - og flyttes ut av CASE'n. Even better, find_products($table, $category) eller find_products($table, $field, $value)

 

Det du da sitter igjen med inni case'n er :

 

$products = find_products("produkter", "kategori", "ringer");

while ($product = mysql_fetch_array($result, MYSQL_ASSOC)) {
 display_product($product);
}

 

Som du igjen kan putte i en funksjon, så du har igjen

display_products("produkter", "kategori", "ringer");

Endret av Terrasque
Lenke til kommentar

Generelt sett:

1. Finn ut alle ulike verdier for hver case.

2. Finn ut hvilke av de verdiene som kan hentes / lages fra andre verdier.

3. Lag funksjon(er) som utfører riktig logikk med de verdiene.

 

Det er forsåvidt det samme som man trenger å gjøre for å putte logikken inn i en class.

 

Du sier at det er grunner for at det må være slik, uten at noe av koden du viser har noen grunn til det. Så enten tar du feil, eller så har du gitt mangelfull informasjon :) Vanskelig å si hvilken, men siden vi bare har den informasjonen du har gitt å jobbe med, så må vi gi svar utifra det.

Lenke til kommentar

<?php

class Method {

	private static $navn;

	/** Kode i en funksjon **/
	public static function Funksjon($var) {
		self::$navn = $var;
		echo 'Hei, ' . self::$navn . '!';
	}

}

$var = 'case2';

switch($var) {

	case 'case1':
		Method::Funksjon('Ola'/** verdier for case 1 **/);
	break;

	case 'case2':
		Method::Funksjon('Per'/** verdier for case 2 **/);
	break;

}

?>

 

Noe slikt? Du har kun hoved-koden din en plass, og erstatter verdier i den i de forskjellige case'ene slik at du kan oppnå forskjellig funksjonalitet..

YEAHY!! en som viser løsningen istede for å kritisere metodikken min :p

 

Dette var mer eller mindre hva jeg så etter!

 

Takk Thomas!

Lenke til kommentar

Klasser er ikke magiske, vettu. Hvis du ikke klarer å splitte det ut i funksjoner definert utenfor CASE'n, så klarer du ikke splitte det ut i en class heller.

 

Eneste class gjør er å gjøre det lettere å splitte logikken i mindre biter, og å passe rundt data imellom logikk-blokkene (og resulterer som oftest i en mer logisk struktur).

Lenke til kommentar

Klasser er ikke magiske, vettu. Hvis du ikke klarer å splitte det ut i funksjoner definert utenfor CASE'n, så klarer du ikke splitte det ut i en class heller.

 

Enig der :) Du trenger ikke klasser i tilfellet ditt frankhaugen. Holder med en vanlig funksjon :)

Men vis du heller vil prøve deg med klasser, så kjør på med det.

Lenke til kommentar

Klasser er ikke magiske, vettu. Hvis du ikke klarer å splitte det ut i funksjoner definert utenfor CASE'n, så klarer du ikke splitte det ut i en class heller.

 

Eneste class gjør er å gjøre det lettere å splitte logikken i mindre biter, og å passe rundt data imellom logikk-blokkene (og resulterer som oftest i en mer logisk struktur).

Poeng, men jeg må ta det bit for bit, desverre kan ikke ikke gi deg en "braindump" så du kan se logikken for å gjøre det slik, og din metodikk er et halvt lysår forann mitt nivå, for hadde jeg vært på ditt nivå hadde jeg ikke trengt å spørre ;) , litt av det som er forvirrende som bar juling er hvordan det er 3-6 forskjellige måte å få samme resultat på, og jeg vil helst holde meg til det jeg kan før jeg svømmer i ny lære, og når jeg svømmer i ny lære vil jeg helst at dette er en dam og ikke et hav (jeg torturerte den metaforen gitt). Takk for innsatsen og jeg må ta meg tid til å gå igjennom dine forslag fordi de virker fornuftige men vil først forstå de i sitt fulle før jeg implementerer de.

 

-frank

Lenke til kommentar

Sant det, forståelse er det viktigste :)

 

Kanskje god grunn til å vente litt med klasser foreløpig. Jeg tror ikke det er noe behov for klasser i den koden der, og tror det vil forvirre mer enn hjelpe i øyeblikket.

 

I øyeblikket tror jeg du bør refactore kode vekk fra case delene og ut i generelle funksjoner. Og ikke bare prøv ting til de funker, forstå hvorfor det funker (og om det ikke funker slik du forventet, finn ut hvorfor ikke).

 

Edit : http://en.wikipedia.org/wiki/Code_refactoring && http://en.wikipedia.org/wiki/Code_smell :D

Endret av Terrasque
Lenke til kommentar

Gjorde som dere sa, (for det meste), la hele driten inn i en funksjon, så for alle variablene jeg ville ha inn i sql query-en ditsjet jeg alt og brukte en query som parameter når jeg kaller funksjonen, (lettere siden det var nesten like mange variabler som ord i querien :p)

 

Frank er nå en happy liten gutt, og kan endelig gå videre til å takle flerdimensjonale arrays :p (bare vent jeg kommer nok med en post når jeg står fast og hodet vil dø litt)

 

takk for hjelpen gutta!

 

-frank

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...