php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.02.2009, 11:02  
Neuer Benutzer
 
Registriert seit: 21.02.2009
Beiträge: 28
hawkeye78 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Objekt an Konstruktor übergeben

Hallo,

da PHP ja leider nicht Typensicher ist (in meinen Augen einer größten Designnachteile dieser Sprache) bin ich im moment sehr erfolgreich darin daran zu verzweifeln einem Konstruktor ein Objekt von einer anderen Klasse zu übergeben. Für den konkreten Fall heißt das, ich habe drei Dateien (zwei Klassen und ein Skript). Nun erzeuge ich im Script A
PHP-Code:
    require("db_login.php");
    require(
"db_access.php"); 
    
$db=new db_access($host$user$pw$dbname); 
ein Objekt von der Klasse db_access mit dem Namen $db. Das funktioniert auch soweit, und erlaubt mir den Zugriff auf die Datenbank.
Allerdings habe ich nun eine Klasse namens generate welcher ich gerne das Objekt $db übergeben möchte so das ich auch aus der Klasse generate auf die Datenbank zugreifen kann, und dies ist genau der Punkt an dem ich im moment scheitere.
Ich habe bis jetzt versuche das Objekt im Script A zu erzeugen, indem ich folgenden Code produziert habe
PHP-Code:
    require("generate.php");
    
$gen=new generate(&$db); 
Da ich gelesen habe das nicht das Objekt selbst sondern nur die Adresse übergeben werden soll habe ich da noch ein & vorgesetzt. Aber leider behauptet er weiterhin das die Methoden der Klasse db_access in der Klasse generate ihm nicht bekannt seien.
Ach ja die Klasse generate schaut im moment so aus (auszug):
PHP-Code:
class generateImages
{
    private 
$db2;

