[ Príspevkov: 12 ] 
AutorSpráva
Offline

Zmazaný užívateľ
Zmazaný užívateľ
Obrázok užívateľa
NapísalOffline : 13.11.2014 7:22 | OOP PHP problémy začiatočníka

Tak pánové, prečítal som si cca 12-13 článkov o OOP na itnetwork.cz
Musím vyjadriť svoju radosť z toho, že som mnohé veci pochopil. Každopádne, mám otázku, ktorá sa týka public a private metód. Teda skôr by som potreboval utvrdenie, že tomu dobre rozumiem. Totiž dlhú dobu som nevedel prísť na rozdiel medzi public a private (a na dôvod, prečo proste nemôže byť všetko public)?

Svojim spôsobom ide o to, že ku public mám prístup vždy. Ku private iba vnútri danej triedy (čiže súboru class.php). To vlastne spôsobuje, že nemôžem v programe zrobiť niečo, čo by ovplyvnilo inak dôležitú (resp. skrytú?) vlastnosť daného objektu. Neviem či som to dobre pochopil, ale takto to momentálne vnímam. Čiže príklad

Majme triedu classClovek.php. Vytvoríme si instanciu človeka s mojim menom
$Mego= new Clovek();

Ja ako človek mám určité vlastnosti - nejako sa volám, mám svoj vek, veľkosť topánky a srdcový rytmus. Teda vytvorenie by mohlo vyzerať takto:

$Mego = new Clovek("Mego","21","42","65bpm");

A teraz ak bude so sebou pracovať niekde v kóde, nechcem dovoliť, aby sa priamo mohol zmeniť moj srdcový rytmus (pulz). Preto by srdcový rytmus bola private vlasnosť.
private $pulz;

Ako objekt však viem vykonávať určité veci (metódy), ktorými viem tento pulz ovplyvňovať. To by bola napr. metóda behaj(), ľahni(). Tie by boli public, pretože v kóde potom môžem volať
$Mego->behaj();
Z čoho vyplýva, že táto metóda mi zvýši pulz. Nepriamo. Priamo pulz zmeniť nemôžem, ale cez inú metódu môžem...

Dobre tomu rozumiem?


Offline

Správca fóra
Správca fóra
OOP PHP problémy začiatočníka

Registrovaný: 08.08.09
Príspevky: 12516
Témy: 41 | 41
Bydlisko: Martin
NapísalOffline : 13.11.2014 8:06 | OOP PHP problémy začiatočníka

Áno. Keby si mal niektorý z nich public, napríklad veľkosť topánky, mohol by si ho zmeniť úplne jednoducho: $Mego->velkostTopanky = '-1497';
Určite vidíš ten problém, čo toto môže spôsobiť - preto sa používajú (ak treba, niekedy sa atribúty nesmú meniť) get a set metódy, ktorými vieš privátne atribúty zmeniť aj po vytvorení inštancie triedy - pri getMeno len vrátiš meno, pri setMeno môžeš skontrolovať, či meno nie je číslo, či neobsahuje nepovolené znaky, či, či, či...a keď hej, vyhodíš napríklad výnimku - to pri $Mego->velkostTopanky = '-1497'; urobiť nemôžeš.
Aj keď budeš mať metódu napr. behaj(), aj tak odporúčam vo vnútri nemeniť atribúty priamo, ale prostredníctvom nejakej set metódy - nie je to vždy nutné, ak sa ale v metóde behaj vyskytne vstupný parameter od užívateľa a ten budeš chcieť preniesť do atribútu, musel by si ho dva krát validovať (v tejto metóde, aj v set metóde) a je väčšia šanca, že na niečo zabudneš. (Toto nie je až taký super príklad, ale existujú aj prípady, kedy sa to vyložene oplatí robiť)

Napokon ešte pre kompletnosť:
Public - metódy a atríbuty prístupné v celej aplikácií používajúcej danú triedu.
Private - metódy a atribúty prístupné len v triede.
Protected - metódy a atribúty prístupné v triede a jej potomkoch.


_________________
always is always wrong
Offline

Zmazaný užívateľ
Zmazaný užívateľ
Obrázok užívateľa
Napísal autor témyOffline : 13.11.2014 8:28 | OOP PHP problémy začiatočníka

