Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dynamiczne tworzenie pól w klasie
rudolf35
post
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 17.10.2007

Ostrzeżenie: (0%)
-----


Chciałbym, żeby w klasie tworzone były dynamiczne zmienne w przypadku gdy inna klasa odwołuje się do nieistniejącego pola. Np
  1. class A
  2. {
  3. }
  4. class B
  5. {
  6. public $object;
  7. public function __construct()
  8. {
  9. $this->object = new A();
  10. $this->object->title='Strona główna';
  11. }
  12. }

W powyższym przypadku chciałbym żeby zostało utworzone automatycznie pole "title".
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




__set i __get
Go to the top of the page
+Quote Post
rudolf35
post
Post #3





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 17.10.2007

Ostrzeżenie: (0%)
-----


ok, dzięki set przechwytuje próbę zapisania w nieistniejącym polu, natępnie tworzę wewnątrz set dynamicznie nową zmienną. Wszystko ładnie, ale zmienna jest dostępna tylko wewnątrz funkcji set a ja chciałbym żeby była dostępna dla wszystkich funkcji wewnątrz klasy. Jak to zrobić?
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A druga przeze mnie wymieniona funkcja, to? (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
gothye
post
Post #5





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


na jakich prawach tworzone jest dzieki temu pole , private , public ?
Go to the top of the page
+Quote Post
rudolf35
post
Post #6





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 17.10.2007

Ostrzeżenie: (0%)
-----


  1. class A
  2. {
  3. public function __set($var_name, $var_value)
  4. {
  5. $tmp = $var_name;
  6. $tmp = $var_value;
  7. echo $k;
  8. }
  9. public function __get($var_name)
  10. {
  11. echo "ok";
  12. }
  13. public function __construct()
  14. {
  15.  
  16. }
  17. public function render()
  18. {
  19. $this->s;
  20. }
  21. }

Po wywołaniu metody render w powyższej klasie powinno wyświetlić się "ok", bo odwołuje się do nieistniejącego pola a nic się nie wyświetla. Więc pewnie te funkcje działają tylko wtedy gdy próbujemy zapisać lub odczytać do lub z nieistniejącej zmiennej z zewnątrz klasy? Mi chodzi o to żeby po zapisaniu z obiektu innej klasy, funkcje klasy A mogły odczytywać zapisaną zmienną.
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #7





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  1. class A{
  2. public function __get($name){
  3. echo __METHOD__.'<br />';
  4. }
  5.  
  6. public function __set($name, $value){
  7. echo __METHOD__.'<br />';
  8. }
  9.  
  10. public function __construct(){
  11. echo __METHOD__.'<br />';
  12. $this->test;
  13. $this->test = 'a';
  14. }
  15. }
  16.  
  17. $a = new A();
  18. echo 'wywołania z zewnatrz obiektu<br />';
  19. $a->test;
  20. $a->test = 'a';

Go to the top of the page
+Quote Post
gothye
post
Post #8





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


poprawiony powyższy kod :

  1. class A{
  2. public function __get($name){
  3. echo __METHOD__.'<br />';
  4. return $this->$name ;
  5. }
  6.  
  7. public function __set($name, $value){
  8. echo __METHOD__.'<br />';
  9.  
  10. $this->$name = $value ;
  11. }
  12.  
  13. public function __construct(){
  14. echo __METHOD__.'<br />';
  15. }
  16.  
  17.  
  18. }
  19.  
  20. $a = new A();
  21. echo 'wywołania z zewnatrz obiektu<br />';
  22. $a->test = 'a';
  23.  
  24. echo $a->test;
Go to the top of the page
+Quote Post
jaslanin
post
Post #9





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

Ostrzeżenie: (0%)
-----


Cytat
Chciałbym, żeby w klasie tworzone były dynamiczne zmienne w przypadku gdy inna klasa odwołuje się do nieistniejącego pola. Np


I.

Język PHP jest językiem interpretowanym, nie musisz definiować/deklarować zmiennych przed ich użyciem. Chodzi o to że np. nie musisz deklarować chęci utworzenia zmiennej np.

$zminna = 'cos'; // nic nie deklarujesz że chcesz taką zmienną, od razu piszesz jaką ma mieć wartość

natomiast w przypadku struktur które mają wiele poziomów nie musisz deklarować ostatniej zmiennej.

np. w przypadku

$obiekt1-> obiekt2->nowa_zmienna


obiekt 1 i obiekt2 muszą istnieć, ale nowa_zmienna "istnieć" już nie musi



II.

Lepszym rozwiązaniem wydaje mi się stworzenie w klasie A, właściwości klasy (ty nazywasz to chyba "polem") typu tablicowego która przechowywała by wszystkie "dynamicznie" utworzone zmienne


Tutaj zrobiłem taki przykład według mnie spełniający twoje wymagania:

Kod
class A
{

    public function __get ($var)
    {

        if (isset($this->$var))
        {
            return $this->$var;
        }
        else
        {
            echo "Zmienna '$var' nie istnieje";
        }
    }

    public function doSomething ()
    {

        echo $this->title;
    }

    public function doSomething2 ()
    {

        echo $this->title . ' v 2.0';
    }

}

class B
{

    public $object;

    public function __construct ()
    {

        $this->object = new A();
        $this->object->title = 'Strona glowna';
        $this->object->doSomething();
    }
}

$objB = new B();

echo "<br>";

$objB->object->doSomething2();

echo "<br>";

echo $objB->object->zmienna_ktora_nie_istnieje;



PS. być może czegoś nie zrozumiałem, jeżeli tak, proszę o oświecenie mnie.
Go to the top of the page
+Quote Post
zend
post
Post #10





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

Ostrzeżenie: (0%)
-----


Mam wrażenie że większość z was podaje przykładu których sama nigdy wcześniej nie używała
  1. class SetterGetter
  2. {
  3. /*
  4. * tego zabrakło
  5. * */
  6. protected $_data = array();
  7.  
  8. public function __set($name , $value)
  9. {
  10. $this -> _data[$name] = $value;
  11. }
  12.  
  13. public function __get($name)
  14. {
  15. return $this -> _data[$name];
  16. }
  17.  
  18. public function __isset($name)
  19. {
  20. return isset($this -> _data[$name]);
  21. }
  22.  
  23. public function count()
  24. {
  25. return count($this -> _data);
  26. }
  27.  
  28. }
  29.  
  30. class B extends SetterGetter
  31. {
  32. public function __construct()
  33. {
  34. $this -> title = 'Watrość domyślna';
  35. }
  36. }
  37.  
  38. class A extends SetterGetter
  39. {
  40. public function __construct()
  41. {
  42. $this -> B = new B();
  43. $this -> B -> title = 'XXX';
  44. }
  45. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 20:49