Ik heb net een simpel script in OO geschreven..
zouden jullie een mening of suggestie kunnen geven?


<?php	

class getFiles{

	private $folder;
	private $extension;
	private $retType;
	public  $files = array();

	function __construct($folder, $extension, $retType){
		if( !empty($folder) && !empty($extension) && !empty($retType) ){
			$this->folder = $folder;
			$this->extension = $extension;
			$this->retType = $retType;
		}	
		 else
		{
			die(' <font color="#FF0000"> One or more constructor arguments are missing! </font> ');
		}
	}

	function returnFiles(){
		if( $dir = @opendir($this->folder) ){
			while( FALSE !== ($file = readdir($dir)) ){
			$getFile = $this->folder . '/' . $file;
			$getExtention = pathinfo($getFile);
			$getExtention['extension'] = !empty($getExtention['extension']) ? $getExtention['extension'] : '';
				if( $getExtention['extension'] == $this->extension ){
					$this->files[] = $file;
				}
			} closedir( $dir );
		} 
		if( count($this->files) != NULL ){
			return $this->files;
		}
		 else
		{
			die(' <font color="#FF0000"> Ooops! something must have gone wrong! make sure that you selected the right path and or extension ( '. $this->folder .' => '. $this->extension .' ) </font> ');
        }		
	}
	
	function __destruct(){
		// print('X_x');
	}
	
}

$obj = new getFiles('public_html/public_html','php','1');

?>
je bent goed opweg, al zitten er wel wat rare toepassingen in...
een kleine opsomming:
- die()... door een fout in deze klasse zou je je hele applicatie dood gooien? dat lijkt me iets te grof.
- je klasse naam klinkt als een functie... ik gebruik altijd een hoofdletter voor mijn klasse namen... Files zou dus toepasselijker zijn.
- de functie returnFiles heeft geen verwachtbaar resultaat...deze returned of een array of helemaal niks?... dat is ook best slordig en zeer ongebruikelijk in het OO programmeren.
- en waarom is je files attribute public? je wilt toch niet dat deze zomaar beinvloedt kan worden?

Tot zover even mijn eerste indruk/kritiek.
Maar ga vooral door met proberen... je bent goed opweg:)
heb de code aangepast, is het zo beter?


<?php

class getFiles{

	private $folder;
	private $extension;
	private $files = array();

	function __construct($folder, $extension){	
		
		if( !empty($folder) && !empty($extension) ){
			$this->folder = $folder;
			$this->extension = $extension;
		}
		
	}

	function returnFiles(){
		
		if( $dir = @opendir($this->folder) && $constructorError != TRUE){
			while( FALSE !== ($file = readdir($dir)) ){
			
			 $getFile = $this->folder . '/' . $file;
			 $getExtention = pathinfo($getFile);
			 $getExtention['extension'] = !empty($getExtention['extension']) ? $getExtention['extension'] : NULL;
				
				if( $getExtention['extension'] == $this->extension ){
					$this->files[] =  $this->folder . '/' . $file;
				}
			} closedir( $dir );
		} 
		
		if( count($this->files) != NULL ){
			return $this->files;
		}
		 else
		{
			return (' <font color="#FF0000"> Ooops! something must have gone wrong! make sure that you selected the right path and or extension! </font> ');
        }		
	}	
	
	function __destruct(){
		// print('X_x');
	}
	
}

?>

<?php
       if( !empty($folder) && !empty($extension) && !empty($retType) ){
            $this->folder = $folder;
            $this->extension = $extension;
            $this->retType = $retType;
        }    
         else
        {
            throw new Exception('Er is een fout opgetreden met de constructor.');
        }
?>

als je iets gooit moet je het ook weer opvangen:


<?php
    try {
        $var = new getFiles();
    }
    catch (Exception $e)
    {
        echo $e;
    }
?>


dit zal dus een foutmelding teruggeven die jij gemaakt hebt.

verdere tip: gebruik geen html in een class. Ik bepaal zelf wel hoe ik het op het scherm wil hebben staan. (oftewel: een class zou je in principe op elke site weer opnieuw aan kunnen roepen zonder hem te wijzigen)
Je kunt het ongeveer zo doen. Ik heb nu voor getFiles() en buildFileList() 2 aparte functies, omdat je dan meerdere malen de bestanden kan ophalen met getFiles() zonder dat hij steeds opnieuw de directory hoeft te doorlopen. Ook kun je met de getters en setters waarden ophalen en opnieuw setten om bijvoorbeeld opnieuw de lijst op te bouwen met een andere directory. Het kan ook op een heel andere manier dan ik nu heb gedaan (het is maar wat je doel is), maar de manier hoe ik Exceptions gebruik is wel aan te raden.

<?php

class FileException extends Exception { }

class File
{
private $folder;
private $extension;
private $files;

public function __construct($folder, $extension)
{
if (empty($folder)) {
throw new FileException('Geen folder meegegeven in ' . __CLASS__ . '-constructor');
}

if (empty($extension)) {
throw new FileException('Geen extensie meegegeven in ' . __CLASS__ . '-constructor');
}

$this->folder = $folder;
$this->extension = $extension;
}

public function buildFileList()
{
$dir = @opendir($this->folder);

if (!$dir) {
throw new FileException('Openen van directory mislukt in ' __CLASS__);
}

$this->files = array();

// while (blahblah) { $this->files[] = $file } etc

// geen return nodig
}

public function getFiles()
{
if (empty($this->files)) {
$this->buildFilesList();
}

return $this->files;
}

public function getFolder()
{
return $this->folder;
}

public function getExtension()
{
return $this->extension;
}

public function setFolder($folder)
{
$this->folder = $folder;
}

public function setExtension($extension)
{
$this->extension = $extension;
}
}

try {
$oFile = new File('phphulp', 'jpg');
$aLijst = $oFile->getFiles();

if (empty($aLijst)) {
echo 'Geen bestanden gevonden';
} else {
foreach ($aLijst as $file) {
echo $file . '<br />';
}
}
} catch (FileException $e) {
echo 'Er is iets misgegaan: <br />';
echo $e->getMessage();
/* deze laatste echo kun je misschien beter anders doen, omdat je niet wil
dat uiteindelijke bezoekers een gedetailleerde error-melding krijgen */
}

?>

Reageren