jj, o potomkoch som tiež čítal... ale potomci dedia iba public a protected metody nie?

A ešte jedna vec - v robote na vlastnom CMS používame atribúty s označením "global" to je čo?

// Spojený príspevok 13 Nov 2014, 09:29

Ohľadom dedenia ešte jedna vec... napr. hra travian, asi mnohí poznáte. Sú tam useri a potom sú tam plus useri, to sú tí, čo si zaplatili za to, aby mali určité privilégia. Dá sa povedať, že to funguje tak, že existuje nejaká trieda hráčov, dajme tomu classPlayer.php A Existuje trieda VIP userov (to sú tí, ktorí si zaplatili), dajme tomu classVip.php

Čiže vlastne classVip extends classPlayer ak dobre rozumiem? VIPčkari podedia všetky vlastnosti hráčov, navyše majú nejaké nové metódy a vlastnosti, ktoré bežní hráči nemajú, pretože oni si za to zaplatili.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1719
Témy: 0 | 0
NapísalOffline : 13.11.2014 9:55 | OOP PHP problémy začiatočníka

Pri tých používateľoch je, takmer určite, rozdielna len jedna hodnota v databáze a všetko je ošetrené rovnakým kódom. Väčšina toho, čo sa týka rozdielnych možností používateľov sa spracováva na iných miestach (napr. ak má VIP špeciálnu mapu, tak je obsluha iná pri mape) a so samotnou triedou používateľa to nemá spoločné nič (od používateľskej triedy to chce vedieť len to, v akej skupine sa ten používateľ nachádza).


Offline

Skúsený užívateľ
Skúsený užívateľ
OOP PHP problémy začiatočníka

Registrovaný: 29.10.07
Prihlásený: 12.06.17
Príspevky: 1408
Témy: 28 | 28
Bydlisko: Bratislava
Vek: 36
NapísalOffline : 13.11.2014 10:24 | OOP PHP problémy začiatočníka

K povodnej , trochu filozofickej, uvahe preco vlastne private a nie rovno vsetko public: Mat vsetko public je rovnako nevhodne, ako zadeklarovat vsetky premmene ako globalne. Zvysuje to riziko chyb a lahsie sa v tom ako programator stratis. Ja preferujem uplne opacny pristup... co najmenej globalnych a public veci :)

Samozrejme s rozumom, niekedy to hodne ulahci pracu, ale v principe: cim menej toho vidiet navonok, tym lepsie.


_________________
PC: OS: Windows 10 (64bit) CPU: INTEL Core i5-4440 GPU: ASUS ATI R9280X RAM: Kingston 8GB DDR3 1600MHz MB: MSI B85-G43 Gaming HDD: Seagate 1TB HDD Barracuda SSD: SAMSUNG 120GB HDD 840 EVO CASE: COOLERMASTER N400
Mobil: OS: Android 4.4.2 Model: LG G2 D802 16GB
Offline

Zmazaný užívateľ
Zmazaný užívateľ
Obrázok užívateľa
Napísal autor témyOffline : 13.11.2014 11:58 | OOP PHP problémy začiatočníka

Stále som nechápal, čo znamená volať metodu zvonka... Znamená to, že nemôžem proste zavolať private metodu v inom subore ako v tom, kde je definovana? Teda v podstate private function pulz() {blabla} umiestnenú v classClovek.php môžem volať iba v tomto classClovek.php a nikde inde? V žiadnom indexe.php, v žiadnom mod_clovek.php, ani nikde inde, iba v tej klase, kde je definovana ?
Napr. v classClovek.php

private funcion pulz() {blabla}
a v tom istom súbore niekde nižšie môžem mať napr.
public function lieky() {
$this->pulz(); // zistim si aktualny pulz a na zaklade neho sa rozhodnem, či mam užiť lieky, alebo nie
if($this->pulz()>$hranica) {
echo 'Zober lieky';
}else {
echo 'Neber lieky';
}
}

Index.php
$Mego->pulz();
Tak mi to povie "Fuck Off" ?

