Skocz do zawartości

[PHP] Brak zmiennych w wczytywanym pliku


Markuz

Rekomendowane odpowiedzi

Mam taką sobie klase :

 

class themeFunctions {

    public $file;
    
    function changeFileTheme($name) {
        $this->file = $name;
    }

    function showFileTheme() {
        require_once('theme/theme-'.$this->file.'.php');
    }
}

 

Teraz chce wyswietlic dany plik :

 

$themeFunctions -> changeFileTheme("register");
$themeFunctions -> showFileTheme();

 

Plik sie wyswietla ale zmienne juz nie , tzn. w tym załączonym pliku pisze np. echo $zmienna;

A w kodzie przed wyświetleniem pliku jest $zmienna=5;

To nie wyświetla się 5 , zmienna nie istnieje nawet.

Proszę o pomoc :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Rozumiem, że masz tak:

$zmienna = 5;
$themeFunctions -> changeFileTheme("register");
$themeFunctions -> showFileTheme();

Błąd jest oczywisty. Plik przez require jest wczytywany tylko do metody (tak jakby wstrzyknięcie kodu), zatem ma dostęp tylko do zmiennych w zasięgu metody i do zmiennych klasy. Czyli do $this;

 

Swoją zmienną musisz przekazać do obiektu klasy themeFunctions, żeby była tam dostępna. Ja zrobiłbym to tak:

 

class themeFunctions {

    public $file;
    private $data = array();
    
    function changeFileTheme($name) {
        $this->file = $name;
    }

    function showFileTheme() {
        require_once('theme/theme-'.$this->file.'.php');
    }

    function setData($name,$val) {
        $this->data[$name] = $val;
    }

    function getData($name,$def = NULL) {
        if (!empty($this->data[$name])) return $this->data[$name];
        return ($def === NULL) ? NULL : $def;
    }
}

 

I później zamiast $zmienna = 5;

$themeFunctions -> setData('zmienna',5);

 

a w pliku dołączonym przez require:

 

echo $this->getData('zmienna');

 

Oczywiście jeszcze fajniej będzie użyć metod magicznych __get, __set i __call.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Że zamiast getData i setData, mozna sobie ułatwić życie, jak chociażby $this->zmienna, czy $this->getZmienna(); ? Uważam, że fajniej, bo możesz sobie dostosować kilka kolejnych rzeczy w ten sposób.

Odnośnik do komentarza
Udostępnij na innych stronach

Gnysek błęda wywala :

 

Fatal error: Can't use method return value in write context in D:\*****\theme\theme-login.php on line 1

 

plik theme-login.php :

 

<?php if(!empty($this -> getData('info'))) { ?>
<div class='bigpanel-panel'><div class='bigpanel-head'>Informacja</div><div class='bigpanel-body'>
<?php echo $this -> getData('info') ?>
</div></div>
<?php } ?>
<div class='bigpanel-panel'>
    <div class='bigpanel-head'>Logowanie</div>
    <div class='bigpanel-body'>
        <form action='login.php' method='POST'>
        <table>
        <tr><td>Login</td><td><input type='text' name='nazwa' /></td></tr>
        <tr><td>Hasło</td><td><input type='password' name='haslo' /></td></tr>
        <tr><td></td><td><input type='submit' name='ok' value='Zaloguj się' /></td></tr>
        </table>
        </form>
    </div>
</div>

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...