Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyświetlanie zawartości pliku poprzez klasę.
Forum PHP.pl > Forum > Przedszkole
Tanner963
Witam
Próbuję napisać metodę, która wyświetli/podepnie mi zawartość pliku jak include(itd.)
Fragment kodu:
  1. public function inc($path){
  2. include($path);
  3. }

Nie działa -> wyświetla białą stronę. Wyświetlanie błędów mam ustawione...
Próbowałem też z return, ale dalej to samo :|

Jak to rozwikłać? Z góry dzięki za pomoc wink.gif
Pozdrawiam
peter13135
a co w tym pliku się znajduje ?
Tanner963
Głównie zmienne. Echo tam nie występuje. Plik php. Jeszcze dodam, że zmienne z pliku chce obsługiwać też poza klasą.
by_ikar
Poczytaj o zasięgu zmiennych. Nie działają ci dlatego że zmienne wewnątrz klasy/funkcji są ograniczone zasięgiem tylko do konkretnej klasy/funkcji i albo bawisz się w global (czyli cofasz się wstecz) albo inaczej projektujesz swoją aplikacje.
Tanner963
Zrozumiałem, że nie da się inkludować plików poprzez klasy w właściwy sposób...
Ale się upewnię smile.gif
Czyli ten kod:
  1. ...
  2. echo 'Zawartość:';
  3. include($path);
  4. ...

nie zadziała w ten sposób:
  1. ...
  2. echo 'Zawartość:';
  3. $class->inc($path);
  4. ...


questionmark.gif

Bo nie wiem co mam w klasie napisać...
  1. include($path);
  2. //ani
  3. return include($path);
  4. //ani
  5. return (include($path));

Nie działa sad.gif
by_ikar
Nie rozumiesz, da się dołączyć plik (require/include) za pomocą klasy/funkcji, tyle że zmienne które masz w tym pliku, ograniczą się jedynie do tej funkcji/metody w klasie. Taki jest zasięg zmiennych.

Odnośnie return, return'em możesz zwrócić coś z funkcji, co może być przekazane dalej, ale wciąż musisz tego użyć w nieco inny sposób. Jeżeli wiesz jakie zmienne są w tym pliku, powiedzmy w wszystkich plikach konfiguracyjnych masz zmienną $config, wówczas możesz sobie wykonać to tak:

Kod
<?php


class Foo
{
    protected $filePath = '/sciezka/do/pliku/';
    
    public function load($fileName)
    {
        $fileName = basename($fileName);
        
        if(is_readable($this->filePath.$fileName))
        {
            include $this->filePath.$fileName;
            
            if(isset($config))
            {
                return $config;
            }
        }
    }
}


$conf = new Foo();

$appConf = $conf->load('konfiguracja_applikacji.php');

var_dump($appConf);


Tyle że to prawdę mówiąc jest sztuka dla sztuki, równie dobrze mógłbyś tylko raz użyć tego nieszczęsnego include gdzie ci potrzeba. Stwórz sobie jedną klasę, niech nawet ma metody statyczne, raz załaduj konfigurację i wrzuć w jakąś właściwość (zmienną obiektu) całą konfigurację i konkretną metodą pobieraj już gotową konfigurację. Przynajmniej tak to robię u siebie i póki co jest dość wygodnie.
Tanner963
Ok rozumiem wink.gif a co zrobić jeżeli występuje tam echo?
by_ikar
No to wtedy już niestety leżysz. Jeszcze jedno przyszło mi do głowy jak wracałem do domu, możesz w pliku zrobić coś takiego:

includowany plik:

Kod
<?php

$someVariable = array(1,2,3,4,5,6,7,8,9);

return $someVariable;


i twoja klasa ładująca dane zmienne:

Kod
<?php

class Foo
{
    protected $filePath = '/sciezka/do/pliku/';
    
    public function load($fileName)
    {
        $fileName = basename($fileName);
        
        if(is_readable($this->filePath.$fileName))
        {
            return include $this->filePath.$fileName;
        } else
        {
            //wyjątek, komunikat błędu, false, null - co wolisz, w tym przypadku zwrócę false, normalnie rzuciłbym wyjąkiem
            return false;
        }
    }
}


$conf = new Foo();

$appConf = $conf->load('konfiguracja_applikacji.php');

var_dump($appConf);


W efekcie nie będziesz musiał wszystkich zmiennych mieć takich samych, ale będziesz musiał pamiętać żeby na końcu zwrócić tą zmienną, poprzez return. W podobny sposób chyba nawet działa konfiguracja w kohanie 3, nie jestem dokładnie pewien, ale widziałem tam właśnie pliki konfiguracyjne na końcu których był return i tak jakoś mi się skojarzyło wink.gif
abort
Ja też od niedawna zgłębiam tajniki obiektowego pisania w PHP. Wcześniej conieco pisałem bezobiektowo, ale stwierdziłem, że nawet na starość warto nauczyć się czegoś nowego. Miałem podobny problem, zresztą nawet opisałem go na forum: Temat: PHP obiekty nie widza zmiennych z inkludowanych plikow
Założeniem jest składnia pliku konfiguracyjnego (u mnie config.php) w postaci tablicy:

  1. $config['sql']['host'] = "localhost";
  2. $config['sql']['user'] = "user";
  3. $config['sql']['pass'] = "password";
  4. $config['sql']['dbname'] = "database";
  5. $config['sql']['conn'] = "persistent";
  6. $config['sqltables']['login']['users'] = "users";
  7. $config['sqltables']['login']['logusers'] = "logusers";


