Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kysymys PHP:n oliomallista

Triton [02.04.2011 12:16:05]

#

Olen miettinyt PHP:n oliomallista erästä asiaa... Javassahan on olemassa kahden laisia tietotyyppejä: primitiivisiä tyyppejä sekä viittaustyyppejä. Se, mikä minua kiinnostaisi tietää on se, että onko PHP:n oliomallissa käytetty samanlaista ratkaisua kuin Javassa eli viittaustyyppien kohdalla muuttujassa on vain viite varsinaiseen olioon ja taas varsinainen olio sijaitsee jossain muualla muistialueella, vai samanlaista ratkaisua kuin C++:ssa, eli varsinainen olio sijaitsee myös itse muuttujan sisällä... Itse epäilisin tuota C++:ssan ratkaisua, mutta koska en ole asiasta täysin varma, niin halusin vielä varmistaa sen...

Grez [02.04.2011 12:31:49]

#

Missäköhän yhteydessä sillä on mitään merkitystä? PHP:ssä et voi kuitenkaan hypistellä muistialueita eikä siellä pysty harjoittamaan pointteriaritmetiikkaa. Edes muuttujan osoitetta ei taida olla mahdollista saada selville PHP:llä itsellään.

Ottaen huomioon, että PHP:ssa ei voi määritellä muuttujan tietotyyppiä, ja toisaalta muuttujia voi määritellä ja poistaa lennossa, niin muuttujien täytyy olla jonkinlainen sanakirja, josta on viittaukset varsinaisiin tietoihin.

Näyttää siltä, että jopa ihan perustyypit on viittauksia. Esim. seuraavan tulos on mielenkiintoinen:

<?
$joo = 7;
debug_zval_dump($joo)
?>

petrinm [02.04.2011 12:46:04]

#

Tämä voisi selventää asiaa: https://www.php.net/manual/en/language.oop5.references.php

Metabolix [02.04.2011 13:06:14]

#

Grez, käsititkö ehkä kysymyksen väärin? Asiallahan on merkitystä jo yksinkertaisessa sijoituksessa $a = $b;

Triton, toimii kuten Javassa, eikö tullut mieleen kokeilla?

class A {
  public $x = 0;
}
$a = new A();
$a->x = 1;
$b = $a;
$b->x = 2;

echo $a->x, $b->x; // 22

Myös tavallisiin muuttujiin saa viittauksia ("aliaksia") &-merkillä hieman kuten C++-kielessäkin. Niitä käyttäessä kannattaa pitää visusti huoli, että kyseisen aliasmuuttujan näkyvyysalue loppuu pian tai että se poistetaan unset-komennolla.

$a = array("b" => array("c" => 1));
$a["b"]["c"] = 2;
$c =& $a["b"]["c"];
$c = 3;

echo $a["b"]["c"], $c; // 33

unset($c);
$c = 4;
echo $a["b"]["c"], $c; // 34

Grez [02.04.2011 13:40:58]

#

Metabolix kirjoitti:

Grez, käsititkö ehkä kysymyksen väärin? Asiallahan on merkitystä jo yksinkertaisessa sijoituksessa $a = $b;

No joo, siinä puhuttiin olion olemisesta muuttujan sisällä, jonka ajattelisin tarkoittavan sitä, että varataan valmiiksi muistia olion tarvetta ajatellen samoin kuin varattaisiin C:ssä vaikka int -tyypille. Ja lisäksi puhuttiin muistialueista. Eli mielestäni joko kysymys oli sekavasti kirjoitettu tai siinä kysyttiin miten kielet "sisäisesti" toimii, eikä sitä miten ne käyttäjän kannalta toimii.

Toki jos ymmärtää kysymyksen niin, että kysytään miten se toimii käyttäjän kannalta, niin kysymyksessä on enemmän järkeä.

Triton [02.04.2011 14:02:45]

#

Metabolix kirjoitti:

Triton, toimii kuten Javassa, eikö tullut mieleen kokeilla

Niin no kyllähän se olisi tosiaan kokeilemalla selvinnyt :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta