PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   [OOP] andere Klasse an aktuelle Klasse anhängen (https://www.php-resource.de/forum/php-developer-forum/76358-oop-andere-klasse-an-aktuelle-klasse-anhaengen.html)

Proggy 29-09-2006 11:18

[OOP] andere Klasse an aktuelle Klasse anhängen
 
Hallo,

ich steh nen bissel im Moment aufm Schlauch, weil ich folgendes Problem habe:

Und zwar habe ich eine Layoutklasse, die mit Div Container usw. gefüttert werden soll. So nun habe ich für die Html Sachen eigene Klassen sprich: DivContainer.class.php usw.

So jetzt würde ich gerne zur Laufzeit, an das Layoutobjekt, die Klassen ranhängen. Beispiel:

PHP-Code:

$oLayout = new Layout();
$oLayout->addDivContainer($parameter); //wir geben eine externe Klasse zurück DivContainer
$oLayout->getContent(); 

Geht das überhaupt mit PHP?

Im Moment sieht das Ganze ungefähr so aus:

PHP-Code:

class Layout {
[....]
function 
addDivContainer() {
        
$this =& new DivContainer($this$this->oDb);
        return 
$oDiv;
    } 
[...]
}

class 
DivContainer {
[...]
    function &
__construct(&$oHtml, &$oDb) {
        
$this->oDb =& $oDb;
        
$this->oRDb =& $oDb;
        
$this->oWDb =& $oDb;
        
$this->oHtml =& $oHtml;
    }
[...]



ArSeN 29-09-2006 13:37

Ich versteh nich genau was du meinst, aber aus "Klasse an andere Klasse anhängen" schließe ich immer auf Vererbung.

Falls du das nicht meinst, beschreibe dein Problem bitte etwas genauer für Idioten wie mich.

Proggy 29-09-2006 13:44

Zitat:

Original geschrieben von ArSeN
Ich versteh nich genau was du meinst, aber aus "Klasse an andere Klasse anhängen" schließe ich immer auf Vererbung.

Falls du das nicht meinst, beschreibe dein Problem bitte etwas genauer für Idioten wie mich.

Hy,

ich möchte gerne, dass wenn ich die Methode addDivContainer() aufrufe, die Klasse DivContainer innitialisiert wird und die Methoden, von DivContainer zu Layout gehören. Ungefähr so:

PHP-Code:

$oLayout = new Layout();
$oLayout->addDivContainer();
$oLayout->addDivStart(); //<-- ist eine Methode aus DivContainer
$oLayout->addDivEnde(); //<-- ist eine Methode aus DivContainer
$oLayout->getContent(); //<-- ist eine Methode aus Layout 


hall 29-09-2006 13:46

vererbung?

http://ffm.junetz.de/members/reeg/DS...00000000000000

Slava 29-09-2006 15:15

ich hoffe, dass ich die Problem richtig verstanden habe.
ich habe dir ein beispiel geschrieben, wie man ein object erweitern kann

//es ist abhängig von php-version, da die Methoden __call und __get bei
//älteren Versionen keine Wirkung haben
PHP-Code:

class foo{
  var 
$call;
  var 
$foomember="foomember";
  function 
add($object){$this->call=$object;}
  function 
__get($name){ return isset($this->$name)?$this->$name:$this->call->$name;}
  function 
__call($funcname,$args){
    if(
method_exists $this$funcname))
    return 
call_user_func_array(array(&$this$funcname), $args); 
   return 
call_user_func_array(array(&$this->call$funcname), $args);
  }
  function 
mult($a,$b){return $a*$b;}
  
}
class 
probe{
  var 
$probe="das ist eine Probe";
  function 
getMember($a,$b){return $this->probe." : ".$a." : ".$b;}
}

//TEST
$pr= new foo;
$pr->add(new probe());
echo 
$pr->mult(2,2)."<br />";
echo 
$pr->getMember("mit","parameter")."<br />";
echo 
$pr->probe

du kannst natürlich die Variable call zu einer Liste machen und bei entsprechender anpassung von __call und __get unbegrenzte Erweiterung von Objecten erlauben.
Eine Problem kann natürlich vorkommen, wenn die Objecte die functionen oder Member mit gleichem Namen haben

ArSeN 29-09-2006 15:58

Ich steh irgendwie immernoch aufm Schlauch. Wozu soll das ganze denn gut sein? :dontknow:

Slava 29-09-2006 16:28

viel Spass beim Schlauchstehen:D

ArSeN 29-09-2006 16:49

Danke :baby

Proggy 29-09-2006 17:20

Zitat:

Original geschrieben von ArSeN
Ich steh irgendwie immernoch aufm Schlauch. Wozu soll das ganze denn gut sein? :dontknow:
Also ich brauch das an sich, um mein SeitenLayout zu bauen, will dazu keine Templateengine nehmen. So und da nen HTML Layout aus mehreren Teilen besteht (in der Regel), Formular, Tabellen, Divs. usw. dachte ich mir, dass ganze in mehrere Klassen zu splitten: DivContainer, FormContainer usw. so und da ich in der Layoutklasse, eine Eigenschaft habe, die das Layout am Ende zusammen baut ($sHtml), wollte ich nicht umbedingt, dass ich die Klassen extra im Skript (index.php) innitialisiere und denn den Kram an die Layoutklasse weitergeben. So ist das ganze auch recht leicht erweiterbar denke ich, weil ich halt durch eine MEthode, auf andere Klassen direkt zugreifen kann. Ob das ganze nun umbedingt sicher ist, weiß ich aber noch net...:D

Achso und Slava, danke werd das gleich mal testen. :)