Ja viem, že toto sú debilné otázky, ale už som viackrát zastal na tom, že niečo nešlo tak, ako som to pochopil, preto sa radšej pýtam. Čiže otázka znie, či "Volanie zvonku" znamená používať metódu inde ako v classe, kde je definovaná?


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 06.02.14
Prihlásený: 16.11.17
Príspevky: 451
Témy: 9 | 9
NapísalOffline : 13.11.2014 12:17 | OOP PHP problémy začiatočníka

privatne metody z vonku volat nemozes, iba public (rovnako ako premenne). privatne metody sluzia na "vnotorne potreby".

takze ty mozes zavolat lieky()
$mego->lieky();
a vo funkcii lieky mozes volat aj privatnu funkciu pulz().
ale nemozes zavolat $mego->pulz() lebo mimo triedy k nej pristup nemas.

inak ty sa pytas na volanie z ineho subora - tu nejde o to ci je to v inom subore alebo v tom istom, ale ci je to v danej triede alebo mimo. lebo v ramci jedneho suboru mozes mat aj viac tried
sobor: triedy.php:
Kód:
class Class_1 {
 public function lieky() {
  $this->pulz(); // bude fungovat
 }
 public function pulz() {
  ...
 }
}
class Class_2 {
 $mego = new Class_1();
 $mego->pulz(); // nebude fungovat
 $mego->lieky(); // bude fungovat
}

$mego = new Class_1();
$mego->pulz(); // nebude fungovat
$mego->lieky(); // bude fungovat



Offline

Skúsený užívateľ
Skúsený užívateľ
OOP PHP problémy začiatočníka

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14691
Témy: 66 | 66
Bydlisko: Žilina
Vek: 30
NapísalOffline : 13.11.2014 12:40 | OOP PHP problémy začiatočníka

Ostatní ti už odpovedali, tak si hádam z toho pochopil.. Ak nie, kľudne sa pýtaj. Ja sa chcem vyjadriť k jednej drobnosti. Nikdy nenazývaj súbor popisne ako to robíš ty "classPlayer.php" a podobne. Miesto toho si vytvor vo svojom projekte adresáre a tam budeš vedieť, že sú iba triedy, entity a podobne. Prehľadná adresárová štruktúra je dosť dôležitá. Čiže by si mal adresár napr /Entity/ a v tom by si mal súbor Player.php . Ideálny stav je ten, kedy máš jednu triedu v jednom súbore a ten súbor sa volá presne tak, ako trieda. Čiže vieš, že v tom Player.php bude trieda s názvom Player.
A ako povedal aj hatto, nemýľ si triedu so súborom. V jednom súbore môžeš mať definovaných viac tried (nemal by si, ale pointa je dôležitá). Prístup public/private/... je závislý od toho, kde v kóde sa nachádzaš, nie v ktorom súbore.


_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
OOP PHP problémy začiatočníka

Registrovaný: 28.02.11
Prihlásený: 15.12.17
Príspevky: 178
Témy: 6 | 6
Bydlisko: Levice
Vek: 31
NapísalOffline : 13.11.2014 12:46 | OOP PHP problémy začiatočníka

hatto13: Máš tam chybu:
Kód:
class Class_1 {
 public function lieky() {
  $this->pulz();
 }
 public function pulz() { // tu má byť private statement
  ...
 }
}


_________________
Neznalosť zložitých operácií necháva myseľ otvorenú pre geniálne riešenia založené na jednoduchosti.
Offline

Zmazaný užívateľ
Zmazaný užívateľ
Obrázok užívateľa
Napísal autor témyOffline : 13.11.2014 12:51 | OOP PHP problémy začiatočníka

Chápem, čiže to v preklade pre smrteľníka znamená, že nemôžem private funkciu danej triedy použiť inde, ako v tejto triede... Tak?

Ale zároveň nemôžem ani použiť nikde inde pulz, ako je tá class, v ktorej je private metoda definovaná nie? Nemôžem si predsa v indexe používať private metody... či môžem? Kua, už som z toho zase magor... čo to znamená, volať metódu zvonka? Zvonka čoho? A dnuka v čom?


Offline

