Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP5] Coś jak kontener na dane
Forum PHP.pl > Forum > PHP
Landon
Zastanawia mnie fakt braku jednego elemetu w języku (bądź ja go nie znam / nie znalazłem). Chodzi konkretnie o to że gdy zdefiniuje sobie jakąś klasę np
  1. <?php
  2. class moja {
  3. public $zmienna1 = array();
  4. public $zmienna2 = array();
  5. public function cos() {}
  6. }
  7. ?>

No i np chciałbym przekazać wszystkie wartości zmienne do jakiejś innej klasy i chciałbym aby ta klasa byla traktowana jako taka baza czyli jeśli wyślę tam $zmienną1 to mogę ją pobrac w innej klasie przez dziedziczenie... moim zdaniem powinno istnieć coś takiego

  1. <?php
  2. base nazwa {
  3.  $jakas_zmienna = array();
  4.  $cos = 0;
  5. }
  6.  
  7. class moja get_base nazwa {
  8.  public function cos() {
  9.    $cos += 1;
  10.  }
  11. }
  12.  
  13. class moja2 get_base nazwa {
  14.  public function cos() {
  15.    $cos += 3;
  16.  }
  17. }
  18. $moja = new moja;
  19. $moja -> cos(); // wyświetli 1
  20. $moja2 -> cos(); // wyświetli 4 bo 1 było dodane do bazy wcześniej
  21. ?>


Jeśli ktoś wie jak coś takiego zrobić prosze o pomoc tongue.gif
NuLL
Moze statycznie to przypisac - nie wiem czy Ci dokladnie o to chodzi ale chyba tak smile.gif
dr_bonzo
Jak mowi NuLL - tylko zmienna statyczna (protected), jest wspolna dla wszystkich obiektow danej klasy i jej podklas.
Landon
Czyli z tego mam rozumieć że coś takeigo będzie dizałać?

  1. <?
  2. abstract class Base
  3. {
  4.  
  5.   protected $zmienna1 = 1;
  6.   protected $zmienna2 = 6;
  7.  
  8. }
  9.  
  10. class Db1 extends Base
  11. {
  12.   public function add()
  13.   {
  14.        $this -> zmienna1 = $this -> zmienna2+1;
  15.    }
  16. }
  17.  
  18. class Db2 extends Base
  19. {
  20.   public function add()
  21.   {
  22.        $this -> zmienna1 -= $this -> zmienna2-1;
  23.    }
  24. }
  25.  
  26. $Db1 = new Db1;
  27. $Db2 = new Db2;
  28. $Db1 -> add(); // czyli to będzie mieć 7
  29. $Db2 -> add(); // a to 0
  30. ?>


czy coś takiego będzie działać?

raczej nie bo to typ protected

No i nie chodzi mi o przepisanie tego hmm a może jednak da sie coś z tym protected zrobić...
matix
Może wykorzystaj singleton:

  1. <?
  2. class Register {
  3.  
  4.    private static
  5.        $oInstance = null;
  6.        
  7.    private
  8.        $aGet = array();
  9.        
  10.    public function __set($sName, $sValue)
  11.    {
  12.        $this->aGet->$sName = $sValue;
  13.    }
  14.    
  15.    public function __get($sName)
  16.    {
  17.        return $this->aGet->$sName;
  18.    }
  19.        
  20.    public function singleton()
  21.    {
  22.        if (self$oInstance == null)
  23.            self$oInstance = new self();
  24.            
  25.        return self$oInstance;
  26.    }
  27. }
  28.  
  29. abstract class Db {
  30.  
  31.    protected
  32.            $oEngine = null;
  33.  
  34.    public function __construct()
  35.    {
  36.        $this->oEngine = Registersingleton();
  37.    }
  38.    
  39.    public function get()
  40.    {
  41.        return $this->oEngine->zmienna;
  42.    }
  43.  
  44. }
  45.  
  46. class MojaBaza extends Db {
  47.  
  48.    public function add ($ile)
  49.    {
  50.        $this->oEngine->zmienna += $ile;
  51.    }
  52.  
  53. }
  54.  
  55.  
  56. class MojaBazaSiedem extends Db {
  57.  
  58.    public function add ($ile)
  59.    {
  60.        $this->oEngine->zmienna += $ile*5;
  61.    }
  62.  
  63. }
  64.  
  65. $oDb_1 = new MojaBaza;
  66. $oDb_2 = new MojaBazaSiedem;
  67.  
  68. $oDb_1->add (5);
  69. $oDb_2->add (3);
  70.  
  71. echo $oDb_1->get();
  72.  
  73. ?>


Pisane jako schemat, nie sprawdzałem, ale powinno działać.