    function 
generateImages($db)
    {
        
$db2=$db;
    }
//...

Ich habe ganz offenbar da irgendwo einen Fehler drin. Aber da ich mich bis jetzt noch nicht Objektorientierter Programmierung in PHP beschäftigt habe sehe ich nicht so ganz wo und wäre daher über einen entsprechenden Hinweis wo mein Fehler liegt sehr danbar.
viele Grüsse
Dan

Nachtrag:
Die Fehlermeldung die im moment kommt ist das eine Methode aus der Klasse db_access eine ein nicht (non-Object) Objekt sei

Geändert von hawkeye78 (28.02.2009 um 12:36 Uhr).
hawkeye78 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.02.2009, 12:55  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Hallo hawkeye,
bitte poste doch nächstesmal die konkrete Fehlermeldung und den betroffenen Code. Das da oben ist offensichtlich Phantasiecode,...einmal heißt es generate einmal generateImages.

Die Klassennamen sind auch nicht glücklich gewählt - üblicherweise nimmt man dafür keine Verben.

Dein Problem hat auch nichts mit Typsicherheit zu tun, jedenfalls sehe ich nicht, warum dir das hier Probleme bereiten sollte...
Du hast außerdem einen Mischmasch aus PHP4 und PHP5. Das ist nicht unbedingt falsch aber sehr unschön. In PHP5 heißt der Konstruktor immer __construct() und nicht wie die Klasse selbst. Außerdem kannst du dir dann da & bei der Paramterübergabe sparen, da PHP5 hier automatisch mit Referenzen arbeitet.

Vermutlich ist dein Problem aber, dass du in deinem Konstruktor $db2 mit $db belegst. Wenn du damit die Member-variable "db2" meinst, musst du aber mit $this->db2 arbeiten...
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 28.02.2009, 13:15  
Neuer Benutzer
 
Registriert seit: 21.02.2009
Beiträge: 28
hawkeye78 befindet sich auf einem aufstrebenden Ast
Standard

Hallo agrajag,

erst einmal vielen Dank für deine Antwort, na ja als Phantasie-Code würde ich das nicht bezeichnen, ich habe ihn halt aus dem Kopf aus dem Editor übertragen da alle Scripte etwas länger sind und ich keine lust hatte alle stellen zusammen zu suchen. Aber der Fehler wohl irgendwo anderes liegt hier jetzt noch einmal der exakte Code (aus dem Editor kopiert und dann zusammen gekürtzt:

Script:
PHP-Code:
<?php
    
require("db_login.php");
    require(
"db_access.php"); 
    
$db=new db_access($host$user$pw$dbname);

    require(
"generateImages.php"); 

    
$anzahl_track=3;

    
$img=new generateImages($db);
    
$img->generatePieGenre($anzahl_track);
?>
Klasse: db_access
PHP-Code:
<?php
// Zugriff auf die Datenbank
// 7. Juni 2008


class db_access
{
    private 
$db_link=false;

    
// Konstruktor
    
function db_access($host$user$pw$dbname)
    {
        
$this->db_connect($host$user$pw$dbname);
    }
    
    
// Auswahl der Datenbank und Aufbau der Verbindung
    
function db_connect($host$user$pw$dbname)
    {
        
$this->db_link=@mysql_pconnect($host$user$pw) or die ("Verbindung zur Datenbank nicht möglich");

        @
mysql_select_db($dbname) or die ("Datenbank konnte nicht ausgewählt werden");        
    }

    
// Sendet eine Query an die Datenbank    
    
function db_query($query)
    {
        
$result=mysql_query($query$this->db_link) or die ("Anfrage war ungültig".mysql_error());
        
        return 
$result;
    }
}
?>
Klasse generateImages
PHP-Code:
<?php
class generateImages
{
    private 
$db2;

    function 
generateImages($db)
    {
        
$this->db2=$db;
    }
    
    function 
generatePieGenre($gesamt)
    {
        
$query_genres="SELECT COUNT( T.Track_ID ) AS anzahl , SUM( T.Track_Laenge ) AS zeit , G.Bezeichnung AS name FROM Genre G, Track T WHERE G.Genre_ID = T.Genre_ID GROUP BY G.Bezeichnung";
        
$result_genres=$db2->db_query($query_genres);
    
        
$palette=array(    array(25510251), array(7531111), array(2042040), array(0153255), 
                                array(
197011), array(0107107), array(12800), array(00128),
                                array(
01280), array(2552550), array(25500), array(02550),
                                array(
14871148), array(153153153), array(2550255));

        
$end_arc=0;            // Endpunkt des vorherigen Segments

        
$other=false;
        
$counter=0;
    
        
$image imagecreate (600600); 
        
$farbe_body imagecolorallocate ($image255255255);

        while(
$row=mysql_fetch_object($result_genres))
        {
                
$prozent=round(((100/$gesamt)*$row->anzahl),3);
            
                if(
$prozent>2)
                {
                    
$color_pie=imagecolorallocate $image$palette[$counter][0], $palette[$counter][1], $palette[$counter][2]);
                    
$counter++;
                    
$counter=$counter%15;
                    
                    
$arc=(360/100)*$prozent+$end_arc;
    
                    
imagefilledarc($image300300250250$end_arc$arc$color_pieIMG_ARC_PIE);
    
                    
$end_arc=$end_arc+$arc;
                }
                else
                {
                    
$other=true;            
                }
        }
        
        
$var imagejpeg ($image'./test.jpg');

    }
}
?>
und dieser Code liefert aktuelle die Fehlermeldung: Call to a member function db_query() on a non-object in /var/www/alben/generateImages.php on line 16 wobei Zeile 16 bei mir die Zeile mit dem Inhalt:

PHP-Code:
        $result_genres=$db2->db_query($query_genres); 
ist. Für den Fall das ich den Code ein bißchen zu sehr zusammen geschnitten habe habe ich mal die gesamte Inhalte hier[1], hier[2] und hier[2] vollständig hochgeladen.
viele Grüsse
Dan

PS
Was den Hinweis mit dem Konstroktor betrifft werde ich das ändern sobald es läuft und möchte mich darum noch einmal explezit dafür bedanken.

[1] debianforum.de &bull; NoPaste
[2] debianforum.de &bull; NoPaste
[3] debianforum.de &bull; NoPaste


Nachtrag:
Ich hab ein Script vergessen nämlich das wo ich das Objekt von der Klasse generateImages anlege das ist dann hier[4] zu finden

[4] http://nopaste.debianforum.de/19427

Geändert von hawkeye78 (28.02.2009 um 13:27 Uhr).
hawkeye78 ist offline  
Alt 28.02.2009, 13:30  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

PHP-Code:
class generateImages
{
    private 
$db2;

