Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak ogarnąć funkcje i klasy oraz zasięg zmiennych w klasach
Forum PHP.pl > Forum > Przedszkole
Stiffler
Witam,
Staram sie ogarnac Joomla Api i VirtueMart. W sprawach PHP i programowania OOB jestem bardzo słaby, dlatego też mam pare pytań.

Znalazłem sobie dokumentacje od VirtueMart Api ale niestety nie potrafie używać klas.

Np:

  1. public function getCartPrices($checkAutomaticSelected=true) {
  2.  
  3. if(!class_exists('calculationHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'calculationh.php');
  4. $calculator = calculationHelper::getInstance();
  5.  
  6. $this->pricesUnformatted = $calculator->getCheckoutPrices($this, $checkAutomaticSelected);
  7.  
  8. return $this->pricesUnformatted;
  9. }


Ta funkcja zwraca wartość koszyka(tzn. łączną kwote za wszystkie produkty), nawet jeżeli sie myle, to chciałbym stworzyć skrypt który mi wypisze na ekranie tą wartość (nawet jeżeli to bedzie cos innego niz wartosc ksozyka).

A więc znajduje się ona w klasie VirtueMartCart.
Czy ja musze stworzyć nowy obiekt?

$nowyobiekt = new VirtueMartCart;
echo $nowyobiekt->getCartPrices(); ?

Jaka mam pewnosć ze zobrazuje to wartość danego uzytkownika (tego któremu będzie się wyświetlał skrypt), bo przeciez może ich być tysiące zalogownych, z resztą wydaje mi sie że stworzyłem nowy czysty obiekt. (chyba brakuje tu słówka "this" którego nie dokonca rozumiem w OOB).

Czy to wystarczy? Czy moze wczesniej trzeba uzyć tysiąca innych klas aby "ta" klasa miała wystarczające informacje aby zwrócić dane?

Jezeli zaincluduje plik z tą klasą to to wystarczy aby ta klasa zwróciła wynik? Czy powinienem też zainculdować inne skrypty?

Wiem ze to MEGA masło maślane, ale naprawde OOB nie jest zbyt przyjazne dla początkującego użytkownika.
Jeżeli coś jest nie jasne, prosze pytać. Postaram się to wyjasnic w jakis inny sposób.
Turson
Cytat
prawach PHP i programowania OOB jestem bardzo słaby

Jak już to OOP

Cytat
$nowyobiekt = new VirtueMartCart;
echo $nowyobiekt->getCartPrices(); ?

Ok

Cytat
Jaka mam pewnosć ze zobrazuje to wartość danego uzytkownika (tego któremu będzie się wyświetlał skrypt), bo przeciez może ich być tysiące zalogownych

Musisz zidentyfikować użytkownika

Cytat
chyba brakuje tu słówka "this" którego nie dokonca rozumiem w OOB

Nie brakuje, a $this można w twojej metodzie pominąc i zastąpić "normalną" zmienną, bo $this oznaczałoby, że możesz się do tej zmiennej odwołać bezpośrednio w innej metodzie, klasie itd.

Cytat
Jezeli zaincluduje plik z tą klasą to to wystarczy aby ta klasa zwróciła wynik? Czy powinienem też zainculdować inne skrypty?

Wystarczy. Poczytaj o __autoload
Stiffler
Dziekuje za szybką odpowiedź.
Dzięki niej wraz z wujkiem google, znalazłem odpowiedzi na wiele pytań.
Aczkolwiek jest jeszcze pare nierozwiązanych kwestii.

Cytat
Jak już to OOP


No właśnie OOP na każdym kroku stawia kłody pod nogi wink.gif
Chociaż, przeglądając dzisiaj dokumentacje VirtueMart, zauważyłem że jest oparty o MVC. (o którym czytałem przez ostatnie dwa dni i dzieki temu nabrało ono odrazu wielkiego sensu. Czy to znaczy że danej na temat ile kasy jest w koszyku, powinienem szukac w VirtueMartModelVirtueMart a nie w VirtueMartControllerVirtueMart?



Cytat
$nowyobiekt = new VirtueMartCart;
echo $nowyobiekt->getCartPrices(); ?



A co jeżeli ja chciałbym pracować na obiekcie który jest obecnie w pamięci i jest używane przez zalogowanego użytkownika? Mam wrażenie że tworze nowy czysty obiekt, i że dopuki sam go nie "zmanipuluje" to nie będzie zawierał żadnych danych. Chyba że się myle?

Cytat
Musisz zidentyfikować użytkownika


Wydaje się to logiczne. Tylko skąd to wiesz, jeżeli chodzi o programistyczny punkt widzenia? W tej przykładowej funkcji mam:

Kod
$calculator = calculationHelper::getInstance();


Wygląda to jak jakieś pobieranie sesji...
Nawet jeśli miałbym identyfikować użytkownika to jak przekazać tą informacje tej przykładowej funkcji?

Cytat
Nie brakuje, a $this można w twojej metodzie pominąc i zastąpić "normalną" zmienną, bo $this oznaczałoby, że możesz się do tej zmiennej odwołać bezpośrednio w innej metodzie, klasie itd.


Prawie to mam, ale wciąż nie jestem pewny swoich przemyśleń. Ogólnie $this oraz -> , w php lekko mnie przeraża i jest częstym powodem nie jesności w skryptach.
Np. czy dzięki -> moge tworzyć "podzmienne" ? Ze w zmiennej $calc chce podzmienna $max i zrobić $calc->max = 200; ?

Złapałem bakcyla na punkcie nauki php. Uczyłem sie innych języków w przeszłości, ale niestety z marnym dorobkiem się to skończyło.

ps. Mam nadzieje, że sam VirtueMart nie jest tutaj problemem. Przypadkowo się za niego zabrałem, ponieważ miałem pewien cel do zrealizowania, który z założenia miałbyć prosty, a skończyło się na OOP MVC MYSQL... smile.gif

ps2. Zastanawiam się, jak wygląda nauki takiego API przez rasowego programiste, który okiełznał nie jedną dokumentacje. Czy to są minuty, godziny, dni, miesiące, lata? Jak to powinno wyglądać w dobrym stylu?

W bólach i zdeterminowaniu pozdrawia
Stiffler

// PO EDYCJI

Nie całe 100 osób zobaczyło ten wątek i nie ma odpowiedzi na moja "drugą" serie pytań.
Czy to za wiele?
Moze te pytania nie nadają się do "przedszkola" i powinny wylądować gdzie indziej?
Czy może te pytania są tak banalne że aż trudno na nie odpowiedzieć?
vonski
Cytat
Nie całe 100 osób zobaczyło ten wątek i nie ma odpowiedzi na moja "drugą" serie pytań.
Czy to za wiele?
Moze te pytania nie nadają się do "przedszkola" i powinny wylądować gdzie indziej?
Czy może te pytania są tak banalne że aż trudno na nie odpowiedzieć?


Spokojnie, jest weekend, nasza polska ekstraklapa gra, ludzie mają wolne. Cierpliwości wink.gif

Cytat
A co jeżeli ja chciałbym pracować na obiekcie który jest obecnie w pamięci i jest używane przez zalogowanego użytkownika? Mam wrażenie że tworze nowy czysty obiekt, i że dopuki sam go nie "zmanipuluje" to nie będzie zawierał żadnych danych. Chyba że się myle?


Tak, wyrażenie $nowyobiekt = new VirtueMartCart; tworzy nowy obiekt typu VirtueMartCart. Natomiast na ile dany obiekt jest "czysty" zaraz po utworzeniu, to już zależy od samej klasy (czyli w tym przypadku VirtueMartCart) - zapewne więcej informacji na ten temat znajdziesz w dokumentacji.

Cytat
Wygląda to jak jakieś pobieranie sesji...
Nawet jeśli miałbym identyfikować użytkownika to jak przekazać tą informacje tej przykładowej funkcji?


Nie znam VirtueMart, ale klasa calculationHelper kojarzy się bardziej z klasą pomocniczą do obliczeń (jakieś VAT-y może, P&P etc. ?) niż z klasą, która miała by cokolwiek wspólnego z identyfikacją użytkowników. Ale gdybać sobie można, ponownie odsyłam do dokumentacji smile.gif

Cytat
Prawie to mam, ale wciąż nie jestem pewny swoich przemyśleń. Ogólnie $this oraz -> , w php lekko mnie przeraża i jest częstym powodem nie jesności w skryptach.
Np. czy dzięki -> moge tworzyć "podzmienne" ? Ze w zmiennej $calc chce podzmienna $max i zrobić $calc->max = 200; ?


$this jest tak naprawdę obiektem na którym aktualnie dana metoda operuje. $this, czyli "ten", czyli w domyśle "ten obiekt, na rzecz którego została wywołana metoda". Generalne trzeba zdać sobie sprawę z zasadniczej różnicy między klasą i obiektem. I tak, operator -> pozwala Ci tworzyć "podzmienne", np. $calc->max = 200; Owe twory doczekały się nawet swojej nazwy - są to tzw. właściwości. Co więcej $this razem z operatorem "->" pozwala Ci tworzyć powyższe w bardziej elegancki (i bardziej preferowany w OOP) sposób, za pomocą tzw. "setterów" czyli metod które nadają jakąś wartość właściwości:

  1. class Foo
  2. {
  3. public $max;
  4.  
  5. // setter
  6. public function setMax($max)
  7. {
  8. $this->max = $max;
  9. }
  10. }
  11.  
  12. $a = new Foo();
  13. $b = new Foo();
  14.  
  15. $a->setMax(10);
  16. $b->setMax(20);


Mam nadzieję, że to Ci przybliży mniej więcej jak działa $this.

Generalnie to wszystko to są podstawy (podstaw) OOP więc raczej nie będziemy tu na forum robić kursu tej techniki programowania. Poszukaj jakiegoś kursu w necie, albo nawet lepiej, zainwestuj w jakąś dobrą książkę o obiektowym PHP (a w ogóle najlepiej po prostu przeczytaj to http://www.php.net/manual/en/language.oop5.php), a jak będziesz miał problem z jakimś konkretnym przykładem, zagadnieniem, czy kawałkiem kodu, to myślę, że na pewno uzyskasz pomoc na tutejszym forum smile.gif
Stiffler
Podstawy podstaw... A wydawało mi się że zaszedlem już tak daleko, aczkolwiek to oznacza tylko więcej zabawy wink.gif
Ciągle mam trochę pytań. Mianowicie jeżeli mówimy o klasach i funkcjach a nawet (chyba) o mvc, to czy mają one jakieś zaleznosci? Przyjmijmy że znalazłem tą klasę do wyświetlania informacji z koszyka. Czy jest ona niezależna? Czy po zaincludowaniu jej i wywolaniu dostane ta informacje? Czy może przed jej wywolaniem (funkcji) powinienem zacząć od innych z danej lub innej klasy? Jak to się ma ogólnie w programowaniu OOP? Funkcja przyjmuje parametr $cart więc powinienem znalesc inną która go zwraca? To trochę trudne do wytłumaczenia, ale mam nadzieję że mnie zrozumieliscie wink.gif
vonski
Cytat
Przyjmijmy że znalazłem tą klasę do wyświetlania informacji z koszyka. Czy jest ona niezależna? Czy po zaincludowaniu jej i wywolaniu dostane ta informacje? Czy może przed jej wywolaniem (funkcji) powinienem zacząć od innych z danej lub innej klasy? Jak to się ma ogólnie w programowaniu OOP?


Zależy smile.gif
Jeżeli do utworzenia klasy skorzystano z innych klas, to wtedy rzecz jasna dana klasa jest od nich zależna. W OOP jest to nazywane agregacją. Częstym przykładem agregacji jest np. samochod - każdy samochód posiada silnik (no ok, prawie każdy) więc klasa Samochod może wyglądać np. tak:

  1. class Samochod
  2. {
  3. public $silnik;
  4.  
  5. public function __construct(Silnik $silnik)
  6. {
  7. $this->silnik = $silnik;
  8. }
  9. }


Oczywiście jest to tylko przykład mający na celu pokazać zależoność między klasami Silnik i Samochod. W momencie tworzenia obiektu typu Samochod, obie klasy muszą być parserowi znane (poprzez "znane" mam na myśli dołączone poprzez include / require, albo zdefiniowane w tym samym pliku co wyrażenie new Samochod()). Jeśli którejś z nich braknie, wtedy wyświetli Ci sie błąd w stylu Class 'Silnik' no found.... To odnośnie Twojego pytania czy dostaniesz jakąś informacje na temat koniecznych do utworzenia obiektu klas. Tak, ten błąd będzie informacją smile.gif

Drugim przypadkiem zależności klas jest dziedziczenie (bądź implementacja interfejsów, ale z punktu widzenia powyżego jest to to samo). Tzn. klasa B może dziedziczyć pewne właściwości / metody z klasy A. Np. powyższa klasa Samochod moze dziedziczyć z klasy Pojazd (każdy samochód jest pojazdem):

  1. class Pojazd
  2. {
  3. public $kolor;
  4. }
  5.  
  6. class Samochod extends Pojazd
  7. {
  8. // nie ma potrzeby definiowania właściwości $kolor, bo jest ona dziedziczona z Pojazd
  9. }


I tutaj podobnie podczas tworzenia obiektu Samochod również obie klasy muszą być znane parserowi.


Cytat
Funkcja przyjmuje parametr $cart więc powinienem znalesc inną która go zwraca?


Ponownie - zależy. Jeśli $cart spodziewa się typu np. Cart, czy VirtueMartCart itp. to tak, musisz przekazać parametr właśnie tego typu. Zapewne jest to w dokumentacji smile.gif

Generalnie z doświadczenia mogę Ci powiedzieć, że jeśli "wydzierasz" jakąkolwiek klasę z jakiegokolwiek framework-a, to na 99% będzie ona zależna od innch klas.
Stiffler
Dzięki za szybką odpowiedź. Robię w pracy dwie godziny overtime'a i mam zamiar to wszystko przemyslec. Ogolnie trudnosc polega na tym ze jestem samoukiem i nawet w moioim otoczeniu nie mam z Kim o tym pogadac. Druga sprawa ze moze ta dokumentacja jest slaba bo nie wszystkie funkcje sa wytlumaczone.(a moze tak wszedzie jest). Wstepnie probowalem szukac $cart ale jeszcze tego tak dokladnie nie sprawdzalem. Druga sprawa to czy moze jest jakis sposob na ustalenie drzewa zaleznosci klas?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.