Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Fatal error: Cannot access private property
Forum PHP.pl > Forum > Przedszkole
szczabik
Witam zacząłem pisać classe
Napisałem taki kod

  1. class tag_news
  2. {
  3. private $html;
  4.  
  5. function menu()
  6. {
  7. $this->html .= "<table>";
  8. $this->html .= "<tr>";
  9. $this->html .= "<td><a href='add_tag.php'>Dodaj tag</a></td>";
  10. $this->html .= "</tr>";
  11. $this->html .= "<table/>\n";
  12. }
  13. }

I wywołuje to tak

  1. require_once 'tag_news.class.php';
  2. $tag = new tag_news();
  3. $tag->html->menu();

I wywala błąd
Kod
Fatal error: Cannot access private property tag_news::$html in C:\Program Files\WebServ\httpd-users\obiekt\tag_news.php on line 4

nie wiem czemu. Czy może mi ktoś pomóc co w tym kodzie jest źle ?

nospor
przeczytales chociaz ze zrozumieniem komunikat bledu?

Wiesz co to public, protected,private? Wiesz co one dają dla wlasciwosci/metod klasy? Powinienes przeczytac troche na temat tego za co sie zabierasz.
viking
Poza tym nie
  1. $tag->html->menu();

tylko
  1. $tag->menu();
blooregard
  1. $tag->html->menu();

Pomijając to, o czym napisał @nospor, to takie odwołanie jest bezsensowne.
Albo odwołujesz się do składowej (jeśli jest taka mozliwość - składowa jest publiczna), albo do metody (analogicznie).
A Ty odwołałeś sie mniej więcej w ten sposób:
klasa->składowa->metoda();

szczabik
Cytat(nospor @ 8.09.2009, 13:37:41 ) *
przeczytales chociaz ze zrozumieniem komunikat bledu?

Wiesz co to public, protected,private? Wiesz co one dają dla wlasciwosci/metod klasy? Powinienes przeczytac troche na temat tego za co sie zabierasz.



Czytałem.
Modyfikatory:
Public – dostępne zawsze spoza klasy i jej wnętrza.
Private – dostępne jedynie wewnątrz klasy.
Protecet – to samo co wyżej lecz występuje we wszystkich podklasach.

I dałem

  1. public $html;

I niby wszystko jest teraz ok. a wywala błąd
Kod
Fatal error: Call to a member function menu() on a non-object in C:\Program Files\WebServ\httpd-users\obiekt\tag_news.php on line 4


I co jest teraz źle ?

nospor
odpowiedzi masz w poprzednich postach pozostalych userow smile.gif
szczabik
Cytat(nospor @ 8.09.2009, 13:51:27 ) *
odpowiedzi masz w poprzednich postach pozostalych userow smile.gif



Nie zdarzyłem przeczytać zanim napisałem post. Niby wszystko teraz ok. ale nic nie wyświetla a powinno wyświetlić tabelkę a nic nie wyświetla.

Bo chciałem dodać kolejne funkcje aby pod $html tworzyło cały dokument. Czyli na początku menu a potem funkcje odpowiedzialne ze formularz.

nospor
no ale mysl troche...
przeciez ty tylko przypisuje do $this->html kod ale nic z nim nie robisz. daj na tym glupie echo to zobaczysz to i owo
phpion
Cytat(szczabik @ 8.09.2009, 13:57:00 ) *
Niby wszystko teraz ok. ale nic nie wyświetla a powinno wyświetlić tabelkę a nic nie wyświetla.

echo / print questionmark.gif

Moża zanim zaczniesz pisać tą super "classe" to zapoznaj się z podstawami bo wyskakujesz do programowania obiektowego, a podstaw nie masz żadnych.
szczabik
Cytat(phpion @ 8.09.2009, 13:59:42 ) *
echo / print questionmark.gif

Moża zanim zaczniesz pisać tą super "classe" to zapoznaj się z podstawami bo wyskakujesz do programowania obiektowego, a podstaw nie masz żadnych.


Skąd ty możesz wiedzieć czy znam podstawy czy nie. Forum jest pod pomagania a nie od oceniania czy ktoś zna podstawy czy nie. Może podstawy znam tylko akurat sie pogubiłem.

Po za tym chodziło o to by w każdej funkcji nie wywołać return tylko w 1 głównej. W tym przypadku w funckji menu.

