it-swarm.com.de

PHP Klasse: Globale Variable als Eigenschaft in Klasse

Ich habe eine globale Variable außerhalb meiner Klasse = $ MyNumber;


Wie erkläre ich dies als Eigenschaft in myClass?
Für jede Methode in meiner Klasse mache ich Folgendes:

class myClass() {

    private function foo() {
         $privateNumber = $GLOBALS['MyNumber'];
    }

}



Ich will das

class myClass() {

    //What goes here?
    var $classNumber = ???//the global $MyNumber;

    private function foo() {
         $privateNumber = $this->classNumber;
    }

}



EDIT: Ich möchte eine Variable erstellen, die auf der globalen $ MyNumber basiert
vor der Verwendung in den Methoden geändert 

etwas wie: var $ classNumber = global $ MyNumber + 100; 

27
Zebra

Wahrscheinlich möchten Sie dies nicht wirklich tun, da es ein Albtraum sein wird, Fehler zu beheben, aber es scheint möglich zu sein. Der Schlüssel ist der Teil, den Sie durch Referenz im Konstruktor zuweisen.

$GLOBALS = array(
    'MyNumber' => 1
);

class Foo {
    protected $glob;

    public function __construct() {
        global $GLOBALS;
        $this->glob =& $GLOBALS;
    }

    public function getGlob() {
        return $this->glob['MyNumber'];
    }
}

$f = new Foo;

echo $f->getGlob() . "\n";
$GLOBALS['MyNumber'] = 2;
echo $f->getGlob() . "\n";

Die Ausgabe wird sein

1
2

dies zeigt an, dass es als Referenz zugewiesen wird, nicht als Wert.

Wie gesagt, es wird ein Albtraum, Fehler zu beheben, also sollten Sie das wirklich nicht tun. Lesen Sie den Wikipedia-Artikel über Kapselung ; Grundsätzlich sollte Ihr Objekt seine eigenen Daten und die Methoden, mit denen diese Daten geändert werden, idealerweise verwalten. Selbst öffentliche Grundstücke sind im Allgemeinen, meiner Meinung nach, eine schlechte Idee.

51
El Yobo

Versuchen Sie, Globals zu vermeiden, stattdessen können Sie so etwas verwenden

class myClass() {
 private $myNumber;

 public function setNumber($number) {
  $this->myNumber = $number;
 }
}

Jetzt kannst du anrufen

$class = new myClass();
$class->setNumber('1234');
10
mrwooster

Verwenden Sie einfach das globales Schlüsselwort .

z.B.:

class myClass() {
    private function foo() {
        global $MyNumber;
        ...

$ MyNumber wird dann innerhalb dieser Methode zugänglich (und kann tatsächlich geändert werden).

Die Verwendung von Globalen wird jedoch häufig verpönt (sie können einen schlechten Codegeruch ausstrahlen), sodass Sie möglicherweise in Betracht ziehen möchten, eine Singleton-Klasse zu verwenden etwas in dieser Art aufbewahren. (Andererseits, ohne mehr darüber zu wissen, was Sie erreichen wollen, könnte dies eine sehr schlechte Idee sein - ein Define könnte durchaus nützlicher sein.)

6
John Parker

Was ist mit dem Konstruktor?

class myClass {

   $myNumber = NULL;

   public function __construct() {
      global myNumber;

      $this->myNumber = &myNumber; 
   }

   public function foo() {
      echo $this->myNumber;
   }

}

Oder viel besser so (die globale Variable als Parameter übergeben, wenn das Objekt inicializin ist - nur Lesen)

class myClass {

   $myNumber = NULL;

   public function __construct($myNumber) {
      $this->myNumber = $myNumber; 
   }

   public function foo() {
      echo $this->myNumber;
   }

}
$instance = new myClass($myNumber);
2
Petr Peller

Was ich erfahren habe, ist, dass Sie Ihre globale Variable nicht direkt einer Klassenvariablen zuordnen können.

class myClass() {

    public $var = $GLOBALS['variable'];

    public function func() {
         var_dump($this->var);
    }
}

Mit dem Code rechts oben erhalten Sie die Fehlermeldung "Parse error: Syntaxfehler, unerwarteter '$ GLOBALS'"

Aber wenn wir so etwas tun,

class myClass() {

    public $var = array();

    public function __construct() {
        $this->var = $GLOBALS['variable'];
    }

    public function func() {
         var_dump($this->var);
    }

}

Unser Code wird gut funktionieren.

Wo wir einer Klasse eine globale Variable zuweisen, muss sich die Variable innerhalb einer Funktion befinden. Und ich habe dafür Konstruktorfunktion verwendet.

Sie können also innerhalb jeder Funktion einer Klasse auf Ihre globale Variable zugreifen, indem Sie $ this-> var ;

2
emre

Wenn Sie innerhalb einer Klasse auf eine Eigenschaft zugreifen möchten, sollten Sie:

private $classNumber = 8;
1
Gal

klasse myClass { geschütztes $ foo;

public function __construct(&$var)
{
    $this->foo = &$var;
}

public function foo()
{
    return ++$this->foo;
}

}

0
Xerxes