No i zgodnie z założeniami naskrobałem... "coś". Nie jest może estetyczne, niemniej... działa tak jak tego oczekuję:

class.config.php:
  1. class Config {
  2. // array of config values
  3. private $config = array();
  4.  
  5. // Constructor - fetches all configuration data from cfg file
  6. function Config ($configfile="./config.php") {
  7. $handle=fopen ($configfile, "r");
  8. while (!feof ($handle)) {
  9. $line = fgets ($handle);
  10. if (preg_match ('/\s*\$(.*)\s+=\s+(.*)/', $line)) {
  11. $to_eval = preg_replace ('/\$/', '$this->', $line);
  12. eval ($to_eval);
  13. }
  14. }
  15. fclose ($handle);
  16. }
  17.  
  18. // returns first-level tree of config data. $tree must be string value
  19. function getTree ($tree) {
  20. if (is_string ($tree)) {
  21. return ($this->config ["$tree"]);
  22. } else return ($this->getSubtree ($this->config, $tree));
  23. }
  24.  
  25.  
  26. // walk deeper into subarray. Indexes specified in array
  27. function getSubtree ($subarray, $subtree) {
  28. if (is_array ($subtree)) {
  29. if (count ($subtree) == 1) {
  30. list ($subtreename) = $subtree;
  31. return ($subarray["$subtreename"]);
  32. }
  33. $first = array_shift ($subtree);
  34. return ($this->getSubtree ($subarray["$first"], $subtree));
  35. }
  36. }
  37.  
  38. } // class Config


A do samej klasy odwołuję się gdzie indziej w sposób:
  1. $cfg = new Config ();
  2.  
  3. $this->session_time = $session_lifetime;
  4. $this->menu_page = $menu_page;
  5. $this->login_page = $login_page;
  6. $this->sql_tables = $cfg->getTree (array ('sqltables', 'login')); // pobiera z config.php tablicę/wartość $config['sqltables']['login']
  7. $this->sql_config = $cfg->getTree ('sql'); // pobiera z config.php wartość/tablicę $config['sql'] -


Założeniem tego było, że modyfikacja pliku konfiguracyjnego jest dokonywane przez UPRAWNIONE osoby (są ustawione właściwe prawa w systemie) i aplikacja NIE ZAPISUJE nic do pliku konfiguracyjnego.

Fachowców proszę o skomentowanie tej klasy, widać nie tylko ja miałem taki problem z inkludowaniem w obiektach...
by_ikar
Kod
$handle=fopen ($configfile, "r");
while (!feof ($handle)) {
$line = fgets ($handle);
if (preg_match ('/\s*\$(.*)\s+=\s+(.*)/', $line)) {
$to_eval = preg_replace ('/\$/', '$this->', $line);
eval ($to_eval);
}
}
fclose ($handle);


Niestety za ciekawie to nie wygląda, zarówno eval jak i parsowanie każdej linijki dwoma wyrażeniami.. Mój system konfiguracji wygląda znacznie prościej, jest znacznie szybszy, a użycie jest łatwiejsze, nie wspominając o możliwościach (odnoszenie się wewnątrz konfiguracji, do innej konfiguracji). Tyle że do tego potrzebne jest kilka rzeczy, osobiście używam yamla, bardzo mi się spodobał za pierwszym razem jak tylko go zobaczyłem i od tamtego czasu niczego więcej nie wyobrażam sobie używać do zapisywania konfiguracji wink.gif jak się używa yamla, dobrze było by zapisywać wyniki parsowania, żeby niepotrzebnie nie parsować każdorazowo, tak więc dodatkowo potrzebne jest cache. Jak potrzebna jest tylko konfiguracja, to używanie kilku klas może wydawać się przesadą, tyle że w przypadku większej całości, to pozostałe klasy są przeważnie wykorzystywane gdzie indziej jeszcze, więc to nie ma znaczenia. A konfiguracji u siebie używam tak:

Kod
<?php

Config::get('framework.default_database');
Config::get('framework.cache.driver');


A plik konfiguracji powiedzmy mniej więcej wygląda tak:

Kod
framework:
    default_locale:     [pl_PL, pl, polish]
    default_timezon:    Europe/Warsaw
    default_language:   pl_PL
    default_database:   %database.common%
    cache:
        driver:     file
        lifetime:   3600
        enabled:    true

database:
    common:
        driver:     sqlite
        dbname:     %path.apps%/data/common.db


Czytelnie w zapisie, łatwe w użyciu wink.gif
Tanner963
Ok, dzięki wink.gif Rozumiem.
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.