Skúsený užívateľ
Skúsený užívateľ
OOP PHP problémy začiatočníka

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14691
Témy: 66 | 66
Bydlisko: Žilina
Vek: 30
NapísalOffline : 13.11.2014 12:57 | OOP PHP problémy začiatočníka

Stále hovoríme z pohľadu triedy. Definícia triedy je toto

Kód:
class Player{
    ... // vnútri - tu môžeš použiť public, private, protected
}

// vonku - tu môžeš použiť iba public...
// mohol by si aj protected, ale LEN v prípade, že daný objekt (v ktorom voláš protected) dedí alebo je parentom triedy, kde je protected metóda/vlastnosť zadefinovaná


_________________
C#, PHP, ...
Offline

Zmazaný užívateľ
Zmazaný užívateľ
Obrázok užívateľa
Napísal autor témyOffline : 13.11.2014 13:29 | OOP PHP problémy začiatočníka

No však presne to tvrdím vyššie, z čoho vyplýva, že som to asi dobre pochopil... Teda len v classe a nikde inde... tak?

// Spojený príspevok 13 Nov 2014, 14:18

Ale je to super to OOP, už sa tešim, keĎ kupim v sobotu PC, že hneď skusim dačo primitivne zbuchať v OOP :D


 [ Príspevkov: 12 ] 


OOP PHP problémy začiatočníka



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

PHP OOP

v PHP, ASP

3

126

18.02.2013 7:20

DeiForm

V tomto fóre nie sú ďalšie neprečítané témy.

OOP PHP

v PHP, ASP

1

309

29.04.2010 17:32

stenley

V tomto fóre nie sú ďalšie neprečítané témy.

[PHP] OOP diskusia

v PHP, ASP

7

2137

30.03.2015 12:59

majky358

V tomto fóre nie sú ďalšie neprečítané témy.

OOP v PHP

[ Choď na stránku:Choď na stránku: 1, 2 ]

v PHP, ASP

41

2172

28.11.2009 16:01

Tominator

V tomto fóre nie sú ďalšie neprečítané témy.

OOP v PHP

v PHP, ASP

1

615

02.06.2009 11:02

walther

V tomto fóre nie sú ďalšie neprečítané témy.

oop php - vyuzitie, vyhody

[ Choď na stránku:Choď na stránku: 1, 2 ]

v PHP, ASP

32

1890

24.05.2008 15:04

Tominator

V tomto fóre nie sú ďalšie neprečítané témy.

database class, oop php

v PHP, ASP

10

499

16.02.2010 15:12

rooobertek

V tomto fóre nie sú ďalšie neprečítané témy.

PHP OOP MYSQLi Class

v PHP, ASP

6

312

08.04.2012 15:42

lolexc

V tomto fóre nie sú ďalšie neprečítané témy.

oop v php - predavanie udajov

v PHP, ASP

1

188

16.02.2010 19:06

Ďuri

V tomto fóre nie sú ďalšie neprečítané témy.

snake´ove PHP problemy :)

v PHP, ASP

23

999

04.02.2009 12:40

snake2

V tomto fóre nie sú ďalšie neprečítané témy.

Vymazanie index.php a následné problémy(wordpress)

v Redakčné systémy

3

210

29.04.2014 21:55

Mego

V tomto fóre nie sú ďalšie neprečítané témy.

Samsung Galaxy Mini- Problémy, problémy, problémy

v Smartfóny a tablety

1

962

20.02.2012 9:28

erikoo

V tomto fóre nie sú ďalšie neprečítané témy.

Rada pre začiatočníka

v Grafické programy

4

562

19.12.2009 12:07

PaegasPasto

V tomto fóre nie sú ďalšie neprečítané témy.

Steam- otazky zaciatocnika

v Ostatné programy

13

2779

20.11.2011 16:28

KatjushaMan

V tomto fóre nie sú ďalšie neprečítané témy.

Linux pre zaciatocnika

v Operačné systémy Unix a Linux

8

517

30.04.2009 21:17

branislav.poldauf

V tomto fóre nie sú ďalšie neprečítané témy.

pomoc pre začiatočníka C++

v Assembler, C, C++, Pascal, Java

7

449

06.08.2012 13:20

marian_r



© 2005 - 2017 PCforum, edited by JanoF