[PHP] static __get *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 15:23
Ik heb me sinds kort ingelezen in het MVC pattern, en dit wil ik nu ook gaan toepassen.

De register classe wil ik graag in een singleton ontwerp, zodat hij overal makkelijk aanroepbaar is, en er een enkele instansie van aanwezig mag zijn.

Bijvoorbeeld de database classe wil ik na registratie in het register object kunnen aanroepen als zijnde:
register::$database
Ik dacht dat als ik creatief omging met de __set methode, en de __get methode dit wel mogelijk zou moeten zijn.

Mijn code

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    class register {
        
        private static $vars = array();
        private static $instance;
        
        public static function _construct() {
            if(!isset(self::$instance)) 
                self::$instance = new self;
            return self::$instance;
        }
        
        public static function __set($var, $value) { //Add a new register item
            try {
                if(isset(self::$vars[$var]))
                    throw new exceptionH("Register-Error: '" . $var . "' bestaat al en kan niet overschreven worden.");
                else //Add to register
                    self::$vars[$var] = $value;
            }
            catch(exceptionH $e) {
                $e->getError(); 
                echo $e->getMessage() . "<br />";
            }
        }
        
        public static function __get($var) { //Get a register item
            try {
                if(!isset(self::$vars[$var]))
                    throw new exceptionH("Register-Error: '" . $var . "' bestaat niet, en kan niet gelezen worden.");
                else
                    return self::$vars[$var];
            }
            catch(exceptionH $e) {
                $e->getError();
                echo $e->getMessage() . "<br />";
            }
        }
    
    }


Maar als ik nu de database registreer dmv:
code:
1
2
$database = new database("localhost","username","password");
register::$database = $database;


Dan krijg ik de volgende error:
Fatal error: Access to undeclared static property: register::$database in /srv/wwwroot/indev/htdocs/cms/main.php on line 20
Ik heb al wat gegoogled op 'static __get()' en de error, maar echt veel wijzer wordt ik er niet van.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Misschien handig om je taal voortaan in je topictitel te zetten en te gebruiken in je code tags? ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

Volgens mij krijg je die error doordat je de functie dan niet meer static aanroept, de class moet dan geinitaliseerd worden, en das net niet de bedoeling van static...

Maar ik weet nog niet zo super veel van PHP OOP...

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 15:23
ibmos2warp schreef op vrijdag 13 juni 2008 @ 21:21:
Volgens mij krijg je die error doordat je de functie dan niet meer static aanroept, de class moet dan geinitaliseerd worden, en das net niet de bedoeling van static...

Maar ik weet nog niet zo super veel van PHP OOP...
De database class is inderdaad niet static, maar de register class wel. Dus dat lijkt me geen probleem te zijn.
Creepy schreef op vrijdag 13 juni 2008 @ 21:20:
Misschien handig om je taal voortaan in je topictitel te zetten en te gebruiken in je code tags? ;)
Je hebt gelijk :) Maar je hebt het al aangepast zie ik. :)

[ Voor 22% gewijzigd door ZpAz op 13-06-2008 21:23 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • ppx17
  • Registratie: December 2007
  • Laatst online: 22-08 18:09
Member overloading only works in object context. These magic methods will not be triggered in static context. Therefore these methods can not be declared static.
Lijkt me vrij duidelijk zo. :)

[ Voor 7% gewijzigd door ppx17 op 13-06-2008 21:35 ]

40D | 8 | 50 | 100 | 300


Acties:
  • 0 Henk 'm!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

ppx17 schreef op vrijdag 13 juni 2008 @ 21:34:
[...]

Lijkt me vrij duidelijk zo. :)
Dus ik had het wel goed? :X

Trouwens probeer deze code eens:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyStatic { 
   static $foo; 
static $bar; 
var $blaat = array(); 


    static function set($value) {
    $this->bar = $value;
                 }

 function __set($var, $value) { 
  if(isset(self::$vars[$var])) {
  echo $var . "bestaat al";
}  else {
 self::$vars[$var] = $value; 
            } 
        }
} 

MyStatic::$foo = 'Red'; 
echo ( MyStatic::$foo ) . PHP_EOL;
MyStatic::$bar = 'blue';
echo ( MyStatic::$bar );
MyStatic::$blup = 'kip';

(Online zitten tikken, dus geen goede inspring enzo).
Deze code geeft ook: "Fatal error: Access to undeclared static property: MyStatic::$blup in" terug. Je kunt dus gewoon geen var static zetten, want die var is dan niet static.

[ Voor 10% gewijzigd door ibmos2warp op 13-06-2008 21:42 ]

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


Acties:
  • 0 Henk 'm!

  • ppx17
  • Registratie: December 2007
  • Laatst online: 22-08 18:09
Static kent geen $this, dat gaat hoe dan ook niet werken en blup voegt hij nergens toe. Ben bang dat je een andere manier moet zoeken.

$database = Mystatic::getVar('database'); of iets in die richting geef ik meer kans.

-Edit-
Zou zelf een statische factory maken die een (singleton) instance van je register klasse geeft, dan gaat alles veel beter werken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class register {

 private $instance;

 public function __construct() {
  // vul instance wanneer deze nog niet bestaat
 }
 
 public static function factory() {
  return $instance;
}
}

$register = register::factory();

$register->database...
?>

In die richting dus.

[ Voor 50% gewijzigd door ppx17 op 13-06-2008 21:50 ]

40D | 8 | 50 | 100 | 300


Acties:
  • 0 Henk 'm!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

ppx17 schreef op vrijdag 13 juni 2008 @ 21:46:
Static kent geen $this, dat gaat hoe dan ook niet werken en blup voegt hij nergens toe. Ben bang dat je een andere manier moet zoeken.
PHP:
1
2
3
4
myStatic::$foo = 'Red';  
echo ( MyStatic::$foo ) . PHP_EOL; 
MyStatic::$bar = 'blue'; 
echo ( MyStatic::$bar );

geeft gewoon:
Red
blue
:?

En ik weet dat ie blup niet toevoegd, dat was juist mijn punt :9

[ Voor 7% gewijzigd door ibmos2warp op 13-06-2008 21:51 ]

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Omdat je $foo public en static is kan je die rechtstreeks aanspreken, je set() wordt niet gebruikt. $this bestaat in static context echt niet. Maak je $foo maar eens private ;)

[ Voor 14% gewijzigd door Creepy op 13-06-2008 21:54 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1