Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zasięg zmiennej w funkcji i klasach
Forum PHP.pl > Forum > PHP
mcfreak
Cześć, zrobiłem prosty system pluginów na podstawie klas.

Mam kod:

  1. $text = 'tekst';
  2. $pluginy->init(1); # to samo co nizsza linijka czyli include('plugins/wyswietl/action.php'); tylko w klasie
  3. include('plugins/wyswietl/action.php');


i teraz tak: plugins/wyswietl/action.php wyświetla zmienną $text. wszystko zawarłem w komentarzach w linijce 2.

linijka 3 czyli include('plugins/pogrubianie/action.php'); wyświetli ją normalnie, za to
$pluginy->init(1) (równe include('plugins/pogrubianie/action.php')) jej nie wyświetli, "zasięgu nie ma" i zmienna nie zostanie wyświetlona bo będzie wynosiła 0.

jak zrobić, żeby wszystkie zmienne z poza klasy przechodziły na nią?

pozdro
Fifi209
Najlepiej przekazuj jako parametr do funkcji.

Ew. global
mcfreak
Cytat(fifi209 @ 5.07.2010, 13:01:11 ) *
Najlepiej przekazuj jako parametr do funkcji.

Ew. global


no właśnie, tylko, że to będzię uciążliwe dla większych projektów. na razie mam tak, że w pluginach zamiast pisać normalnie zmienne typu $text o tak: $GLOBALS["text"] - uciążliwe ale nie aż tak bardzo jak poprzednio
Fifi209
Cytat(mcfreak @ 5.07.2010, 13:06:37 ) *
no właśnie, tylko, że to będzię uciążliwe dla większych projektów. na razie mam tak, że w pluginach zamiast pisać normalnie zmienne typu $text o tak: $GLOBALS["text"] - uciążliwe ale nie aż tak bardzo jak poprzednio


  1.  
  2. $zmienna = 1;
  3.  
  4. class test {
  5. public function __construct() {
  6. global $zmienna;
  7. echo $zmienna;
  8. }
  9. }
  10.  
  11. $obj = new test();


hmm?
mcfreak
Cytat(fifi209 @ 5.07.2010, 13:13:53 ) *
  1.  
  2. $zmienna = 1;
  3.  
  4. class test {
  5. public function __construct() {
  6. global $zmienna;
  7. echo $zmienna;
  8. }
  9. }
  10.  
  11. $obj = new test();


hmm?


nie nie nie.

  1. public function init($iden = 0) {
  2. if ($dir = @opendir($this->path)) {
  3. while($file = readdir($dir)) {
  4. if($file!='..' and $file!='.') {
  5. $full = $this->path.'/'.$file;
  6.  
  7. if (is_dir($full)) {
  8. include($full.'/init.php');
  9. if ($id == $iden) {
  10. require_once($full.'/action.php');
  11. }
  12. unset($id);
  13. }
  14. }
  15. }
  16. closedir($dir);
  17. }
  18. }


nie mogę po prostu dodawać do tego każdych zmiennych jakie są w projekcie, bo tego było by od groma. to jest system pluginów... to i tak już jest wystarczająco niewydajne, ale to pozamieniam. wiem co to global i bym tego użył, ale tak po prostu nie moge

tak po za tym: czym się różni w klasach function od public function? czy ten zapis jest ważny?
phpion
Cytat(mcfreak @ 5.07.2010, 13:19:24 ) *
tak po za tym: czym się różni w klasach function od public function? czy ten zapis jest ważny?

Domyślnym modyfikatorem dostępu jest public, więc jeśli go jawnie nie zadeklarujesz to zostanie przyjęte właśnie public.
matrik
Plugin nie powinien być pisane w klasie tylko w funkcji.
Jeśli korzystasz z frameworka to pisz model.

Ale żeby przekazać zmienną $text do metody klasy to trzeba do metody dodać wartość, która zostanie odebrana i przekazana do środka metody, inaczej się nie da, na tym polega klasa.
Jeśli chcesz udostępniać zmienne klasy to polecam utworzenie jednej zmiennej i dodać na początku klasy
public $_zmienna = array();
----
wykonanie: $klasa = new klasa; echo $klasa->_zmienna['pole'];

lub statycznie
public static $_zmienna = array();
----wykonanie: echo Klasa::_zmienna['pole'];

Możesz także zrobić klase, która będzie jako tymczasowa baza zmiennych
class Baza{
public static $_zmienna = array();
public static $_zmienna2 = array();
public static $_zmienna3 = array();
public static $_config = array();
public static $_inne = array();
}

wtedy to tylko
Baza::_zmienna['pole'] = 'wartosc';

wykonanie w klasie
$zmienna_w_metodzie = Basa::_zmienna['pole'];

i po problemie smile.gif
wookieb
Cytat
Plugin nie powinien być pisane w klasie tylko w funkcji.

Dlaczego?

Cytat
Jeśli korzystasz z frameworka to pisz model.

A wiesz co to jest model? I co to za zależność o której piszesz?
matrik
plugin to kawałek kodziku, ewentualnie powinien pobierać inne pliki jeśli potrzebuje, powinien otrzymywać zmienne tylko przez argumenty a nie STALE/GLOBALNE etc...
operacje na modelach są bardziej wygodniejsze niż korzystanie z plugin'ów, jeśli chodzi to o bbcode to juz klase jako biblioteke zrobic, bedzie o wiele latwiej
erix
~matrik, czy mógłbyś przestać siać herezje na forum...? Masz rozeznanie w każdym z poruszanych przez Ciebie tematów? Naprawdę, nie udawaj kogoś, kto pozjadał wszystkie rozumy, bo:

Cytat
Plugin nie powinien być pisane w klasie tylko w funkcji.

To, że Ty korzystasz wyłącznie z Drupala, czy Wordpressa, to nie znaczy, że wszystkie skrypty mają działać identycznie. Klepiąc wszystko na funkcjach bardzo ciężko jest później rozwijać ten projekt. Ale jeśli znasz wzorce projektowe, to powinieneś wszystko zrozumieć.

Cytat
Możesz także zrobić klase, która będzie jako tymczasowa baza zmiennych

Wzorzec registry, owszem.

Cytat
operacje na modelach są bardziej wygodniejsze niż korzystanie z plugin'ów

Uhm, czy wiesz czym jest model, a czym plugin? Ten drugi może operować na pierwszych, ale niekoniecznie.

Cytat
jeśli chodzi to o bbcode to juz klase jako biblioteke zrobic, bedzie o wiele latwiej

I teraz już sam sobie przeczysz... Poza tym, mógłbyś używać bbcode we własnych postach. tongue.gif
-=Peter=-
Cytat
Ew. global

Przepraszam za bezpośredniość, ale za użycie słowa "global" w kontekście pozytywnym lub neutralnym powinien być ban na tym forum winksmiley.jpg

@mcfreak - drugim parametrem Twojej metody "init" powinna być tablica parametrów.

Przykładowo:
  1. $params = array('test' => 'tresc');
  2. $pluginy->init(1, $params);
  3.  
  4. //metoda init
  5. public function init($plugin, array $params = array()){
  6. //...
  7. extract($params);
  8. include($sciezkaDoPliku);
  9. //..
  10. }
  11.  
  12. //includowany plik którego ścieżka jest w zmiennej $sciezkaDoPliku
  13. echo $test;


Cytat
plugin to kawałek kodziku

Tak, plugin to kawałek kodziku ;] Plugin to wzorzec projektowy, aczkolwiek przytoczony przykład autora nie jest implementacją tego wzorca. Plugin ma różne znaczenia w zależności od kontekstu, w ZF pluginem jest klasa która reaguje na zdarzenia w kontrolerze, w symfony to dowolny uporządkowany zbiór klas (który wpakujemy do folderu plugins), we wordpressie to zapewne jakiś zbiór magicznych funkcji które operują na 100 równie magicznych zmiennych globalnych itp.
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.