• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ausgabe von Obbjektvariable inkorrekt!! Am verzweifeln

hansi3000

Neues Mitglied
Ich habe ein Script geschreiben, welches zur Veranschaulichung von OOP dienen soll, ich säubere hier in dem Fall das Haus, sodas $haus->sauberkeit eigentlich 70 sein sollte, es wird jedoch 50 ausgegeben! Was habe ich falsch gemacht?

class.inc.php:

PHP:
<?php
    class Haus {
        public $name = '';
        public $residents = array();
        public $rooms = 0;
        public $sauberkeit = 50;
        public function saeubern($prozent) {
            $this->sauberkeit = $this->sauberkeit + $prozent;
            if ($this->sauberkeit >= 101) {
                $this->sauberkeit = 100;
            }
        }
        function __construct() {
        }
    }
    class Mensch extends Haus{
        public $age = 0;
        public $name = '';
        public $gender = '';
        public $home = '';
        public $id = 0;
        function __construct($name) {
            $this->name = $name;
            $query = mysql_query("SELECT * FROM menschen WHERE name='".$this->name."'");
            if (mysql_num_rows($query) == 1) {
                while ($row = mysql_fetch_assoc($query)) {
                    $this->age = $row['age'];
                    $this->gender = $row['gender'];
                    $this->home = $row['home'];
                    $this->id = $row['id'];
                    $_SESSION['sessid'] = $row['id'];
                }
                $query1 = ("SELECT * FROM sessions WHERE id='".$md5ip."'");
                if (@mysql_num_rows($query1) == 1) {
                    $query2 = mysql_query("UPDATE sessions SET menschen='".$this->name."', home='".$this->home."'");
                    if ($query2 == 0) {
                        die("Unbekannter Fehler, Code: 0002");
                    }
                } else if (@mysql_num_rows($query1) == 0) {
                    $query2 = mysql_query("INSERT INTO sessions(menschen, home, id) VALUES('".$this->name."', '".$this->home."', '".$md5ip."')");
                    if ($query2 = 0) {
                        die("Unbekannter Fehler, Code: 0003");
                    }
                } else {
                    die("Unbekannter Fehler, Code: 0004");
                }
            } else if (mysql_num_rows($query) == 0) {
                die("Mensch existiert nicht!");
            } else if (mysql_num_rows($query) >= 2) {
                die("Mensch existiert mehr als 1 mal");
            } else {
                die("Unbekannter Fehler, Code: 0001");
            }
        }
        public function hausSaeubern($gegenstand) {
            if ($gegenstand == 'Besen'){
                $seaubernplus = 20;
                parent::saeubern($seaubernplus);
            }
        }
    }
?>

index.php

PHP:
<?php session_start();
$md5ip = md5($_SERVER['REMOTE_ADDR']);
include 'db.inc.php';
include 'conf.inc.php';
include 'class.inc.php'; 
?>
    <html name="html">
        <head>
            <link rel="stylesheet" href="screen.css" type="text/css"/>
            <script type="text/javascript" src="jquery.js"></script>
            <script type="text/javascript" src="script.js"></script>
        </head>
        <body name="body">
            <?php
                $mensch = new Mensch('malte');
                $haus = new Haus();
                $mensch->hausSaeubern('Besen');
                echo $haus->sauberkeit;
            ?>
        </body>
    </html>
 
Werbung:
Du hast das Konzept von OOP nicht verstanden.
extends verlangt ein Kind von der parent-Klasse.

Oder bist du ein Haus? Ein Mensch ist kein Haus.
Das wäre Vererbung:

Lebewesen
- Säugetier
-- Mensch
--- Kind
--- Erwachsener
-- Hund
-- Katze
- Vogel
-- Rabe
-- Taube
 
Es ist auch nur dafür, damit ich per Mensch auf Haus zugreifen kann, udn das geht ja nur über Vererbung, aber mein eigentliches Problm ist damit auch net gelöst!!!!
 
