Class & afbeeldingen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Water Lilly

Water Lilly

28/08/2012 17:41:15
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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?
 
PHP hulp

PHP hulp

19/04/2024 02:27:32
 
John Berg

John Berg

28/08/2012 17:49:51
Quote Anchor link
$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.
 
Erwin H

Erwin H

28/08/2012 17:50:31
Quote Anchor link
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 :-)
Gewijzigd op 28/08/2012 17:51:04 door Erwin H
 
- SanThe -

- SanThe -

28/08/2012 17:50:55
Quote Anchor link
$im bestaat zo te zien niet.
 
Water Lilly

Water Lilly

28/08/2012 18:09:24
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
    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 :)
Gewijzigd op 28/08/2012 18:09:48 door Water Lilly
 
Erwin H

Erwin H

28/08/2012 18:12:40
Quote Anchor link
Wat je doet klopt, het enige wat er dan nog moet is dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$ticker
= new counter( $im );
?>

Je moet dan een variabele meegeven in de constructor.
 
Water Lilly

Water Lilly

28/08/2012 18:15:52
Quote Anchor link
Nu werkt het inderdaad, bedankt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.