Slava 29-09-2006 17:55

Zitat:

Original geschrieben von ArSeN
Danke :baby
@ArSeN das war nur ein Witz.
Es war einfach komisch
@Proggy steht auf dem Schlauch, weil er nicht mehr weiter kommt und du weil du nicht weist wofür das gut sein könnte.

Da ich heute auch irgendwie auf dem Schlauch stehe sind wir schon zu dritt
:D

Proggy 29-09-2006 20:39

Zitat:

Original geschrieben von Slava
@ArSeN das war nur ein Witz.
Es war einfach komisch
@Proggy steht auf dem Schlauch, weil er nicht mehr weiter kommt und du weil du nicht weist wofür das gut sein könnte.

Da ich heute auch irgendwie auf dem Schlauch stehe sind wir schon zu dritt
:D

Okay Slava, hab die Klasse mal nen bissel erweitert. Reicht fürn Anfang, werd sie noch dahingehend verändern, dass die Klasse meckert, wenn Methoden und Member, mehrmals vorkommen. Kann ich ja denn auch posten. ;)

PHP-Code:

class ExtendObject{
    var 
$aCall;
    function 
add($oObject){
        
$this->aCall[] = $oObject;
    }
    function 
__get($sName){
        if(isset(
$this->$sName)) {
            return 
$this->$sName;
        }
        foreach (
$this->aCall as $oVal) {
            if(isset(
$oVal->$sName)) {
                return 
$oVal->$sName;
            }
        }
    }
    function 
__call($sFuncname,$aArgs){
        if(
method_exists($this$sFuncname)) {
            return 
call_user_func_array(array(&$this$sFuncname), $aArgs);
        }
        foreach (
$this->aCall as $oVal) {
            if(
method_exists($oVal$sFuncname)){
                return 
call_user_func_array(array(&$oVal$sFuncname), $aArgs);
            }
        }
    }



Slava 29-09-2006 21:00

so direk sehe ich nicht, dass es meckern muss, aber es wird die Methode, die zuerst geschnappt wurde ausgeführt.
wenn da aber andere Parameter vorkommen, dann hast du natürlich Pech.

Allgemein würde ich dir aber empfehlen mit der Spielerei aufhören und die vorgesehene Vererbungsmechanismen zu benutzen.

Proggy 29-09-2006 21:16

Machs jetzt doch anders, innitialisiere, die Container, vorher und pack denn, den Htmlkram in die Layoutklasse. Aber kann ja nie schaden, solche Spielereien, in seinem Repo zu haben... :D

Alrik 30-09-2006 20:35

Hallo,

Das was du vorhast lässt sich auch so lösen, wie du es eigentlich wolltest.

$oLayout->addDivStart(); //<-- ist eine Methode aus DivContainer
$oLayout->addDivEnde(); //<-- ist eine Methode aus DivContainer
PHP-Code:

class Layout
{
public function 
addDivContainer($container)
{
$this->container $container;
}

public function 
addDivStart($parameter
{
    
$this->container->addDivStart($parameter);
}
public function 
addDivEnde($parameter)
{
   
$this->container->addDivEnde($parameter);
}

public function 
getContent()
{}


Mehr dazu findest du im Decorator-Pattern.

Gruß Thomas

Slava 30-09-2006 21:31

so wird es allgemein gemacht schon aus dem grund, dass viele Programmiersprachen gar nicht anderes können.
auf diese weise werden auch in Java die funktionalitäten von den Klassen die keine verwandschaft haben programmiert.
PHP bietet so eine Möglichkeit und genau aus diesen Grunden wurden die Methoden __set, __get und __call entwickelt um die überschreibung von Methoden und Eigentschaften von Hand zu sparen.
EDIT:
zum verdeutlichen mache ich ein Beispiel

die Javaentwickler stehen auf seter und geter Methoden, dafür freuen Sie sich, dass eine Programmierumgebung ein Tool zum automatischen erstellen von set und get Methoden erlaubt.
über die Reflections API ist es nicht so einfach eine classe um eine dynamische Methode oder eigenschaft zu erweitern.

und so kann ich es in PHP machen:
PHP-Code:

//ich will mir geter und seter sparen
//und beliebige variablen zum laufzeit wie in einem array in meiner Classe
//zu erstellen

class SetGet_ersparen{
  
//ich will dynamisch die variablen erzeugen
 
function __set($name$value){$this->$name=$value;}
 function 
__call($funcname,$args){
   
//wenn ich diese function habe, dann bekommst du sie auch
    
if(method_exists $this$funcname))
    return 
call_user_func_array(array(&$this$funcname), $args);
    
//das werden geter methoden;
    
$nam=substr($funcname,3);
    if(
strpos($funcname,"get")===0){
      
      if(isset(
$this->$nam))return $this->$nam;
    }elseif(
strpos($funcname,"set")===0){
      
$this->$nam=$args[0];
    }
    else return 
null;
 } 
}

//TEST
class Bequem extends SetGet_ersparen{
 
//eine Eigenschaft zum testen
  
var $probevar="locale variable \$probevar";
}
//los geht's
$B=new Bequem;
echo 
$B->getprobevar()."<br />";
$B->erfunden="erfunden";
echo 
$B->geterfunden()."<br />";
$B->setIrgendwas("ich bin irgendwas");
echo 
$B->Irgendwas



Alle Zeitangaben in WEZ +2. Es ist jetzt 09:50 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG