Aplikacja OOP - Pytanie.

0

Witam, mam do was pytanie, a mianowicie piszę pewną aplikację ucząc się oop i mam problem.
Mam plik index.php w nim includuje kilka plików z klasami i każdą z osobna wywołuje. I teraz jak jestem w wewnątrz 3 klasy, jak mogę odwoływać się do zmiennych z innych klas a dokładnie 1,2 klasy? Nie wiem czy dobrze tutaj to opisałem.. Gdy używałem zmiennych globalnych to wszystko działało, ale jak zrobić to inaczej? Z tego co czytałem, to zmienne globalne to złe rozwiązanie, więc proszę was o pomoc.

0

Nie możesz się odwoływać do pól innych klas nie mając ich instancji.

Pokaż uproszczony konkretny przykład - być może w ogóle źle myślisz. Przepisywanie aplikacji napisanej funkcyjnie na OOP wymaga nie tylko opakowania wszystkiego w klasy, ale przede wszystkim gruntowanego przemyślenia architektury całej aplikacji.

1

jak mogę odwoływać się do zmiennych z innych klas

Możesz to zrobić, ale tylko jeżeli zmienne są statyczne.

class Foo {
    public static $counter = 0;
}

Taka zmienna, to zmienna przypisana do klasy, czyli nie potrzebujesz instancji tej klasy (obiektu), żeby z niej skorzystać. Klasa to trochę tak jak przepis na tort, a instancja klasy (obiekt) to jak już tort gotowy do zjedzenia.

Foo::$counter++;
echo Foo::$counter; // 1
Foo::$counter++;
echo Foo::$counter; // 2

Poza zmiennymi statycznymi są jeszcze zmienne instancyjne (lub pola klasy, jak to nazwał Patryk), czyli powiązane z instancją danej klasy (obiektem). Są one kontrolowane modyfikatorami dostępu:

class Foo {
    public static $counter = 0;

    public $zmiennaPubliczna = 0;
    protected $zmiennaChroniona = 0;
    private $zmiennaPrywatna = 0;
}

Ponieważ są to zmienne instancyjne, to potrzebujesz instancji danej klasy (obiektu), żeby się do nich odwołać:

$foo = new Foo(); // obiekt/instancja klasy Foo
$foo->zmiennaPubliczna++;
echo $foo->zmiennaPubliczna; // 1

Do pozostałych zmiennych nie możesz się dobrać z zewnątrz i to własnie tych modyfikatorów powinieneś używać. Istotą OOP jest hermetyzacja.

Hermetyzacja polega na ukrywaniu pewnych danych składowych lub metod obiektów danej klasy tak, aby były one dostępne tylko metodom wewnętrznym danej klasy.

Na koniec powtórzę, bardzo mądrą rzecz, którą napisałeś, czyli: zmienne globalne to złe rozwiązanie i dlatego powinieneś używać modyfikatorów private i protected i kontrolować dostęp do tego co w Twojej klasie siedzi. Publiczne powinno być minimum konieczne.

To tak na zachętę, bo nie chce mi się tutaj robić wywodu, które już milion osób zrobiło :) Ogarnij kilka filmików na temat OOP, np. ten:

0

Dzięki za szybkie odpowiedzi, lecę brać się za kodzenie, oby owocne.
Będę się jeszcze odzywał jak coś..

0

Też się trochę po mądruje i dodam swoje 3 grosze.
Nie można też powiedzieć, że zmienne globalne to złe rozwiązanie, bo czasem się przydają. Chociaż nie no, to bardziej stałe się przydają no dobra zmienne to złe rozwiązanie.
Można użyć dziedziczenia i wtedy klasa potomna będzie miała wszystko to co rodzic plus jakieś tam swoje rzeczy. Chyba najważniejsze jest nauczenie się kiedy robić klasy.
Ja staram się stosować taką metodę, że co ma tabele w bazie to jest klasą - news, użytkownik, menu, komentarz, kategoria. Kolumny w bazie to pola klasy. A rzeczy które potrzebuje z tym zrobić to metody. Pobierz, zmodyfikuj, usuń. No do tego jeszcze potrzebne jest coś do obsługi obiektów tych klas.

0

Poczytaj o referencji. Przekazujesz obiekt za pomoca referencji do drugiego obiektu za pomoca metody. Jak bedzie dzien to rozpisze przyklad.

1 użytkowników online, w tym zalogowanych: 0, gości: 1