Verbieden van definieren nieuwe variabele in klasse

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Frank de Winkel

Frank de Winkel

03/05/2012 12:04:57
Quote Anchor link
Is het mogelijk om het instantieren van nieuwe variabelen in een klasse te verbieden? Dus:

class A { }
$A = new A();
$A->test = 1; <---- dat verbieden

Hiermee kan ik bugs voorkomen door bijvoorbeeld verkeerde spelling of het veranderen van namen binnen de klasse, waarbij nu een variabele met de verkeerde naam wordt aangemaakt. In andere talen bestaat deze functionaliteit van nature omdat alle variabelen eerst gedefinieerd dienen te worden.

Dus: kan dit uberhaupt in php?

Vriendelijke groet,

Frank
 
PHP hulp

PHP hulp

28/11/2024 22:33:28
 
Chris PHP

Chris PHP

03/05/2012 12:09:57
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
/**
 * Constants that deal only with the database
 */

class DbConstant extends aClassConstant {
    protected $host = 'localhost';
    protected $user = 'user';
    protected $password = 'pass';
    protected $database = 'db';
    protected $time;
    function
__construct() {
        $this->time = time() + 1; // dynamic assignment
    }
}

?>


Source

Als je er protected voor zet, mag je er geen andere waarden aan geven.
Gewijzigd op 03/05/2012 12:10:31 door Chris PHP
 
Frank de Winkel

Frank de Winkel

03/05/2012 12:19:38
Quote Anchor link
Chris, bedankt voor de snelle reactie, maar dat is niet helemaal wat ik bedoel. Als ik bijvoorbeeld public $user; heb maar ik typ per ongeluk $usser = 'root', dan wordt de variabele $usser aangemaakt in het object en voer ik potentieel iets verkeerd uit. Om dit onmogelijk te maken zou ik graag willen dat wanneer iemand een variabele probeert aan te maken die niet gedefinieerd is er een foutmelding komt. Puur en alleen om het object zo robuust mogelijk te maken.
Gewijzigd op 03/05/2012 12:20:18 door Frank de Winkel
 
Wouter J

Wouter J

03/05/2012 12:29:30
Quote Anchor link
Quote:
"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
-Douglas Adams


Properties zul je nooit public moeten maken naar mijn mening, je moet altijd controle houden over wat er in een klasse is aan values.
Als je dan de properties protected of private maakt kun je zo'n check uitvoeren met de magic method __set met public properties lukt dat niet.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
class Foo
{
    protected $bar;
    protected $foo;
    private $baz;

    public function __set($id, $value)
    {

        if (in_array($id, get_object_vars($this))) {
            $this->$id = $value;
        }

        else {
            throw new InvalidArgumentException(sprintf('The property %s:%s does not exists', __CLASS__, $id);
        }
    }
}


$foo = new Foo();

$foo->bar = 'hallo'; // werkt geweldig
$foo->baz = 'world'; // werkt ook
$foo->foo = 'lorem'; // en nog een die werkt

$foo->fo = 'ipsum'; // dit geeft een InvalidArgumentException
?>
Gewijzigd op 03/05/2012 12:32:50 door Wouter J
 
Frank de Winkel

Frank de Winkel

03/05/2012 12:38:22
Quote Anchor link
Perfecte oplossing, dankje! V.w.b. de public properties ga ik met je mee, al is het soms even makkelijk.

Wouter J op 03/05/2012 12:29:30:
Quote:
"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
-Douglas Adams


Properties zul je nooit public moeten maken naar mijn mening, je moet altijd controle houden over wat er in een klasse is aan values.
Als je dan de properties protected of private maakt kun je zo'n check uitvoeren met de magic method __set met public properties lukt dat niet.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
class Foo
{
    protected $bar;
    protected $foo;
    private $baz;

    public function __set($id, $value)
    {

        if (in_array($id, get_object_vars($this))) {
            $this->$id = $value;
        }

        else {
            throw new InvalidArgumentException(sprintf('The property %s:%s does not exists', __CLASS__, $id);
        }
    }
}


$foo = new Foo();

$foo->bar = 'hallo'; // werkt geweldig
$foo->baz = 'world'; // werkt ook
$foo->foo = 'lorem'; // en nog een die werkt

$foo->fo = 'ipsum'; // dit geeft een InvalidArgumentException
?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.