phpbar.de logo

Mailinglisten-Archive

[php] PHP OOP Frage

[php] PHP OOP Frage

Johannes Schlueter schlueter at phpbar.de
Sam Mai 22 20:55:35 CEST 2004


Hi,

On Saturday 22 May 2004 19:50, Martin Abraham wrote:
> Hab folgendes Beispiel und möcht gerne wissen, wieso ich vor
>
> Z35:
> $this->objId->strFgstNr = $strFgstNr;

Wäre schön gewesen dieuach zu markieren ;-)

> kein:
> $this->objId = new FzgIdKlasse();
>
> einfügen muss.
>
>
> Code:
>
> <?

[...]

> class AutoKlasse extends Fahrzeugklasse{
>
> var $strMarke, $strTyp;
>
> function AutoKlasse($strMarke,
> $strTyp,$nBaujahr,$strFgstNr,$strHerstNr){
> 	$this->strMarke = $strMarke;
> 	$this->strTyp = $strTyp;
> 	$this->nBaujahr = $nBaujahr;
> 	$this->nBaujahr = $nBaujahr;
> 	$this->objId->strFgstNr = $strFgstNr;
> 	$this->objId->strHerstNr = $strHerstNr;
> }

Hier wird $this->objId kein Objekt von FzgIdKlasse sondern von stdClass. 
Richtigerweise sollte aber, wie Du schon vermutet hast, zunächst ein 
FzgIdKlasse-Objekt zugewiesen werden.

stdClass ist das einfachst-mögliche Objekt ohne Methoden oder Properties:
<?php
var_dump(new stdClass());
?>
object(stdClass)(0) {
}
(Mit Hilfe der Reflection-API von PHP5 kann man auch sehen, dass es keine 
Methoden hat - siehe http://schlueters.de:8000/phpstuff/php5/reflection.php 
-> stdClass und Doku)

stdClass ist dabei die Klasse, die genutzt wird, wenn man mit dem -> Operator 
auf eine Variable zugreift, die bisher noch kein Objekt war.
<?php
$a = NULL;
echo "\$a = NULL:\n";
var_dump($a);

$a->foo = 'bar';
echo "\n\$a->foo = 'bar':\n";
var_dump($a);
?>

Führt zu 

$a = NULL:
NULL

$a->foo = 'bar':
object(stdClass)(1) {
  ["foo"]=>
  string(3) "bar"
}

Ich hoffe das irgendwie verständlich gemacht zu haben ;-)

(gilt übrigens alles für PHP4 und PHP5)

> function __clone(){
> 	FahrzeugKlasse::__clone();
> }

Als Antwort auf Deine andere Mail:
Nötig ist es nicht:

<?php
class A {
    function __clone() {
        echo "Cloning";
    }
}

class B extends A {}

$foo = new B();
$bar = clone $foo;
?>

Gibt "Cloning" aus. Wenn man aber die __clone() nochmal überschreibt hat man 
die Erinnerung, dass man einen eigenen Clone-Handler für die Klasse hat was 
insbesondere dann interessant ist, wenn man jetzt beim klonen der 
abgeleiteten Klasse (AutoKlasse bzw. in meinem Beispiel oben B) auch einen 
Clone-Handler braucht und nicht vergessen will den eigentlichen (von 
FahrzeugKlasse bzw. bei mir A) Handler aufzurufen.
Was ich aber etwas schöner (und "sauberer") finde ist "parent" statt des 
Klassennamens zu nutzen, also
<?php
function __clone() {
    parent::__clone();
}
?>

johannes

php::bar PHP Wiki   -   Listenarchive