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
  1. class menu {  
  2.   function akarmi() {  
  3.     echo $GLOBALS['site']->valamely_erteke;  
  4.   }  
  5. }  
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:
  1. <?php  
  2. class Menu  
  3. {  
  4.  static function valami()  
  5.  {  
  6.  }  
  7. }  
  8.   
  9. class Mas  
  10. {  
  11.  function valami()  
  12.  {  
  13.   Menu::valami();  
  14.  }  
  15. }  
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:
  1. class Site{  
  2.  static $var;  
  3. }  
  4.   
  5. Site::$var = 2;  
  6.   
  7. class Menu{  
  8.   public function mutat() {  
  9.       print Site::$var;  
  10. }  
  11. }  
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.
  1. $site = new Site;  
  2.   
  3. function foo(){  
  4.   global $site;  
  5.   //...  
  6. }  
  7.   
  8. function bar(){  
  9.   global $site;  
  10.   //...  
  11. }  
Ugyanez pepitában
  1. $site = Site::singleton();  
  2.   
  3. function foo(){  
  4.   $site = Site::singleton();  
  5.   //...  
  6. }  
  7.   
  8. function bar(){  
  9.   $site = Site::singleton();  
  10.   //...  
  11. }  
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:
  1. class Singleton {  
  2.   
  3.   function getInstance() {  
  4.     static $ins = false;  
  5.     if ( !$ins ) {  
  6.       $ins = new Singleton();  
  7.     }  
  8.     return $ins;  
  9.   }  
  10.   
  11. }  
  12.   
  13. class Foo {  
  14.   
  15.   function bar() {  
  16.     $singleton = &Singleton::getInstance();  
  17.   }  
  18.   
  19. }  
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 ;)