Ik ben sinds vandaag me een beetje aan het verdiepen in classes en dergelijke. (dus alvast excuses als ik jullie beledig door een slechte code te laten zien ;D) Ik probeer een class te maken die de lagen voor het genereren van een afbeelding maakt m.b.v. gegevens uit de database. Er wordt bij de databasegegeven a t/m m gekeken of het resultaat Y of N is, als het Y is moet er een nieuwe laag op de basisafbeelding im gelegd worden. Ik heb dit script al eerder gemaakt zonder classes, maar wilde kijken of ik het op deze manier compacter/ netter kan maken. Tot nu toe dus zonder succes. Ik heb dit gemaakt:

class counter {
    var $count; 
	
     function getcount() {
          return $this->count;
     }
 
     function getstep() {
          return $this->step;
     }

     function nextbuilding($newval) {
          if(is_integer($newval))
          $this->step = $newval;
     }

     function step() {
          $this->count += $this->step;
     }

     function reset() {
          $this->count = 1;
          $this->step = 1;
     }
     
     function create($building) {
          	
     	$$building = imagecreatefrompng("..pad../{$this->count}.png");
		imagecopy($im, ${$building}, 0, 0, 0, 0, imagesx(${$building}), imagesy(${$building}));

     }
}


$query 	= mysql_query("
			SELECT id,a,b,c,d,e,f,g,h,i,j,k,l,m
			FROM blabla
		");
		
$ranch 	= mysql_fetch_row($query);
$im	= imagecreatefromjpeg("...pad....jpg");
$ticker = new counter();
$ticker->reset();
$ticker->nextbuilding(1); 


while($ticker->getcount() <= 13)
{
	$nr1 = $ticker->getcount();
	$nr2 = $ranch[$nr1];
	
	$test = array("1" => "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m");

	if($nr2 == 'Y')
	{
		// wel laag maken
		$ticker->create($test[$nr1]);
	}
	else
	{
		// geen laag maken
	}
	$ticker->step();
}


Hierna sla ik de afbeelding op en verwijder ik de afbeeldingen uit het geheugen.

Ik krijg echter steeds Warning: imagecopy() expects parameter 1 to be resource, null given
Waarom is parameter 1 geen resource?
$im wordt buiten de classe gemaakt en is dus niet binnen de classe bekend;

Quick and dirty:
zet voor regel 29 dit : global $im;

De nette manier:

Geef $im mee aan de constructor van de class, en schrijf op regel 29
imagecopy($this->im, ${$building}, 0 ...

Geef maar een gil als je meer wil weten.
Binnen de class bestaat $im niet. Je zal die dus mee moeten geven aan de class. Ofwel via een property, ofwel via een parameter van de bewuste methode.

Verder, dit is niet zo netjes:
var $count;

Maak hier van:
private $count;

Zo heb je een private property gedeclareerd.

Edit: dit keer was John me voor :-)
$im bestaat zo te zien niet.
John Berg op 28/08/2012 17:49:51

$im wordt buiten de classe gemaakt en is dus niet binnen de classe bekend;

Quick and dirty:
zet voor regel 29 dit : global $im;

De nette manier:

Geef $im mee aan de constructor van de class, en schrijf op regel 29
imagecopy($this->im, ${$building}, 0 ...

Geef maar een gil als je meer wil weten.


Ah met de "Quick and dirty" manier werkt het inderdaad meteen ;D De nette manier wil ik ook eens uitproberen. ik heb wel over constructors gelezen, ik dacht dat er dan zoiets bij moest:


    private $im;
    
  	public function __construct($im) { 
    	$this->im = $im;
     }



Dat is echter niet zo want dan gaat het fout, hoe moet het dan wel?

Erwin H bedankt voor de tip over private ipv var ik heb het aangepast :)
Wat je doet klopt, het enige wat er dan nog moet is dit:
<?php
$ticker = new counter( $im );
?>
Je moet dan een variabele meegeven in de constructor.
Nu werkt het inderdaad, bedankt!

Reageren