php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.10.2008, 11:51  
Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 92
Frank Burian ist zur Zeit noch ein unbeschriebenes Blatt
Standard Instanz an Unterklasse weiterreichen?

Hallo,

ich hab eine "Hauptklasse" (core.class.php) und eine "Unterklasse" (subcore.class.php).
Ich weise im Konstruktur der "Hauptklasse" einer Variable ($strContent) einen Wert zu und will diesen Wert mit einer Methode der "Unterklasse" ausgeben.

Hier mal der Beispiel-Code: (Zum Problem komm ich nach dem Code...)
index.php
PHP-Code:
<?php
    
include('core.class.php');
    include(
'subcore.class.php');
    
    
$core = new core();
    
$subcore = new subcore();
    
    echo 
$subcore->getContent();
?>
core.class.php
PHP-Code:
<?php
class core
{
    protected 
$strContent NULL;
    
    function 
__construct()
    {
        
$this->strContent 'Führe aus<br />';
    }
}
?>
subcore.class.php
PHP-Code:
<?php
class subcore extends core
{
    function 
__construct()
    {
        
parent::__construct();
    }

    public function 
getContent()
    {
        return 
$this->strContent;
    }
}
?>
Also, um Zugriff aus der "Unterklasse" auf die Variable "$strContent" aus der "Hauptklasse" zu haben, muss ich im Konstruktor der "Unterklasse" ein
PHP-Code:
parent::__construct(); 
einfügen.

So jetzt zum Problem!
Nehmen wir mal an, das Projekt ist sehr groß und der Konstruktor der "Hauptklasse" übernimmt Aufgaben wie:
- Verbindung mit der MySQL-Datenbank
- Liest Konfig-Dateien ein
- usw.

Jetzt brauch ich aber auch eine MySQL-Verbindung in der "Unterklasse" und würde gern die Verbindung nehmen die mit dem Konstruktor der "Hauptklasse" erstellt wurde.
Das Problem ist, das durch
PHP-Code:
parent::__construct(); 
der Konstruktor der "Hauptklasse" 2x mal aufgerufen wird, und 2 mal eine MySQL-Verbindung hergestellt wird. Was natürlich aus Performance-Gründen unakzeptabel ist, vorallem wenns es noch 10 weitere "Unterklassen" gibt.

Ich dachte mir, setzt du in der "Hauptklasse" im Konstruktor einfach eine If-Abfrage ob die Variable schon ein Wert zugewiesen wurde, und wenn ja, dann mach nix und weis es eben nicht nochmal zu.
Aber leider geht, das auch nicht, da der Konstruktor der Hauptklasse nach dem parent::__construct(); scheinbar die Variable nicht kennt.

Also, kennt jemand eine Möglichkeit, die Instanz aus der "Hauptklasse" an die "Unterklasse" weiterzureichen, ohne jedes mal den Konstruktor der "Hauptklasse" wieder aufrufen zu müssen?

Danke!
Frank Burian ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 24.10.2008, 12:06  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Frank Burian Beitrag anzeigen
Also, kennt jemand eine Möglichkeit, die Instanz aus der "Hauptklasse" an die "Unterklasse" weiterzureichen, ohne jedes mal den Konstruktor der "Hauptklasse" wieder aufrufen zu müssen?
so wie du es machen willst, müsstest du die variablen statisch ansprechen.

so ganz verstehe ich nicht, was die klasse core denn soll. alles was du beschreibst sind singletone aufgaben, weswegen ich gemäß diesem beispiel die klasse core als singleton anlegen würde und allen kindern im konstruktor die instanz des cores geben würde....
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 24.10.2008, 12:19  
Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 92
Frank Burian ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Static wird hier nicht gehen! Da ich, z.B. das Handle der MySQL-Verbindung an die anderen übergeordneten Klassen weiter geben will, und die Verbindung im Konstruktor der Hauptklasse erstellt wird. Und der static-variable kann ich das handle da ja schlecht zu weisen.

In der Hauptklasse, befinden sich u.a. alle möglichen Funktionen die ich immer wieder brauche!
Frank Burian ist offline   Mit Zitat antworten
Alt 24.10.2008, 13:09  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Aber leider geht, das auch nicht, da der Konstruktor der Hauptklasse nach dem parent::__construct(); scheinbar die Variable nicht kennt.
Wieso sollte das nicht gehen ?
PHP-Code:
<?

class main 
  
{
  public 
$conn;
  
  function 
__construct ()
    {
    if (empty (
$this->conn)) $this->conn++;
    }

  function 
getConn ()
    {
    echo 
$this->conn;
    }
  }
  
class 
sub extends main
  
{
  function 
__construct ()
    {
    
parent::__construct ();
    }
  }

$m = new main ();
$m->getConn (); // 1
$s = new sub ();
$s->getConn (); // 1
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (24.10.2008 um 13:12 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 24.10.2008, 13:30  
Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 92
Frank Burian ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Siehe unter mir! geht doch nicht!

Geändert von Frank Burian (24.10.2008 um 13:41 Uhr).
Frank Burian ist offline   Mit Zitat antworten
Alt 24.10.2008, 13:41  
Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 92
Frank Burian ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Falsch!!!
Erklär mir das mal???
Warum wird "echo 'Aufruf';" 2x ausgegeben?

Das 1 raus kommt ist ja klar, weil die Variable ja immer wieder mit 0 gestartet wird.
Also es geht doch nicht!

PHP-Code:
<?php

class main
  
{
  public 
$conn;

  function 
__construct ()
    {
    if (empty (
$this->conn))
    {
        
$this->conn++;
        echo 
'Aufruf<br>';
    }
    }

  function 
getConn ()
    {
    echo 
$this->conn;
    }
  }

class 
sub extends main
  
{
  function 
__construct ()
    {
    
parent::__construct ();
    }
  }

$m = new main ();
$s = new sub ();
$s->getConn (); // 1

?>
Frank Burian ist offline   Mit Zitat antworten
Alt 24.10.2008, 13:53  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Zitat:
Zitat von Frank Burian Beitrag anzeigen
Falsch!!!
Erklär mir das mal???
Warum wird "echo 'Aufruf';" 2x ausgegeben?

Das 1 raus kommt ist ja klar, weil die Variable ja immer wieder mit 0 gestartet wird.
Also es geht doch nicht!
tut doch das was es soll? hä?
cycap ist offline   Mit Zitat antworten
Alt 24.10.2008, 14:02  
Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 92
Frank Burian ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nein, tut es nicht!

Denn die Ausgabe "Aufruf" wird 2 mal ausgegeben. Das heißt der Konstruktor der Hauptklasse wurde 2 mal ausgeführt - und die Variable $conn die um 1 hochgezählt wurde, hat nach dem 2 Konstruktoraufruf, keinen Wert!

Also ist
PHP-Code:
if (empty ($this->conn))
{
...

sinnlos, weil der Wert $conn des ersten Konstruktor-Aufrufes im zweiten Aufruf nicht mehr da ist, bzw. nicht erkannt wird. Deshalb wird auch zweimal das echo ausgegeben. Wenn dann soll es aber nur einmal ausgegeben werden.

Verstehst du?
Frank Burian ist offline   Mit Zitat antworten
Alt 24.10.2008, 14:09  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Singleton wurde doch schon genannt?!
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline   Mit Zitat antworten
Alt 24.10.2008, 14:22  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ach so, ja nee. extends erweitert ja nur die Klasse, kein bestehendes Objekt. Wie auch, schließlich könnten ja auch 2 main Objekte bestehen, welches sollte es zu sub erweitern... Demzufolge ist $conn stets neu intialisiert...

Zitat:
Und der static-variable kann ich das handle da ja schlecht zu weisen.
Doch. Du mußt dann nur den Klassennamen statt parent verwenden.

PHP-Code:
<?

class main 
  
{
  public static 
$conn;
  
  function 
__construct ()
    {
    if (empty (
self::$conn)) 
      {
      echo 
'*' 
      
self::$conn++; 
      };
    }

  function 
getConn ()
    {
    echo 
self::$conn;
    }
  }
  
class 
sub extends main
  
{
  function 
__construct ()
    {
    
parent::__construct ();
    }

  function 
getConn ()
    {
    echo 
main::$conn;
    }
  }

$m = new main ();
$m->getConn ();  
$s = new sub ();
$s->getConn ();
Code:
*11
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (24.10.2008 um 14:25 Uhr).
nikosch ist offline   Mit Zitat antworten
Antwort


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
[Erledigt] Instanz einer Klasse mit unbekanntem Namen erstellen PHP Tipps 2005 4 06.02.2009 14:39
instanz einer classe (variable) notyyy PHP Tipps 2007 22 16.07.2007 00:17
Instanz einer Klasse in SessionVariable PHP-Fortgeschrittene 2 21.02.2006 00:18
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
Instanz über mehrere Seiten verwenden? becks123 PHP Tipps 2005-2 3 22.08.2005 10:10
[Erledigt] Instanz einer Klasse innerhalb einer Funtion verwenden PHP-Fortgeschrittene 9 14.04.2005 21:51
Unterklasse zur Klasse einer Zelle HTML, Usability und Barrierefreiheit 3 08.03.2005 14:56
Array aus einer funktion weiterreichen. PHP Tipps 2005 21 20.01.2005 11:08
[Erledigt] Instanz bilden innerhalb einer Klasse PHP Tipps 2004 7 11.12.2004 12:58
Problem: Daten per URL weiterreichen PHP Tipps 2004 7 09.09.2004 10:41
Übergabe einer Instanz einer Klasse PHP-Fortgeschrittene 2 24.08.2004 10:20
Instanz bilden - Konstruktor PHP Tipps 2004 2 29.07.2004 07:47

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php mysql verbindung in unterklassen nutzen, self unterklasse php, php instanz parent, unterklasse ansprechen, was macht getconns, parent instanz php, variablen wert unterklasse php, instance weiterreichen, instanz über klasse weiterreichen, if abfrage in einer klasse php, html class weiterreichen, php unterklasse variable überschreiben, unterklasse aufrufen, php klasse über variable instanzieren, php unterklasse instanzieren vor verwendung, instanz der parent klasse, php variable in unterklasse überschreiben, php klasse in klasse kennt variable nicht, php 2 mal parent aufrufen, php zugriff auf __construct variable

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:35 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