Gebruiken van classes

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Matthijs M

Matthijs M

05/12/2011 13:09:08
Quote Anchor link
PHPers,

Niet één tutorial die ik gelezen heb verteld mij het volgende over classes:
- doet men alle classes in 1 document en include deze waar classes gedeclareerd worden?
- doet men elke class in een apart document en include deze waar de functie nodig is?
- Moet er überhaupt wel 'geïnclude' worden?

Ik trouwens niet wachten tot ik een database class heb :-D. Al die regels code, niet te doen!
 
PHP hulp

PHP hulp

26/04/2024 19:14:24
 
- Ariën  -
Beheerder

- Ariën -

05/12/2011 13:17:49
Quote Anchor link
Classes kan je het beste uit oogpunt van onderhoud lekker per bestand kwijt. Later tijdens een deployment kan je altijd nog alle nodige classes samenvoegen in één bestand. Dit is verder niet verplicht.

Classes moeten uiteraard geincludeerd worden, en geïnitialiseerd met $foo = new bar(); PHP kan zelf niet ruiken welke classes er anders nodig zijn.
Gewijzigd op 05/12/2011 13:18:08 door - Ariën -
 
Wouter J

Wouter J

05/12/2011 13:30:57
Quote Anchor link
Elke class in een apart document is het handigst. En dan de bestandsnaam hetzelfde maken als de class naam.

En ja, elk bestand moet geïncluded. Het best is om bovenaan je script alle nodig classes te laden. Classes die je niet gebruikt moeten natuurlijk niet ingeladen worden.

Wat ik vaak doe is gebruik maken van de __autoload functie. Deze wordt aangeroepen als je een class initialiseert. Voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    function __autoload( $name )
    {

        require_once 'classes/'.$name.'.php';
    }

?>

Het gebruik van require_once of include_once is hier het best. Zo wordt hetzelfde bestand niet vaker geïncluded.
 
Ozzie PHP

Ozzie PHP

05/12/2011 13:39:16
Quote Anchor link
Het gebruik van de autoload functie, zoals Wouter zegt, is aan te raden. Je hoeft dan niet telkens een class te includen.
 
Fabian M

Fabian M

05/12/2011 14:26:15
Quote Anchor link
Wouter J op 05/12/2011 13:30:57:
Wat ik vaak doe is gebruik maken van de __autoload functie. Deze wordt aangeroepen als je een class initialiseert. Voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    function __autoload( $name )
    {

        require_once 'classes/'.$name.'.php';
    }

?>

Het gebruik van require_once of include_once is hier het best. Zo wordt hetzelfde bestand niet vaker geïncluded.


Deze wordt ook aangeroepen als je alleen al de class probeert te bereiken.
 
Matthijs M

Matthijs M

05/12/2011 14:28:59
Quote Anchor link
Top! Allemaal bedankt!

_autoload moet aanstaan op je server toch?
 
Jaron T

Jaron T

05/12/2011 17:44:09
Quote Anchor link
Matthijs DeM op 05/12/2011 14:28:59:
Top! Allemaal bedankt!

_autoload moet aanstaan op je server toch?


http://php.net/manual/en/language.oop5.autoload.php

php.versie >= 5.0
 
Matthijs M

Matthijs M

05/12/2011 18:28:54
Quote Anchor link
Het resulteert in dit bij mij:

Fatal error: Call to undefined function ShortTxt() in C:\wamp\www\head.php on line 36

In het begin van het document
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    function __autoload( $name )
        {

            require_once 'classes/'.$name.'.php';
        }

?>


In het document
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
// een de nodige code ervoor; Database connectie en query
ShortTxt($tekst, 20);
?>
Gewijzigd op 05/12/2011 18:29:31 door Matthijs M
 
Wouter J

Wouter J

05/12/2011 18:30:36
Quote Anchor link
HEb je de ShortTxt() functie wel aangemaakt, of is dat een class? Ik raad je in elk geval aan om even de OOP beginnershandleiding te lezen.

En de autoload functie wordt niet aangeroepen als je een functie aan roept, alleen met een class.
 
Matthijs M

Matthijs M

05/12/2011 18:33:44
Quote Anchor link
ja die functie is aangemaakt. Heeft altijd gewerkt, met een een include.
 
Jaron T

Jaron T

05/12/2011 18:39:20
Quote Anchor link
autoload is voor classes.. niet functies
 
Fuzzie -

fuzzie -

05/12/2011 19:27:42
Quote Anchor link
dus met andere woorden je class zal er ongeveer zo uit zien
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// file -> classes/Text.php
class Text {
  // functie/methode
  public function ShortTxt($text, $lengte) {
    // code
  }

}

?>


om de functie uit voeren
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
  $text
= new Text();
  echo $text->ShortTxt("texttexttexttext", 4);
?>


klaar ;)
 
Matthijs M

Matthijs M

05/12/2011 19:30:23
Quote Anchor link
Ok bedankt. Die beginnershandleiding ga ik ook nog doornemen.
 
Fabian M

Fabian M

06/12/2011 07:14:49
Quote Anchor link
Fuzzie - op 05/12/2011 19:27:42:
dus met andere woorden je class zal er ongeveer zo uit zien
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// file -> classes/Text.php
class Text {
  // functie/methode
  public function ShortTxt($text, $lengte) {
    // code
  }

}

?>


om de functie uit voeren
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
  $text
= new Text();
  echo $text->ShortTxt("texttexttexttext", 4);
?>


klaar ;)


Je kunt die methode beter statisch maken.
 
Matthijs M

Matthijs M

06/12/2011 11:59:50
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// file -> classes/Text.php
class Text {
  // functie/methode
  public static ShortTxt($text, $lengte) {
    // code
  }

}

?>


:-)?
Gewijzigd op 06/12/2011 12:01:19 door Matthijs M
 
Jaron T

Jaron T

06/12/2011 12:47:36
Quote Anchor link
Ja en dan kan je hem aanroepen als volgt;

echo Text::ShortTxt("blaaaat", 2);
 
Matthijs M

Matthijs M

12/12/2011 17:43:04
Quote Anchor link
Het wil nog niet helemaal lukken. Als ik die __autoload vervang door een include dan werkt het wel. Ik ben bezig met het database class ook van dit forum. Die werkt verder prima.

Error:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Fatal error: Call to a member function num_rows() on a non-object in /var/www/vhosts/*/httpdocs/Developement/dbclass/index.php on line 22


__autoload poging:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
    function __autoload( $name )
        {

            require_once 'classes/'.$name.'.php';
        }

# regel 22
echo $db->num_rows( 'SELECT * FROM artikels' );

destruct( 'db' );
?>


Hier de class in het mapjes "classes".

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
# Made by Mitch Vroege 2005
# Versie 0.6.2

# Class database

class database
{
    # Database connectie variabele
    var $db;
    
    # Constructor
    function database( $user, $pass, $database, $error = 'MySQL database niet bereikbaar!', $host = 'localhost' )
    {

        # Connectie leggen
        $this->db = mysql_connect( $host, $user, $pass );
        
        # Kijken of de connectie gelukt is, en of de database geselecteerd kon worden        
        if( !$this->db || !mysql_select_db( $database, $this->db ) )
            die( $error );
    }

    
    # Query resultaat variabele
    var $res;
    
    # Functie die mysql_num_rows teruggeeft
    function num_rows( $sql = NULL )
    {

        # Kijken of er een query meegegeven is, zo ja uitvoeren
        if( $sql != NULL )
            $this->run_query( $sql );
        
        # Mysql_num_rows uitspugen
        return mysql_num_rows( $this->res );
    }

    
    # Functie die mysql_fetch_array teruggeeft
    function get_array( $sql = NULL, $refetch = false )
    {

        # Kijken of er een query meegegeven is, zo ja uitvoeren
        if( $sql != NULL )
            $this->run_query( $sql );
            
        # Kijken of refetch is meegegeven
        if( $refetch == true )
            mysql_data_seek( $this->res, 0 );    
        
        # Loopje door alle resultaten
        while( $row = mysql_fetch_array( $this->res ) )
            $rows[] = $row;
        
        # Array met rows uitspugen
        return $rows;
    }

    
    # Functie die mysql_insert_id teruggeeft
    function insert_id( $sql = NULL )
    {

        # Kijken of er een query meegegeven is, zo ja uitvoeren
        if( $sql != NULL )
            $this->run_query( $sql );
            
        # Mysql_insert_id uitspugen
        return mysql_insert_id( $this->db );
    }

    
    # Functie die mysql_affected_rows teruggeeft
    function affected_rows( $sql = NULL )
    {

        # Kijken of er een query meegegeven is, zo ja uitvoeren
        if( $sql != NULL )
            $this->run_query( $sql );
            
        # Mysql_affected_rows uitspugen
        return mysql_affected_rows( $this->db );
    }

    
    # Functie die kijkt of $table in $database bestaat, zoja 'true', zo nee, 'false'
    function find_table( $table, $database )
    {

        # Tabellen opvragen
        $this->res = mysql_list_tables( $database, $this->db );
        
        # Tabellen in een array proppen
        $data = $this->get_array( );
        
        # Return true of false
        return in_array( $table, $data );
    }

        
    # Functie die de query uitvoert
    function run_query( $sql )
    {

        # Query uitvoeren en het resultaat wegschrijven in de $res var
        $this->res = mysql_query( $sql, $this->db );
    
        # Kijken of het een geldige query is
        if( !$this->res )
            die( 'De opgegeven query is onjuist!' );
    }

    
    # Functie die de verbinding sluit & $res leegt
    function database_close( )
    {

        # $res legen
        if( !@mysql_free_result( $this->res ) )
            unset( $this->res );
        
        # Verbinding sluiten
        mysql_close( $this->db );
    }
}


# Class database destructor
function destruct( $name )
{

    # Referentie naar object $name meegeven aan $db
    $db = &$GLOBALS[$name];
    
    # Database afsluiten
    $db->database_close( );
    
    # Object verwijderen
    unset( $GLOBALS[$name] );
}

# Database configuratie
$db = new database( '*', '*', '*' );
?>
Gewijzigd op 12/12/2011 17:44:31 door Matthijs M
 
Wouter J

Wouter J

12/12/2011 18:00:03
Quote Anchor link
Je stopt 'new database' in het bestand die in classes zit. Dit moet je niet doen. In een class bestand moet enkel alleen de class zelf staan niks meer en niks minder.

Vervolgens zet je bovenaan een nieuwe pagina de autoload functie en daaronder maak je een nieuwe instance van database aan.
 
Matthijs M

Matthijs M

12/12/2011 19:45:10
Quote Anchor link
Opgelost, bedankt Wouter!
 



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.