Pzdr.
Landon
dzięki właśnie o coś takeigo mi chodziło ale mam dalej problem:
zgodnie z tym co wiem i co mi napisaliście poprawiłem skrypt kolegi i wyszło mi coś takeigo
  1. <?
  2. class Register {
  3.    private static $oInstance = null;
  4.    private $aGet = array();
  5.    public function __set($sName, $sValue) {
  6.        $this->aGet[$sName] = $sValue;
  7.    }
  8.    public function __get($sName) {
  9.        return $this->aGet[$sName];
  10.    }
  11.    public function singleton() {
  12.        if (self$oInstance == null) self$oInstance = new self();
  13.        return self$oInstance;
  14.    }
  15. }
  16.  
  17. abstract class Db {
  18.    protected $oEngine = array();
  19.  
  20.    public function __construct() {
  21.        $this->oEngine = Registersingleton();
  22.    }
  23.    
  24.    public function __set($name, $value) {
  25.        $this -> oEngine -> $name = $value;
  26.    }
  27.    
  28.    public function __get($name) {
  29.        return $this -> oEngine -> $name;
  30.    }
  31. }
  32.  
  33. class base extends Db {
  34.    public function add () {
  35.        $this->zmienna = array('zmysly' => array('mowa', 'wzrok'), 'cos' => 0);
  36.        $this->zmienna2 = 1;
  37.        echo '<pre>';
  38.        print_r($this->zmienna);
  39.        echo '</pre>';
  40.        echo $this->zmienna2;
  41.    }
  42. }
  43.  
  44. class base2 extends Db {
  45.    public function add () {
  46.        $this->zmienna2 = 2;
  47.        $this->zmienna['cos'] = 2;
  48.        echo '<pre>';
  49.        print_r($this->zmienna);
  50.        echo '</pre>';
  51.        echo $this->zmienna2;
  52.    }
  53. }
  54.  
  55. $oDb_1 = new base;
  56. $oDb_1 -> add();
  57. $oDb_2 = new base2;
  58. $oDb_2 -> add();
  59. ?>


tylko jest jeden mankament to wyświetla mi :

  1. Array
  2. (
  3.    [zmysly] => Array
  4.        (
  5.            [0] => mowa
  6.            [1] => wzrok
  7.        )
  8.  
  9.    [cos] => 0
  10. )
  11.  
  12. 1
  13. Notice: Indirect modification of overloaded property base2::$zmienna has no effect in /nowy.php on line 48
  14.  
  15. Array
  16. (
  17.    [zmysly] => Array
  18.        (
  19.            [0] => mowa
  20.            [1] => wzrok
  21.        )
  22.  
  23.    [cos] => 0
  24. )
  25.  
  26. 2


czyli chodzi o to ze nie nadpisuje tablic...

zadanie rozwiązane ale tylko tymczasowo $this->zmienna = array_merge($this -> zmienna,Array('cos' => 2));

ale trzeba pomyśleć by z array_merge nie korzystać
Exek
Hmm...

mógłbyś pokazać co daje var_dump dla $name w Db za drugim razem? Sam bym zobaczył ale kod coś jest pociachany z :: i -> tongue.gif
Kod
   public function __set($name, $value) {
        $this -> oEngine -> $name = $value;
       var_dump($name);
    }
Landon
mysle sobie czy coś tego typu nie zadziała:

  1. <?php
  2. public function __set($name, $value) {
  3.    $this->oEngine->$name = (is_array($this->oEngine->$name)) ? array_merge($this->oEngine->$name,$value)&nbsp: $value;
  4. }
  5. ?>


a var_dump zwraca:

  1. string(7) "zmienna" string(8) "zmienna2"
  2.  
  3. Array
  4. (
  5.    [zmysly] => Array
  6.        (
  7.            [0] => mowa
  8.            [1] => wzrok
  9.        )
  10.  
  11.    [cos] => 0
  12. )
  13.  
  14. 1
  15. string(8) "zmienna2"
  16. Notice: Indirect modification of overloaded property base2::$zmienna has no effect in /nowy.php on line 49
  17.  
  18. Array
  19. (
  20.    [zmysly] => Array
  21.        (
  22.            [0] => mowa
  23.            [1] => wzrok
  24.        )
  25.  
  26.    [cos] => 0
  27. )
  28.  
  29. 2
Exek
Trochę referencji i śmiga winksmiley.jpg

Kod
class Register {
   private static $oInstance = null;
   private $aGet = array();
   public function set($sName, &$sValue) {
       $this->aGet[$sName] = &$sValue;
   }
   public function & get($sName) {
       $v = & $this->aGet[$sName];
       return $v;
   }
   public function singleton() {
       if (self::$oInstance == null) self::$oInstance = new self();
       return self::$oInstance;
   }
}

abstract class Db {
   protected $oEngine = array();

   public function __construct() {
       $this->oEngine = Register::singleton();
   }
  
   public function __set($name, $value) {
       $this -> oEngine -> set($name, $value);
   }
  
   public function & __get($name) {
       return $this -> oEngine ->get($name);
   }
Landon
Dzięki teraz działa poprawnie....

{edit}

Brakuje mi jeszcze jednego gdy prubuje pobrac jakieś dane których nie ma tam wywala mi błąd;
Fatal error: Call to a member function get() on a non-object in test.php on line 45

Chodzi o to że wtedy coś się sypie i jak to naprawić?

$v = & $this -> aGet[$sName];

zamienić na:

$v = & (($this -> aGet[$sName]) ? $this -> aGet[$sName] : null);

czy tak mógłbym to zrobić?
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.