Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziedziczenie zwykłych zmiennych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Asmox
Podczas pisania kontrolera napotkałem pewien problem. Struktura klas wygląda następująco: jest klasa abstrakcyjna kontroler i dziedzicząca z niej klasa strona. W klasie controller jest przykładowa metoda:
  1. abstract class controller
  2. {
  3. // (...)
  4. public function a() {
  5. $a = 'A';
  6. }
  7. // (...)
  8. }

natomiast w klasie dziedziczącej jest taki kod:
  1. class strona extends controller
  2. {
  3. // (...)
  4. public function a() {
  5. parent::a();
  6. echo $a
  7. }
  8. // (...)
  9. }

Wszystko uprościłem dla jasności: zwykła zmienna zadeklarowana w metodzie przodka nie chce się wyświetlać w metodzie klasy pochodnej mimo wykonania metody przodka. Czy da się w jakiś sposób sprawić, aby $a była widoczna w w metodzie strona->a() ?
Fifi209
To tak jakbyś zrobił:

  1.  
  2. function test() {
  3.  
  4. $a = 'a';
  5.  
  6. }
  7.  
  8. function b() {
  9. test();
  10.  
  11. echo $a;
  12.  
  13. }


Nie możesz tak zrobić.
crocodillo
Nie da się. Jedyne wyjście to przenieść tą zmienną na zewnątrz funkcji, tzn. zadeklarować w klasie, nie wewn. funkcji
jx1
Zwróć $a returnem z metody przodka, albo wywołując parent::a() przekaż do metody przodka zmienną przez referencję parent::a(&$a)
by_ikar
W przypadku każdej funkcji/klasy zawsze jesteś ograniczony zasięgiem zmiennych. Zmienne tworzone wewnątrz funkcji mają zasięg tylko do tych funkcji (z wyjątkiem zmiennych statycznych), możesz skorzystać z właściwości klasy (zmienne obiektu) i tam przypisywać wartość i ją jakby tymczasowo przetrzymywać.

Kod
<?php


abstract class controller
{
    protected $a;

    public function a()
    {
        $this->a = 'A';
    }
}

class strona extends controller
{
    public function a()
    {
        parent::a();
        
        echo $this->a;
    }

}
Robert3d
zmienne powinny być
protected
public

NIE

private

a przepraszam by_ikar wyjaśnił to na przykładzie.
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.