2010-05-19 3 views
2

Je suis vraiment nouveau à OOP. Je ne suis même pas un débutant - je suis noob. Alors. Je veux transférer mon pseudo-CMS de la programmation "normale", dans le système de programmation OOP. Et donc:PHP OOP utilisation constante utilisation

private static $dsn = DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME; 

Qu'est-ce qui cause un problème? Utilisation de contraintes? Je ne sais pas. Mon éditeur (aptana studio) montre une erreur après 1 constante. Merci

Editer:

Merci pour la réaction rapide. Je vais le faire en contructor.

Edit2:

Mais si je veux utiliser singleton? Comment passer des arguments à contructor?

Répondre

1

Voir la documentation:

Cette déclaration peut inclure une initialisation, mais cette initialisation doit être une valeur constante - qui est, il doit pouvoir être évaluée au moment de la compilation et ne doit pas dépendre terme informations à temps pour être évaluées.

Vous ne pouvez pas concaténer des chaînes lors de la définition de propriétés de classe.

Exemple de la documentation (pour complétude):

<?php 
class SimpleClass 
{ 
    // invalid property declarations: 
    public $var1 = 'hello ' . 'world'; 
    public $var2 = <<<EOD 
hello world 
EOD; 
    public $var3 = 1+2; 
    public $var4 = self::myStaticMethod(); 
    public $var5 = $myVar; 

    // valid property declarations: 
    public $var6 = myConstant; 
    public $var7 = array(true, false); 

    // This is allowed only in PHP 5.3.0 and later. 
    public $var8 = <<<'EOD' 
hello world 
EOD; 
} 

?> 

Comme vous passez à POO de toute façon vous ne devriez pas utiliser des constantes. Passez ces valeurs au constructeur de votre classe:

public function __construct($db_type, $db_host, $db_name) { 
    self::$dsn = $db_type.':host='.$db_host.';dbname='.$db_name; 
} 
2

Le problème est que les propriétés doivent être des constantes en ligne lorsque vous les placez dans les champs d'initialisation.

Ce que vous faites ne fonctionnera pas, mais, par exemple, serait:

private static $dsn = 'mysql:host=localhost;dbname=mydb';

Je sais, c'est stupide, mais vous ne pouvez même utiliser des constantes PHP. Vous devez littéralement l'avoir en texte brut.

La solution est d'initialiser $dsn dans le constructeur de la classe, comme ceci:

class MyClass 
{ 
    public function __construct() 
    { 
     self:: $dsn = DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME; 
    } 
} 
+0

+1 pour l'exemple – Josh

3

Toutes les déclarations variables doivent être complètement statique. Cela signifie ne pas utiliser de constantes, de variables ou d'autres éléments modifiables.

Pour créer tout ce qui n'est pas entièrement en texte brut, vous devez utiliser le constructeur.

+0

+1 noter simplement qu'il ne pourrait pas judicieux de fixer membres statiques dans le constructeur, car vous pouvez alors pas supposer que les méthodes statiques etc. se comportera correctement avant que la classe ait été instanciée quelque part. mais php n'a pas d'initialiseurs statiques ou quoi que ce soit, il est difficile –