PHP OOP, referencia, tömb (valamelyik ezek közül) probléma
Sziasztok!
Akadt egy problémám, amit a következő kóddal próbálnék illusztrálni. Utána, ha addig eljuttok, a kérdéseim:Kérdéseim a következők:
ha az 1. hely-nél szerepel ez a kód:
akkor nem a kívánt eredményt kapom, azaz a bolhák száma 0 lesz és nem lesznek kilistázva a bolháim.
Ha ugyanez a két sor a 2. hely-en szerepel, akkor minden megy.
De bárhol szerepel az előbbi két sor, a
Szeretném valamilyen módon működővé tenni úgy, hogy a konstruktorban (1. hely) legyen az a két sor.
Ehhez kéne tanács!
P][G
■ Akadt egy problémám, amit a következő kóddal próbálnék illusztrálni. Utána, ha addig eljuttok, a kérdéseim:
<?php
class Bolha{
var $_nev;
function Bolha($nev){$this->_nev=$nev;}
}//Bolha
class Kutya{
var $_nev;
var $_bolhak=array();
var $_bolhaListazo;
function Kutya($nev){
$this->_nev=$nev;
//+++++++++ 1. hely +++++++++++++++
$this->_bolhaListazo=new BolhaListazo();
$this->_bolhaListazo->_kutya=&$this;
}
function ujBolha(&$bolha){if (is_object($bolha)) $this->_bolhak[]=&$bolha;}
function bolhaLista(){
//+++++++++ 2. hely +++++++++++++++
//$this->_bolhaListazo=new BolhaListazo();
//$this->_bolhaListazo->_kutya=&$this;
$this->_bolhaListazo->lista();
}
}
class BolhaListazo{
var $_kutya;
var $_bolhak=array();
function BolhaListazo(){}
function lista(){
echo $this->_kutya->_nev.'<br />';
echo 'Bolhák száma: '.count($this->_kutya->_bolhak);
$this->_bolhak=&$this->_kutya->_bolhak;
foreach ($this->_bolhak as $bolha){
echo $bolha->_nev;
}
}
}
$bloki=new Kutya('Blöki');
$bloki->ujBolha(new Bolha('Józsi'));
$bloki->ujBolha(new Bolha('Pisti'));
$bloki->ujBolha(new Bolha('Peti'));
$bloki->bolhaLista();
?>
ha az 1. hely-nél szerepel ez a kód:
$this->_bolhaListazo=new BolhaListazo();
$this->_bolhaListazo->_kutya=&$this;
$this->_bolhaListazo->_kutya=&$this;
akkor nem a kívánt eredményt kapom, azaz a bolhák száma 0 lesz és nem lesznek kilistázva a bolháim.
Ha ugyanez a két sor a 2. hely-en szerepel, akkor minden megy.
De bárhol szerepel az előbbi két sor, a
echo $this->_kutya->_nev.'<br />';
mindig kiírja a kutya nevét, szóval az objektumreferencia megvan.Szeretném valamilyen módon működővé tenni úgy, hogy a konstruktorban (1. hely) legyen az a két sor.
Ehhez kéne tanács!
P][G
PHP 4 bug/feature
$this
nem akar olyan jól működni, mint kéne neki (se régebbi, se vadiúj PHP-val se – próbáltam: 4.3.3 és 4.3.11).lehet a Zend baja, de Zend 2-ővel (PHP5) működött trendesen ...
bbalint
kis debug
$kutyá
ra, hogy csak egy referencia van rá, tehát ...az a sejtésem, hogy a $this csak ideiglenesen létezik, aztán mindenképp megszünteti a változót,
a PHP5 így jobban ojjektum-orientált, aztán a
$this
tényleg az aktuális objektumot jelenti.bbalint
a miért
$this
, hanem külön van programozva:PHP5 esetén van egy "globális"
this
(Execute Gloabls,EG(this)
), amit mindig "frissít"PHP4-ben "csak" egy $this változót hoz létre (és szüntet meg) a metódus-hívás elején/végén.
bbalint
recode
BolhaListazo
ra, "ráerőszakolom" akutyá
t, hanem a konstruktorának adom át:Ő nem bolhás
--
Ő nem egy bolha, hanem egy 'ló'!
Kutyuli neve: Bolhás
Ő bolhás, bolhái: Józsi, Pisti, Peti
--
bbalint
Köszi!
Egyébként azért még utánanéztem a dolognak, és több helyen írnak erről a viselkedésről, azaz a konstruktorban a $this-re való referencia létrehozásáról. Érdeklődőknek ajánlom! A probléma lényege:
Tehát az általam írt kódban a
erre írva:
már működőképes!
Egyébként, ha valakinél elérhető a PHP Anthology c. könyv, abban direkt ajánlják, hogy a new elé mindig tegyünk &-t (46. oldal)!
// Make sure $myObject is a reference to
// the variable created by the new keyword
$myObject = &new MyClass();
This looks odd at first, but remember, a variable created by the new keyword is being passed here—even if you can’t see it. The reference operator saves PHP from having to create a copy of the newly-created object to store in $myObject.
Ezek után úgy teszek!
P][G
kódolási stílus
StdClass
objektumot majd annak értékét teszi bele a változóba, majd az objektumot megszünteti.szóval, utóbbi változattal, memóriát, "időt" spórolok ezért használom.
bbalint
Na igen
P][G
nem stílus kérdése
Érdemes ezt a témát egyszer mindenkinek szépen lerendezni, kipróbálni a különböző lehetőségeket, mert ellenkező esetben nagyon aljas, nehezen debugolható hibákat vihetünk programjainkba.
Felhő
Újabb 'probléma'
A bolhás példánál maradva:
Így adunk új bolhát a kutyához. Hogy elkerüljük az esetlegesen bazi nagy objektumok másolgatását, ezért referenciák szerepelne. bbalint is így írta :-)
Csakhogy a for ciklusban az értékadás nem fog működni, mivel a végén lesz 5 darab bolha_4 nevű kutyánk. (a kiíratást lespóroltam a kódbból, de így lesz). Ennek oka egyértelműen a referenciák használata.
Megoldás lenne, ha lenne a bolha objektum konstruktorában adnánk meg annak nevét is és így hajtanánk végre a ciklust:
$bloki->ujBolha(new Bolha('bolha_'.$i));
}
Viszont előfordulhat, hogy a $bolha létrehozása után még egy csomó más tulajdonságát is be szeretnénk állítani. Ekkor nem tehetjük meg, hogy minden esetre felkészülve alkotjuk meg a konstruktor, mert az már átláthatlan lenne. Marad az, hogy nem használunk referenciát.
Így van, vagy valamit nagyon elnéztem?
(PHP 4.x)
P][G
ööö
for(;;);
-os kód rendesenbolha_0
,bolha_1
,bolha_2
,bolha_4
ésbolha_5
Bolhá
kat adogatja rá aKutyá
ra ...ami talán (biztos) segítség, hogy a ciklusban nem egy változóba teszed bele az összes
Bolhá
t, hanem egy "Bolhá
s" tömbbe:bbalint
Tömb - igen
A 'kutya-bolhásítás' csak egy leegyszerűsítése egy bonyolultabb problémának, ami nekem nem volt hajlandó működni. Mint írod, neked alapból működik a fenti kód. Úgy látszik az 'eredeti' kódban van még valahol máshol gubanc.
Egyébként köszi!
P][G