Gå til innhold

Problem med klasser og inkludering av filer


Anbefalte innlegg

Jeg har nettopp begynt med OOP i PHP å sitter nå med et problem jeg håper dere kan hjelpe meg med. Skal prøve å forklare det så bra som mulig.

 

De aktuelle klassene er: Userfunctions og SystemDAO

 

helt øverst på hovedsiden min (index.php) kjører jeg disse linjene:

 

<?php 
require_once("cms/classes/userfunctions.php");
require_once("cms/classes/systemDAO.php");

$userfunctions = new Userfunctions($database);
$system = new SystemDOA(); 

$errormsg = ''; //
?>

 

 

Der jeg skal inkludere innholdet på sidene har jeg denne funksjonen:

 

 <?php $system->inclusion(); ?>

inclusion(), som ligger i cms/classes/systemDAO.php ser slik ut:

 

public function inclusion($dir = './pages/', $suffix = '.php', $defaultpage = 'hjem', $includeparameter = 'side'){
	$ex = array('.', '..'); // filer som skal strippes

	// Hvis paramter $dir er en mappe og det går an å lese fra den, lag en array med listen over alle filer.
	if (is_dir($dir) && $dh = opendir($dir)) {
		while (($file = readdir($dh)) !== false) {
			if(in_array($file, $ex)) {continue;}
				$allowed_files[] = $file;
		}	
		closedir($dh);
	}

	// Få directory fra bruker.
	$include = $_GET[$includeparameter];

	// Strippe potensielle farer.
	$include = str_replace(array('..', '//', 'ftp'), '', $include);
	$include = strtolower($include);

	if (in_array($include . $suffix, $allowed_files)){
		include($dir . $include . $suffix);
	}

	// Filen som ble forespurt av bruker finnes ikke i arrayet.
	// Hvis brukeren i det heletatt har skrevet inn en side for å inkludere.
	else {
		if($_GET[$includeparameter]){
			// Hvis brukeren har blitt videresendt, e.g. trykt på en link
			if($_SERVER['HTTP_REFERER']){
				include($dir . '404' . $suffix);
			}
			else {
				// Hvis brukeren har skrevet inn adressen manuelt.
				include($dir . '404' . $suffix);
			}
		}
		else {
			// Hvis brukeren ikke har skrevet inn adresse / trykt på lenken, og filen ikke finnes i array. E.g. startsiden.
			include($dir . $defaultpage . $suffix);
		}

	} 
} // end function

(Takk til dabear for denne koden.)

Kort fortalt, så inkluderer denne sider som ligger i ./pages/

 

 

Jeg har så en side i /pages som inkluderer cms/user_registration.php om man trykker på registreringsknappen. Over skjermaet på denne siden kjører jeg også denne linjen:

 

<?php echo $userfunctions->show_errormessage(); ?>

 

i cms/user_registration.php har jeg

$userfunctions->set_errormessage('Du skrev ikke inn teksten i sikkerhetssjekkboksen riktig.');

om f.eks. ikke teksten i bildet ble skrevet riktig.

 

Problemet mitt er at når jeg går inn på registreringssiden får jeg denne feilmeldingen:

Fatal error: Call to a member function show_errormessage() on a non-object in F:\Websider\HW07\pages\registrer.php on line 24

 

Hvis jeg bytter ut $system->inclusion(); med include "pages/registrer.php"; får jeg ikke denne feilen.

 

Hva er det jeg ikke har forstått? Sitter pris på all hjelp jeg kan få.

 

- Christopher

Lenke til kommentar
Videoannonse
Annonse

Dette har med scope å gjøre. Når du inkluderer filen i en funksjon vil den få tilgang til de samme variablene all annen kode i den funksjonen har tilgang til, og variabler den lager vil leve like lenge som alle andre variabler i den funksjonen.

 

Skal du programmere OOP, så inkluderer du som oftest kun filer med klasse definisjoner, så dette er ikke et problem da disse blir globale definisjoner, samme som funksjonsdefinisjoner.

 

Du kan bruke inklude metoden din mer som et view, ved å gi den variabler og så hente ut html og variabler etterpå. Men det beste er kanskje å returnere en streng med filen som skal inkluderes.

Lenke til kommentar
Du kan bruke inklude metoden din mer som et view, ved å gi den variabler og så hente ut html og variabler etterpå. Men det beste er kanskje å returnere en streng med filen som skal inkluderes.

 

Takk for svaret! Forstår det du skrev i første avsnitt, men resten var litt forvirrende :\ Hva er et view? Hadde du giddet å gidd et kort eksempel på hva du tenker? :)

Lenke til kommentar
Takk for svaret! Forstår det du skrev i første avsnitt, men resten var litt forvirrende :\ Hva er et view? Hadde du giddet å gidd et kort eksempel på hva du tenker? :)

View er en del av MVC (Model, View, Controller). Model er den delen som står for processeringen av data og logikk. View er den delen som lager det som skal vises. Controller er den som laster inn modeller og views som trengs.

 

Generelt forklart om view i PHP: en funksjon eller klasse der du angir hvilke variabler som skal være tilgjengelig for koden, deretter med output buffering så inkluderer du en fil med php i html kode som oftest, men ren php eller html i php kan også brukes. Deretter returnerer du bufferet som en streng eller legger det til en layout. Du kan også returnere variabler med referanse på array hvis funksjon, eller lagre dem i klassen.

Lenke til kommentar

Tror jeg fikk det til nå. Vet ikke om jeg gjorde det helt som du sa, men det jeg gjorde var å sitte

 

private $included_file;

public function inclusion(...){
$this->included_file = $dir . $defaultpage . $suffix;
.
.
.
return $this->included_file;
}

 

i SystemDAO-klassen, deretter inkluderte jeg pathen i index.php med

 

<?php include $system->inclusion(); ?>

 

Det ser ut som det fungerer så langt i hvertfall :p

 

Tusen takk for hjelpen!

 

 

btw.. Det virker du som har veldig god peiling på php. Kanskje du kan hjelpe meg med det jeg spørr om HER (siste post)? :)

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...