I czemu niby twierdzisz że super classa chyba po to się pisze classy by łatwo można było modyfikować kod. I nie potrzebnie powtarzać te same części kodu jak strukturalnie.

Obecnie napisałem tyle ( na razie samo menu ) i niby twierdzisz że jest to bez sensu ? Dlaczego ?
  1. class tag_news
  2. {
  3. public $html;
  4. private $odnosniki = array(
  5. 'Dodaj Tag' => 'add_tag.php',
  6. 'Edytuj Tagi' => 'edit_tag.php',
  7. 'Newsy' => 'news.php'
  8. );
  9. public function menu()
  10. {
  11. $this->html .= "<table>";
  12. $this->html .= $this->odnosnik($align = 'left', $class = 'tbl2');
  13. $this->html .= "<table/>";
  14. return $this->html;
  15. }
  16.  
  17. public function odnosnik($align = 'center', $class = 'tbl')
  18. {
  19. foreach ($this->odnosniki AS $nazwa=>$url){
  20. $this->html .= "<tr>";
  21. $this->html .= "<td align='".$align."' class='".$class."'><a href='".$url."'>".$nazwa."</a></td>";
  22. $this->html .= "</tr>";
  23. }
  24. }
  25. }



Wywołanie
  1. require_once 'tag_news.class.php';
  2. $tag = new tag_news();
  3. echo $tag->menu();
phpion
Odnośnie braku podstaw: wywnioskowałem to po problemach jakie zgłaszałeś (widoczność składowych, brak wyniku na ekranie).
Odnośnie twojej "classy": (dlaczego nie klasy?) jaka jest jej przewaga nad odpowiednikiem napisanym strukturalnie w postaci zwykłej funkcji? W obecnej formie takowej przewagi niestety nie widzę.
wookieb
Cytat(phpion @ 8.09.2009, 15:01:22 ) *
Odnośnie twojej "classy": (dlaczego nie klasy?) jaka jest jej przewaga nad odpowiednikiem napisanym strukturalnie w postaci zwykłej funkcji? W obecnej formie takowej przewagi niestety nie widzę.

No dobrze, nie każdy zna od razu założenie OOP ani nie jest ekspertem we wzorcach projektowych i MVC. To, że autor pyta się o takie rzeczy (i nawet komunikat mówi dokładnie co jest nie tak) to lipa ale ten komentarz jest zbędny.
szczabik
A mam takie pytanie jeszcze napisałem taki kod
  1. class tag_news
  2. {
  3. public $html;
  4. private $odnosniki = array(
  5. 'Dodaj Tag' => 'add_tag.php',
  6. 'Edytuj Tagi' => 'edit_tag.php',
  7. 'Newsy' => 'news.php'
  8. );
  9. public function menu()
  10. {
  11. $this->html .= "<table>";
  12. $this->html .= $this->odnosnik();
  13. $this->html .= "<table/>";
  14. return $this->html;
  15. }
  16.  
  17. public function odnosnik($align = null, $class = null)
  18. {
  19. foreach ($this->odnosniki AS $nazwa=>$url){
  20. $this->html .= "<tr>";
  21. $this->html .= "<td align='".$align."' class='".$class."'><a href='".$url."'>".$nazwa."</a></td>";
  22. $this->html .= "</tr>";
  23. }
  24. }
  25.  
  26. }


I wywołuje tak
  1. require_once 'tag_news.class.php';
  2. $tag = new tag_news();
  3. echo $tag->menu();

i jak teraz wywołując funkcje menu ustawić atrybuty dla funkcji odnośnik która jest wewnątrz funkcji menu. Próbowałem tak
  1. require_once 'tag_news.class.php';
  2. $tag = new tag_news();
  3. echo $tag->menu($tag->odnosnik($align = 'left'));

ale nie działa

wookieb
No bo naprawdę nie znasz podstaw. A szczególnie podstaw funkcji http://pl2.php.net/manual/pl/functions.arguments.php
erix
Cytat
Skąd ty możesz wiedzieć czy znam podstawy czy nie. Forum jest pod pomagania a nie od oceniania czy ktoś zna podstawy czy nie. Może podstawy znam tylko akurat sie pogubiłem.

Nie trzeba wiedzieć, wystarczy popatrzeć, o co pytasz. Zapraszam do lektury manuala, wówczas będziemy mogli porozmawiać.
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.