Werbung:
Es ist auch nur dafür, damit ich per Mensch auf Haus zugreifen kann, udn das geht ja nur über Vererbung,
Quatsch, das geht z.b. über Schnittstellen.
Und wenn dein Skript zur Veranschaulichung von OOP dienen soll ist es eben dafür reichlich ungeeignet, wenn du eine Vererbungshirachie benutzt die keinen Sinn macht.

Dein Eigentliches Problem ist, das du hier zwei Objekte hast, einmal einen Mensch der ein Haus ist und ein Haus. Reinigen tust du den Hausmensch und die Sauberkeit ausgeben tust du von dem Haus.
 
Nein, ich säubere doch das Haus, indem ich dem Mensch sage er soll die funktion beim haus ausführen, udn was sind diese schnittstellen?
 
PHP:
interface Haus {}

class Eigenheim implements Haus
{
    public $address = '';
    public $rooms = 0;

    // darf nicht manipulierbar sein
    protected $_sauberkeit = 50;
    public function saeubern($prozent) 
    {
        $this->_sauberkeit = $this->_sauberkeit + $prozent;
        if ($this->_sauberkeit >= 101) {
            $this->_sauberkeit = 100;
        }
    }
}
und dann Dependency Injection:
PHP:
class Mensch
{
    protected $_home = null;

    public function setHome(Haus $home)
    {
        $this->_home = $home;
        return $this;
    }
    public function getHome()
    {
        return $this->_home;
    }
}
und dann:
PHP:
$frank = new Mensch();
if (null === $frank->getHome()) {
    print "Frank is homless\n";
}

$julia = new Mensch();
$julia->setHome(new Eigenheim());
$julia->getHome()->saeubern(10);

Das Problem bei solchen Beispielen, ist dass man diese zwar leicht verstehen kann, diese aber meilenweit von echten Anwendungen entfernt sind. Wenn man sich Bibliotheken oder ganze Frameworks ansieht hat man, meiner Meinung nach, mehr davon.
 
Werbung:
Zumal es viele Wege gibt.

Ich würde den Mensch als Bewohner des Hauses betrachten und dann dem Mensch eine Funktion putzen, die (in dem Beispiel) auf das jeweilige Haus wirkt. Ich bin nicht Sattelfest was Entwurfsmuster angeht, aber ich denke das wäre eine Delegation.

Darüber hinaus ist auch das Putzwerkzeug ein Objekt. Mein Ansatz wäre:
PHP:
class Haus
{
    private $bewohner = null;
    
    protected $_sauberkeit = 0;
    public function putzen() 
    {
        if($this->bewohner) {
            $this->_sauberkeit += $this->bewohner->putzen();
        } else {
            echo "kein Bewohner!";
        }
        
        if ($this->_sauberkeit >= 101) {
            $this->_sauberkeit = 100;
        }
    }
    public function reinheit()
    {
        return $this->_sauberkeit;
    }
    public function einzug(Mensch $neuer_bewohner) 
    {
        $this->bewohner = $neuer_bewohner;
    }
}  

interface ReinigungsApparat{
    public function putzen();
}

class Besen implements ReinigungsApparat{
    
    public function putzen(){
        return 20;
    }
    public function name(){
        return 'Besen';
    }
    
}

class Mensch
{
    private $besen;
    private $name;
    
    public function __construct($n)
    {
        $this->name = $n;
        $this->besen = new Besen();
    }
    public function name()
    {
        return $this->name;
    }
    public function putzen()
    {
        return $this->besen->putzen();
    }
}  

$julia = new Mensch('Julia');
$eigenheim = new Haus();
$eigenheim->einzug($julia);
$eigenheim->putzen();

echo $julia->name() . " putzt, das Haus hat eine Reinheit von:" . $eigenheim->reinheit() . '%';
 
Zurück
Oben