    function 
generateImages($db)
    {
        
$this->db2=$db;
    } 
//..

Das passt nicht. Entweder PHP4 oder PHP5, aber bitte nicht mischen. In PHP5 heißt der Konstruktor __construct() und in PHP4 gibt es kein private.
__________________
Phoscur ist offline  
Alt 28.02.2009, 13:39  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Du hast jetzt zwar im Konstruktor $this->db2 stehen, aber auch an allen anderen Stellen an denen du auf den Member "db2" zugreifen möchtest, musst du $this verwenden....
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 28.02.2009, 13:39  
Neuer Benutzer
 
Registriert seit: 21.02.2009
Beiträge: 28
hawkeye78 befindet sich auf einem aufstrebenden Ast
Standard

Hallo Phlegma,

auch dir sei gedankt für den Hinweis hier[1] und hier[2] jetzt noch mal die beiden geänderten Klassen. Aber leider ändert das nichts an meinem Problem das er ganz offenbar nicht an die Methoden der Klasse db_access heran kommt.
Viele Grüsse
Dan

[1] debianforum.de &bull; NoPaste
[2] debianforum.de &bull; NoPaste
hawkeye78 ist offline  
Alt 28.02.2009, 13:42  
Neuer Benutzer
 
Registriert seit: 21.02.2009
Beiträge: 28
hawkeye78 befindet sich auf einem aufstrebenden Ast
Standard

Hallo

Das ist wieder so ein Punkt da könnte ich mich über mich selbst fürchterlich aufregen das ist wirklich ein sau blöder Fehler.
Darum ein besonders großes Danke schön für eure Geduld und eure Mühe euch diesen Haufen MÜll den ich Programmcode nenne anzuschauen.
Viele Grüsse
Dan
hawkeye78 ist offline  
Alt 28.02.2009, 19:01  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Bei diesen Problemen helfen Notice Fehler schnell bei beim Fehleraufspüren, nur programmieren viele nicht Notice konform, so kommt dann noch weit mehr auf den Bildschirm als das aktuelle Problem.
In deinem Fall hätte es einen "unbekannte Variable"-Fehler gegeben..
__________________
Phoscur ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Objekt aufrufen nixdorf PHP Tipps 2008 9 10.10.2008 18:29
[Erledigt] Methoden auf Objekt aufrufen (und fangen), die nicht existieren tsisson PHP Tipps 2008 2 07.10.2008 18:19
Objekt im GET-Query wird nicht übertragen Ralpho PHP-Fortgeschrittene 10 05.05.2008 10:03
Objekt als ComboBox behandeln Nalincah PHP Tipps 2008 2 08.11.2007 03:52
Klassensammlung über ein Objekt zur Verfügung stellen ecomeback PHP Tipps 2007 7 14.07.2007 00:01
PHP-Object (klasseninstanz) als Objekt an WS übergeben. joni1980 PHP-Fortgeschrittene 2 10.05.2006 11:25
Zugriff auf verschachteltes Objekt aus Funktion FloMX PHP-Fortgeschrittene 10 28.03.2006 17:01
Objekt in Session übergeben jacos PHP Tipps 2006 2 21.02.2006 00:11
[Erledigt] PHP5 OOP Zugriff aus einem Objekt auf ein externes Objekt PHP Tipps 2006 5 28.01.2006 16:05
Objekt übergeben Fatal Error PHP Tipps 2007 5 28.12.2005 14:43
Objekt in Array ablegen PHP-Fortgeschrittene 9 18.08.2005 14:35
kann sich ein Objekt selbst serialisieren? ajo_silent PHP Tipps 2005-2 24 27.06.2005 09:13
[Klassen] Untereintrag für Objekt erzeugen? DannyD PHP Tipps 2005 5 17.02.2005 18:13
Objekt in einer Session suter PHP Tipps 2004-2 2 13.12.2004 17:33
objekt und collection PHP Tipps 2004-2 2 17.11.2004 08:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php oop constructor array übergeben, objekt an konstruktor übergeben, http://www.php.de/php-einsteiger/52356-erledigt-objekt-konstruktor-uebergeben.html, php variable an constructor übergeben, konstruktor übergeben, php konstruktor, objekt im konstruktor, objekt an funktion übergeben php, konstruktor objekt übergeben, objekt übergeben, objekt im konstruktor übergeben, php variable im constructor übergeben, php konstruktor objekt übergeben, objekt an konstruktor, array an konstruktor übergeben, objekt konstruktor, php object an constructor übergeben datenbank, php objekte übergeben, php objekt konstruktor übergeben, php objekt an konstruktor übergeben

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum