ugrás a tartalomhoz

objektum tulajdonságának elérése másik objektumból

vaso123 · 2007. Okt. 11. (Cs), 14.02
Sziasztok!

A kérdésem az, hogy hogyan lehet elérni egy class-ból egy másik objektum egy értékét ?

van egy ilyenem:

$site=new site();
$site->initialization($action);
$menu=new menu();

majd
class menu {
function akarmi() {
echo $site->valamely_erteke;
}
}

amikor a menu-n belül var_dump-olom a $site objektumot, NULL -t kapok vissza, gondolom ez normális is.
a kérdésem tehát az, hogy létre kell hoznom a menu objektumon belül újra a $site objektumot, vagy elkerülhető ez valahogy ?
 
1

::

dOMiNiS · 2007. Okt. 11. (Cs), 14.07
http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php
erre gondolsz?
2

nem teljesen

vaso123 · 2007. Okt. 11. (Cs), 14.16
hát nem egészen, mert nem konstans ami nekem kéne.
azt meg tudom csinálni, hogy írok egy függvényt, hogy
$menu=new menu;
$menu->set_value("valtozonev",$site->ezkene);

de ez így nem hatékony, mert ugye ha van tenmillion változóm, akkor...

van ez a $site=new site; objektumom, itt tárolok el egy halom információt az oldalról, ez minden php -ban lefut.
aztán van egy különleges esetem, amikor másféle menüt kell használnom, mint eredetileg.
erre találtam ki a $menu=new menu; objektumot.

azaz, nem szeretném már példányosítani mégegyszer a site-ot, hiszen az már egyszer megvan.
csak szeretném a menü objektumban egy tulajdonságát használni, de nem tudom, hogyan érhetném el.
3

$GLOBALS?

Wabbitseason · 2007. Okt. 11. (Cs), 14.25

class menu {
  function akarmi() {
    echo $GLOBALS['site']->valamely_erteke;
  }
}
4

szuper

vaso123 · 2007. Okt. 11. (Cs), 14.31
ez jó lesz. köszönöm.
5

Class vs Globals

janoszen · 2007. Okt. 11. (Cs), 14.35
Ugye érzed hogy a class meg a globals nem igazán egy filozófiából származnak? Erre találták ki a static kulcsszót.
6

???

Wabbitseason · 2007. Okt. 11. (Cs), 15.10
Fejtsd ki bővebben, kérlek!
7

OOP szemlélet

janoszen · 2007. Okt. 11. (Cs), 15.52
Röviden és tömören: az OOP pont arról szól hogy elfedjük a belső funkcionalitást. Ebbe nem illik bele a mindenki mindent lát kategóriás $GLOBALS.
9

Ez világos, de

Wabbitseason · 2007. Okt. 11. (Cs), 16.12
Hogyan segít ezen a static ebben az esetben?
10

Static...

janoszen · 2007. Okt. 11. (Cs), 16.36
Például így:

<?php
class Menu
{
 static function valami()
 {
 }
}

class Mas
{
 function valami()
 {
  Menu::valami();
 }
}
El kellene olvasni a belinkelt manualt, az valszeg segítene. :) Az osztályok nem függvénytárolók és ha a menüt mindenhonnan el kell érni akkor valószínűleg tervezési hiba van.
12

Instance vs Object

Wabbitseason · 2007. Okt. 11. (Cs), 16.46
A feladvány úgy kezdődött, hogy
- létrejött egy példány a "site" osztályból,
- és van egy "menu" példányunk is, ami
- a létrehozott "site" példány egy propertyjét írja ki
- az "akarmi" metódusban.

A "Menu::valami()" tényleg ugyanezt csinálná?
13

Megoldható...

janoszen · 2007. Okt. 11. (Cs), 18.42
Ez egy egyszerű példa volt a static használatra. Tervezésileg eleve hülyeségnek tartom azt, hogy a menü mint adatszerkezet összevegyítését a sitetal mint megjelenő objektummal.

Ha procedurális filozófiával próbálsz OOP-t tervezni nyilván nem fogod tudni megvalósítani a dolgokat. Ez kb olyan, mint ha autóvezetés után fölülnél a vonatra és amiatt panaszkodnál hogy nem tudsz vele most gyorsan jobbra elkanyarodni...
14

Re:Instance vs. Object

Csiszár Attila · 2007. Okt. 11. (Cs), 20.05
Szerintem előbb tedd fel magadnak a kérdést, tényleg szükségem van az egyes osztályok példányosítására?
Az első válaszod bizonnyal igen lesz, hiszen nyílván így kapcsolsz adatokat hozzájuk, amit csak egy konstruktorral tehetsz meg, gondolnád te,

DE!
A static pont ennek elkerülésére szolgál. A staticcal létrehozott változók, függvények létrejönnek a programkód futásakor, így bármikor elérhetőek, nem kell hozzá példányosítanod az osztályod!

[Függvények esetében ez nyilván csak a szebb-logikusabb programozást segíti. Sajnos PHP-ban nem sokat kell/nem sokat törődnek az oszálytagok/függények láthatóságával(public protected, private).]

Fentebb szóba kerültek a konstansok. A static felfogásban kicsit hasonlít a konstansokhoz, de PHP-ban a konstansok nem tartalmazhatnak kiértékelő kifejezéseket(logikus is, hiszen a konstanst a fordító automatikusan behelyezi a programkódba), helyettük vannak a static kulccsal generált változók. Amelyeket Bármikor megváltoztathaszt a programkód futásakor.

a végére egy kis példakód magyarázat:

class Site{
 static $var;
}

Site::$var = 2;

class Menu{
  public function mutat() {
      print Site::$var;
}
}
Egyébként a PHPManual inkább ide vágóbb része. A fentebb linkelt oldal a fügvényeken belüli static kulcsszóra vonatkozik. Remélem így már érthetőbb a dolog!
15

PHP és gányolás

Wabbitseason · 2007. Okt. 12. (P), 10.33
Sajnos PHP-ban nem sokat kell/nem sokat törődnek az oszálytagok/függények láthatóságával(public protected, private).

A PHP világában sok más érdekesség is megfigyelhető.

http://www.php.net/source.php?url=/index.php#pagefooter

Idézek az oldal forráskódjából:
/*
If you're reading this, it isn't because you've found a security hole.
this is an open source website. read and learn!
*/

// DO NOT REMOVE THIS COMMENT (the RSS parser is dependant on it)
21

OOP szemlélet

Balogh Tibor · 2007. Okt. 16. (K), 12.53
Az osztály absztrakt adattípus. (Vagy a beépített változótípusok osztályok? :)) Az hogy most az a példányosított osztály (változó) melyik névtérben helyezkedik el, honnan látható és honnan nem az mindegy. Sőt, egy $site objektum hol helyezkedne el, mint a globális névtérben?
Az egységbezárás az objektum belső szerkezetére vonatkozik. Adat és viselkedés egységére. Egy statikus metódus valójában függvény, amit egy osztály burkol.

$site = new Site;

function foo(){
  global $site;
  //...
}

function bar(){
  global $site;
  //...
}
Ugyanez pepitában

$site = Site::singleton();

function foo(){
  $site = Site::singleton();
  //...
}

function bar(){
  $site = Site::singleton();
  //...
}
8

hogyan

vaso123 · 2007. Okt. 11. (Cs), 15.55
Nem igazán értem ezt....

Tudnál nekem ide írni egy példát, az én gondomra ?
11

Fentebb

janoszen · 2007. Okt. 11. (Cs), 16.37
Lásd fentebb
16

Singleton

goph-R · 2007. Okt. 12. (P), 10.48
Ha jól értem, akkor neked van egy egyke osztályod, amiből egy példány kell, hogy legyen a futás alatt. Nem biztos, hogy ez a legszebb megoldás, de én így szoktam csinálni:

class Singleton {

  function getInstance() {
    static $ins = false;
    if ( !$ins ) {
      $ins = new Singleton();
    }
    return $ins;
  }

}

class Foo {

  function bar() {
    $singleton = &Singleton::getInstance();
  }

}
17

PHP4 vagy PHP5?

Hodicska Gergely · 2007. Okt. 12. (P), 13.43
PHP4 esetén kéne egy & a függvény definiciónál, PHP5 esetén pedig nem kell a & getInstance híváskor. :)

Illetve PHP5 esetén érdemes még a statikusan használt függvényt statikusnak definiálni, meg csinálni egy private konstruktort.


Üdv,
Felhő
18

4-es akart lenni :)

goph-R · 2007. Okt. 15. (H), 12.18
Igazából 4-esben akartam írni, de az & jel tényleg lemaradt. Köszi!
19

PHP 4

janoszen · 2007. Okt. 15. (H), 13.40
Azt ugye tudod, hogy Dec 31 a PHP 4 élete praktikusan véget ér?
22

Tudom

goph-R · 2007. Okt. 23. (K), 10.46
Tudom, az én cuccaim már 5-ösben készülnek, viszont azt nem tudom, a választ miért 4-esben írtam (nehéz a szakítás :)
20

5-6

winston · 2007. Okt. 15. (H), 17.21
érdemesebb 5-re fejleszteni, több okból is: a 4 lassan kifut, olyannyira, hogy lassan a 6-os jön majd, ráadásul az 5-ben sokkal több lehetőség van. ráadásul mostmár a host szolgáltatók is elkezdtek kapcsolni, és átállogatni ötösre. persze, ha nem máshol hosztolod, akkor ez az akadály fel se merül ;)