array in functie aanmaken -> buiten functie openen

Status
Niet open voor verdere reacties.

pankmeister

Gebruiker
Lid geworden
15 jul 2008
Berichten
106
Ik heb een script gemaakt om afbeeldingen te openen die in een map staan:

<?php
$foto[0] = "";
function leesdir($dir){
//eerst controleren als de map wel degelijk bestaat
if(checkmap($dir) == "ok"){
if($handle = opendir('fotoz/'.$dir)){
$aantal=0;
while(false !== ($file = readdir($handle))){
if(strtolower(substr($file, -3)) == "jpg"){
$foto[$aantal] = $file;
$aantal++;
}//end if
}//end while
return $aantal;
}//end if handle
}else{
echo "Map niet gevonden";
}
}

print_r($foto);
?>

Nu wou ik dat mijn array, waar mijn fotos inzitten, buiten de functie gebruikt kunnen worden. Echter bij mijn print_r commando zie ik alleen de lege waarde wat bovenaan gedefineerd staat in de array staan. Wat doe ik verkeerd? :confused:
 
Ik heb nog wat geprobeerd en ben nu tot volgend werkend resultaat gekomen:

<?php
class leesdir{
public function __construct($dir){
//eerst controleren als de map wel degelijk bestaat
if(checkmap($dir) == "ok"){
if($handle = opendir('fotoz/'.$dir)){
$aantal=0;
while(false !== ($file = readdir($handle))){
if(strtolower(substr($file, -3)) == "jpg"){
$this->foto[$aantal] = $file;
$aantal++;
}//end if
}//end while
$this->aantal[1] = $aantal;
}//end if handle
}else{
echo "ERR 01: Map niet gevonden";
}
}
}

$test = new leesdir('02');
echo $test->foto[3]; //hier zitten de fotos in
$aantal = $test->aantal[1]; //hier zit het aantal in
echo "<br />";
echo "aantal fotos: ".$aantal;
?>

Als iemand een methode weet hoe het beter kan, verbeter mij gerust, want ik ken niet zo veel van OO
 
Netter is om de class apart te laten.
Vervolgens een functie maken welke de array ophaalt en dan kun je er wat mee gaan doen.

Je gebruikt echter een functie welke niet in deze regels wordt gedefineerd. Het gaat om de functie checkmap(), ik vermoedt dat het net zoiets moet zijn als is_dir()

Daarnaast is de functie __construct meer bedoelt om eventuele variabelen te defineren, niet om al je code in uit te laten voeren.

PHP:
<?php

class leesDir {
  var $directory = '';
  var $resultArray = array();

  private function __construct($dir) {
    $this->directory = $dir;
    $this->readDir();
  }

  public function readDir() {
    if($handle = opendir('fotoz/'.$this->dir)){
      while(false !== ($file = readdir($handle))){
        if(strtolower(substr($file, -3)) == "jpg"){
          $this->resultArray[] = $file;
        }//end if
      }//end while
    }//end if handle
  }

  public function getResult() {
    return $this->resultArray;
  }

  public function getNumResult() {
    return count($this->resultArray);
  }

  public function setDirectory($dir) {
    $this->directory = $dir;
  }
}

$test = new leesDir('02');
print_r($test->getResult());
echo 'Aantal: '. $test->getNumResult();
?>
Ben zelf ook niet zo fanatiek met OO maar begint steeds meer te komen.
 
Laatst bewerkt:
var = PHP4

Gebruik public of private.

De functie setDirectory die je nu hebt is volkomen nutteloos, want je set de directory bij het instantiëren van de class.
 
Vond het ook al vreemd dat wanneer ik private var $var deed dat ik een foutmelding kreeg. Nu weet ik voldoende :)

De functie is niet nutteloos, alleen in het huidige voorbeeld.

Dit lijkt mij wat beter toegepast
PHP:
<?php

class leesDir {
  private $directory = '';
  private $resultArray = array();

  private function __construct($dir) {
    $this->directory = $dir;
  }

  public function readDir() {
    if($handle = opendir('fotoz/'.$this->dir)){
      while(false !== ($file = readdir($handle))){
        if(strtolower(substr($file, -3)) == "jpg"){
          $this->resultArray[] = $file;
        }//end if
      }//end while
    }//end if handle
  }

  public function getResult() {
    return $this->resultArray;
  }

  public function getNumResult() {
    return count($this->resultArray);
  }

  public function setDirectory($dir) {
    $this->directory = $dir;
    $this->resultArray = array();
  }
}

$test = new leesDir('02');
$test->readDir();
print_r($test->getResult());
echo 'Aantal: '. $test->getNumResult();
$test->setDirectorty('01');
$test->readDir();
print_r($test->getResult());
echo 'Aantal: '. $test->getNumResult();

?>
Eigenlijk zou je de constructor ook weg kunnen laten dan zou het begin zo zijn
PHP:
$test = new leesDir();
$test->setDirectory('02');
$test->readDir();
//etc
 
$this->resultarray = array() bij setDirectory is onzin, dat doe je onder je klassedefinitie zoals je al hebt gedaan. Dat moet je dus weglaten bij setDirectory.

Bij kleine classes zou je gewoon de dir mee kunnen geven in de __construct.

Oftewel:

class readdir{

private $aResult;
private $sDir;

public function __construct($sDir){}

private function readDir(){}

public function getResult(){}

public function getNumResults(){}

}
 
Waarom is het leegmaken van de resultArray onzin?
De eerste keer wellicht wel, maar dan zou jer er een IF-structuur om heen kunnen zetten (if($this->getNumResult() > 0) {)

Bij het setten van een nieuwe directory lijkt het mij zinvol om de resultArray van de vorige directory leeg te maken. Anders heb je die er ook nog bij in zitten.

Wellicht liggen onze ideeën over het gebruik anders, ik probeer hem herbruikbaar te maken. Ik vermoedt dat jij voor de eenmalige toepassing gaat.
 
Ah, op die fiets.

readdir() wordt steeds aangesproken als je een nieuwe map wilt laten evalueren.

Oftewel: bij readdir() moet je de array leegmaken, niet in een setter, die heeft daar namelijk niets mee te maken.
 
Goed punt :)

Dan wordt hij zo:
PHP:
<?php

class leesDir {
  private $directory = '';
  private $resultArray = array();

  private function __construct($dir) {
    $this->directory = $dir;
  }

  public function readDir() {
    if($this->getNumResult() > 0) {
      $this->resultArray = array();
    }

    if($handle = opendir('fotoz/'.$this->dir)){
      while(false !== ($file = readdir($handle))){
        if(strtolower(substr($file, -3)) == "jpg"){
          $this->resultArray[] = $file;
        }//end if
      }//end while
    }//end if handle
  }

  public function getResult() {
    return $this->resultArray;
  }

  public function getNumResult() {
    return count($this->resultArray);
  }

  public function setDirectory($dir) {
    $this->directory = $dir;
  }
}

$test = new leesDir('02');
$test->readDir();
print_r($test->getResult());
echo 'Aantal: '. $test->getNumResult();
$test->setDirectorty('01');
$test->readDir();
print_r($test->getResult());
echo 'Aantal: '. $test->getNumResult();

?>
N'est pas?
 
Voor dit gebruik zou je dan wel de __construct weg moeten laten, dat heeft dan geen functie meer. Verder ziet het er redelijk uit. Het dekt in ieder geval de lading, maar is natuurlijk allesbehalve flexibel.
 
Waarom moet de
PHP:
private $directory = '';
bovenaan staan? Deze wordt toch automatisch aangemaakt in de setter?
PHP:
public function setDirectory($dir) {
    $this->directory = $dir;
  }

