Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z includowaną klasą
Forum PHP.pl > Forum > PHP
Mlodycompany
Witam. W index.php includuje plik z funkcjami a w tym pliku są ładowane moduły. Problem polega na tym, że gdy w index-ie wywołam klasę i funkcje to działa, gdy w pliku z tą klasą wywołam klasę a w index-ie funkcje to zwraca mi błąd
Kod
Fatal error: Call to a member function show_articles() on a non-object in /var/www/cms/index.php on line 12
. Wg mnie wszystko powinno chodzić, ale mogę się mylić. Jeżeli będą potrzebne kody to zamieszcze. Proszę o pomoc
zend
Forum to nie parser! Przecież pisze Ci wyraźnie że zmienna z której korzystasz nie jest obiektem, zrób tak, żeby się nim stała, a będzie ok. Jak Ci się nie uda to podaj kod.
Mlodycompany
Ale ja wiem co ten błąd oznacza, ale nie wiem dlaczego tak się dzieje. Teoretycznie powinno to działać ale nie działa
wookieb
Cytat
Ale ja wiem co ten błąd oznacza

FANFARY!

Cytat
ale nie wiem dlaczego tak się dzieje

A my skąd mamy wiedzieć skoro nie mamy kodu? Zastanów ty się czasem...

Cytat
Teoretycznie powinno to działać ale nie działa

Teoretycznie i praktycznie nie potrafisz analizować teoretyki a tym bardziej myśleć JAK mamy Ci pomóc rozwiązać problem...
Mlodycompany
Cytat
FANFARY!
yy źe co?
Cytat
A my skąd mamy wiedzieć skoro nie mamy kodu? Zastanów ty się czasem...
Przeczytaj kolego drogi końcówke 1 postu w tym temacie. Pomogę ci, żebyś nie miał problemu ze znalezieniem
Cytat
Jeżeli będą potrzebne kody to zamieszcze
Wystarczyło powiedzieć a wszystkie potrzebne kody by się znalazły.
Cytat
Teoretycznie i praktycznie nie potrafisz analizować teoretyki
Zapewniam Cię, że daje rade. Ale do rzeczy. Oto kody
  1. index.php
  2. <?php
  3. error_reporting(E_ALL & ~E_NOTICE);
  4. ini_set('display_errors', 1);
  5. require('conf.php');
  6. require('class/func.php');
  7. $config = new config();
  8. $articles->show_articles();
  9. ...
  10. ?>
  11.  
  12.  
  13. class/func.php
  14. <?php
  15. class config{
  16. const DZIEL = 10;
  17. const PREFIX = "#cms_";
  18. public $modules = array('articles');
  19. public $classes = array('mysql');
  20. public function __construct(){
  21. foreach($this->modules as $modul){
  22. include('modules/'.$modul.'.php');
  23. }
  24. foreach($this->classes as $class){
  25. include('class/'.$class.'.php');
  26. }
  27. }
  28.  
  29. }
  30. ?>
  31.  
  32.  
  33. modules/articles.php
  34. <?php
  35. class articles{
  36. public function show_articles($page=1){
  37. $start = ($page - 1) * config::DZIEL;
  38. $rows = mysql::mfa(config::PREFIX.'aktualnosci',array('', '', '`ID` DESC', $start.', '.config::DZIEL));
  39. #foreach($rows as $)
  40. print_r($rows);
  41. }
  42. public function show_article($id){
  43. $rows = mysql::mfa(config::PREFIX.'aktualnosci',array('', array('`ID` = '.$id)));
  44. print_r($rows);
  45. }
  46. public function add_article($topic, $str, $thumb){
  47. $add = mysql::insert(config::PREFIX.'aktualnosci', array('ID', 'temat', 'tresc', 'miniaturka', 'dodal', 'data'), array('', $topic, $str, $thumb, $_SESSION['ID'], config::DATA));
  48. }
  49. public function edit_article($id, $edit){
  50. $edit = mysql::update(config::PREFIX.'aktualnosci', $id, $edit);
  51. return $edit;
  52. }
  53. public function del_article($id){
  54. $del = mysql::delete(config::PREFIX.'aktualnosci', $id);
  55. return $del;
  56. }
  57. }
  58. $articles = new articles();
  59.  
  60.  
  61. ?>

wookieb
Includujesz plik articles.php w kodzie funkcji. Instancja obiektu tworzy się wewnatrz funkcji dlatego jest niewidoczna poza nia.

Ale podrzucę propozycje małej modyfikacji
  1. class config{
  2. const DZIEL = 10;
  3. const PREFIX = "#cms_";
  4. public $modules = array('articles');
  5. public $classes = array('mysql');
  6. private $modulesInstances = array();
  7.  
  8. public function __construct(){
  9. foreach($this->modules as $modul){
  10. include('modules/'.$modul.'.php');
  11. $this->modulesInstances[$modul] = $$modul;
  12. }
  13. foreach($this->classes as $class){
  14. include('class/'.$class.'.php');
  15. }
  16. }
  17.  
  18. public function getModuleInstance($modul)
  19. {
  20. if(isset($this->modulesInstances[$modul]))
  21. {
  22. return $this->modulesInstances[$modul];
  23. }
  24. }
  25.  
  26. }


W indexie
  1. $articles = $config->getModuleInstance('articles');
  2. $articles->show_articles();
Mlodycompany
Nie zrozumiałeś mnie. Chcę aby wywołanie klasy było w pliku z tą klasa a wywołanie funkcji tej klasy w innym pliku np. w index'ie. I to nie działa, nawet z Twoim rozwiązaniem więc można stwierdzić, że Twój kod jest bezużyteczny
wookieb
No to musisz użyć global ale nie polecamy.
fander
Witam

Bezsensowne rozwiązanie po co chcesz tworzyć obiekt w momencie inkludowania pliku ? Zainteresuj się lepiej singletonem a nie używaj czegoś takiego.
Mlodycompany
poniewaz kazdy user bedzie mogl korzystac z innych modulow i te moduly z ktorych chce korzystac sa includowane. gdybym wywolywal wszystkie naraz to by mi bledy walilo ze nie moze znalezc klasy
fander
Witam

Zakładam że używasz ACL (Access Control List) czy użytkownik ma gdzieś w bazie zapisane z jakich modułów korzysta ? Masz może jakiś diagram systemu w UML-u klas albo obiektów ?

Zakładam że moduł w twoim cms-ie uruchamia odpowiedni url. Skoro tak to zrób klasę kontrolera, ACL-a i połącz to w odpowiedni sposób przykładowo wywołując

http://mojastrona.asd/moduł/akcja to w kontrolerze pobierasz uprawnienia tego użytkownika, sprawdzasz czy ma dostęp do danej akcji modułu
a następnie wyświetlasz moduł albo informacje o braku dostępu.
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.