EDIT ook heb ik nog een vraagje over de setter:
PHP:
$test = new leesDir('02'); //nieuw object aanmaken
$test->readDir(); //functies oproepen
//...
$test->setDirectory('01'); //<-- waarom moet hier een setter en niet gewoon $test = new leesDir('01'); ?
$test->readDir();
//..
 
Laatst bewerkt:
Bovenin declareer ik de klasse-variabelen.

Het had ook
PHP:
private $directory = null;
kunnen zijn, maar ik heb voor de quotes gekozen om aan te geven dat er een string in komt. (Je zou ook type-casting kunnen toepassen)

In de setter geef ik vervolgens een waarde aan die klasse-variabele.
 
Bovenin declareer ik de klasse-variabelen.

Het had ook
PHP:
private $directory = null;
kunnen zijn, maar ik heb voor de quotes gekozen om aan te geven dat er een string in komt. (Je zou ook type-casting kunnen toepassen)

In de setter geef ik vervolgens een waarde aan die klasse-variabele.

Maar wat ik bedoel, het is toch niet verplicht om die daar al aan te maken? Vermits de functie ervoor zorgt dat de klasse methode word aangemaakt? Of zie ik het verkeerd, en moet elke klasse variabele op voorhand gedefineerd worden?
 
Die moet worden gedefineerd.

Laat je hem weg dan krijg je een foutmelding dat de variabele $this->directory niet bestaat binnen de klasse.
 
Die moet worden gedefineerd.

Laat je hem weg dan krijg je een foutmelding dat de variabele $this->directory niet bestaat binnen de klasse.

Ik had uitgetest wat je zei:
PHP:
class test{
	public function functie(){
		return $this->variabele = "test variabele";
	}
}

$test = new test();
echo $test->functie();

Hier krijg ik gewoon de inhoud "test variabele" terug, zonder op voorhand iets te moeten defenieren.

PHP:
class test{
	private $variabele = ' ';
	
	public function functie(){
		$this->variabele = "test variabele";
	}
	public function getFunctie(){
		return $this->variabele;
	}
}

$test = new test();
echo $test->getFunctie();

Hier heb ik dus de variabele eerst gedefineerd, en heb ik een getter gemaakt voor de waarde te returnen (omdat ik denk dat dit de bedoeling is, en niet rechtstreeks de waarde uit de functie te returnen).
Hier doet ie echter niets, ik krijg geen waarde terug.
 
Duh, je set 'm niet, nu krijg je gewoon ' ' terug.

Verder is dit, met alle respect, een beetje gepruts en moet je je gewoon houden aan de OOP-standaarden, of PHP daar nou vanaf wijkt of niet. Het is niet voor niets allemaal ooit eens zo bedacht.

PHP:
class Test{

  private $x = 'y';

  public function getX(){

     return $this->x;

  }

  public function setX($x){

    $this->x = $x;

  }
}


$oClass = new Test;
echo $oClass->getX();
// 'y'

$oClass->setX('bla');
echo $oClass->getX();
// 'bla'
 
In je eerste voorbeeld is het logisch dat je een resultaat terugkrijgt omdat je die letterlijk meegeeft.

PHP:
class test{ 
    public function functie(){
        $this->variabele = "test variabele";
        return $this->variabele; 
    } 
} 

$test = new test();
echo $test->functie();
Zo zou hij moeten zijn (Hoewel het "vastzetten" van een variabele niet helemaal de bedoeling is)

Je tweede voorbeeld blijft leeg aangezien je de functie functie() niet uitvoert
Doe je dit dan werkt het wel
PHP:
$test = new test(); 
echo $test->getFunctie();  
$test->functie();
echo $test->getFunctie();
 
Ik was vergeten de functie eerst aan te roepen:
PHP:
$test = new test();
$test->functie();
echo $test->getFunctie();
Nu doet ie t dus wel

EDIT: net te laat :p
 
Heel goed, grote kans dat het in een andere PHP-versie (terecht) niet meer werkt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan