Heim  >  Artikel  >  php教程  >  PHP-objektorientierte Reise: Vertiefendes Verständnis statischer Variablen und Methoden

PHP-objektorientierte Reise: Vertiefendes Verständnis statischer Variablen und Methoden

黄舟
黄舟Original
2016-12-12 17:06:071340Durchsuche

Das Schlüsselwort static deklariert, dass ein Attribut oder eine Methode mit der Klasse und nicht mit einer bestimmten Instanz der Klasse in Zusammenhang steht. Daher wird dieser Attribut- oder Methodentyp auch „Klassenattribut“ oder „Klassenmethode“ genannt.

Wenn die Zugriffskontrollberechtigungen dies zulassen, können Sie es direkt mit dem Klassennamen plus zwei Doppelpunkten „::“ aufrufen, ohne ein Objekt dieser Klasse zu erstellen.

Das Schlüsselwort static kann zum Ändern von Variablen und Methoden verwendet werden.

Sie können ohne Instanziierung direkt auf die statischen Attribute und statischen Methoden in der Klasse zugreifen.

statisch Es kann nur auf statische Eigenschaften und Methoden zugegriffen werden, und auf nicht statische Eigenschaften und Methoden kann nicht pro Klasse zugegriffen werden. Denn bei der Erstellung statischer Eigenschaften und Methoden kann es sein, dass es noch keine aufrufbaren Instanzen dieser Klasse gibt.

Statische Attribute haben nur eine Kopie im Speicher und werden von allen Instanzen gemeinsam genutzt.

Verwenden Sie das Schlüsselwort self::, um auf statische Mitglieder der aktuellen Klasse zuzugreifen.
Öffentliche Merkmale statischer Eigenschaften

Alle Instanzen einer Klasse teilen die statischen Eigenschaften in der Klasse.

Mit anderen Worten: Selbst wenn mehrere Instanzen im Speicher vorhanden sind, gibt es nur eine Kopie der statischen Attribute.

Im folgenden Beispiel wird ein Zähler-$count-Attribut auf „privat“ und „statisch“ gesetzt Körperpflege. Auf diese Weise kann die Außenwelt nicht direkt auf die Eigenschaft $count zugreifen. Als Ergebnis der Programmausführung sehen wir auch, dass mehrere Instanzen dasselbe statische $count-Attribut verwenden.

<?
class user{
    private static $count = 0 ; //记录所有用户的登录情况.
    public function __construct(){
        self::$count = self::$count + 1;
    }
    public function getCount(){    
        return self::$count;
    }
    public function __destruct(){
        self::$count = self::$count -1;
    }
}
$user1 = new user();
$user2 = new user();
$user3 = new user();
echo "now here have ".$user1->getCount()." user";
echo "<br>";
unset( $user3);
echo "now here have ".$user1->getCount()." user";
?>

Ergebnis der Programmausführung:
1
2

jetzt hier 3 Benutzer
jetzt hier 2 Benutzer jb51.net
Statische Eigenschaften werden direkt aufgerufen

Statische Eigenschaften können direkt ohne Instanziierung verwendet werden und können direkt vor der Erstellung der Klasse verwendet werden.

Die verwendete Methode ist Klassenname::statischer Eigenschaftsname.

<?
class Math{
    public static $pi = 3.14;

}
//求一个半径3的园的面积。
$r = 3;
echo "半径是 $r 的面积是<br>";
echo Math::$pi * $r * $r ;

echo "<br><br>";
//这里我觉得 3.14 不够精确,我把它设置的更精确。
Math::$pi = 3.141592653589793;
echo "半径是 $r 的面积是<br>";
echo Math::$pi * $r * $r ;
?>

Ergebnis der Programmausführung:
1
2
3
4

Die Fläche mit einem Radius von 3 beträgt
28,26
Der Radius beträgt 3 Der Bereich ist
28.2743338823

Die Klasse wird nicht erstellt und die statischen Attribute können direkt verwendet werden. Wann werden statische Eigenschaften im Speicher erstellt? Ich habe keine relevanten Informationen in PHP gesehen. Das Zitieren von Konzepten in Java zur Erklärung sollte ebenfalls universell sein.

Statische Eigenschaften und Methoden, die beim Aufruf der Klasse erstellt werden. Wenn eine Klasse aufgerufen wird, bedeutet dies, dass die Klasse erstellt oder ein beliebiges statisches Mitglied in der Klasse aufgerufen wird.
Statische Methoden

Statische Methoden können direkt verwendet werden, ohne dass die Klasse instanziiert wird.

Die verwendete Methode ist Klassenname:: statischer Methodenname.

Schreiben wir weiter diesen Mathematikkurs, um mathematische Berechnungen durchzuführen. Wir entwerfen eine Methode zur Berechnung des Maximalwerts. Da es sich um eine mathematische Operation handelt, müssen wir diese Klasse nicht instanziieren. Es wäre viel praktischer, wenn diese Methode übernommen und verwendet werden könnte.

Wir haben diese Klasse nur entworfen, um die statische Methode zu demonstrieren. PHP bietet die Funktion max() zum Vergleichen numerischer Werte.

<?
class Math{

    public static function Max($num1,$num2){
        return $num1 > $num2 ? $num1 : $num2;
    }    
}
$a = 99;
$b = 88;
echo "显示 $ a 和 $ b 中的最大值是";
echo "<br>";
echo Math::Max($a,$b);
echo "<br>";echo "<br>";echo "<br>";
$a = 99;
$b = 100;
echo "显示 $ a 和 $ b 中的最大值是";
echo "<br>";
echo Math::Max($a,$b);
?>

Ergebnisse der Programmausführung:

$ a und $ b anzeigen Der Maximalwert beträgt
99
$ a und $ b anzeigen Der Maximalwert beträgt
100
Wie eine statische Methode eine statische Methode aufruft

Im ersten Beispiel wird der Klassenname direkt verwendet, wenn eine statische Methode andere statische Methoden aufruft.

<?
// 实现最大值比较的Math类。
class Math{

    public static function Max($num1,$num2){
        return $num1 > $num2 ? $num1 : $num2;
    }
    public static function Max3($num1,$num2,$num3){
       $num1 = Math::Max($num1,$num2);
       $num2 = Math::Max($num2,$num3);
       $num1 = Math::Max($num1,$num2);       
       return $num1;
    }
}
$a = 99;
$b = 77;
$c = 88;
echo "显示 $a  $b $c  中的最大值是";
echo "<br>";
echo Math::Max3($a,$b,$c);
?>

Ergebnis der Programmausführung:
1
2

Der in 99 77 88 angezeigte Maximalwert ist
99

Sie können auch verwenden self :: Ruft andere statische Methoden in der aktuellen Klasse auf. (Vorschlag)

<?
// 实现最大值比较的Math类。
class Math{

    public static function Max($num1,$num2){
        return $num1 > $num2 ? $num1 : $num2;
    }
    public static function Max3($num1,$num2,$num3){
       $num1 = self::Max($num1,$num2);
       $num2 = self::Max($num2,$num3);
       $num1 = self::Max($num1,$num2);       
       return $num1;
    }
}
$a = 99;
$b = 77;
$c = 88;
echo "显示 $a  $b $c  中的最大值是";
echo "<br>";
echo Math::Max3($a,$b,$c);
?>

Ergebnis der Programmausführung:
1
2

Der maximal angezeigte Wert unter 99 77 88 ist
99
Statische Methodenaufrufe statisch Das Attribut

verwendet den Klassennamen::statischen Eigenschaftsnamen, um die statischen Eigenschaften in dieser Klasse aufzurufen.

<?
//
class Circle{
    public static $pi = 3.14;

    public static function circleAcreage($r){
      return $r * $r * Circle::$pi;
    }
}
$r = 3;
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);
?>

Ergebnis der Programmausführung:
1

Die Fläche eines Kreises mit Radius 3 beträgt 28,26

Verwenden Sie self:: zum Aufrufen die statischen Eigenschaften dieser Klasse. (Vorschlag)

<?
//
class Circle{
    public static $pi = 3.14;

    public static function circleAcreage($r){
      return $r * $r * self::$pi;
    }
}
$r = 3;
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);
?>

Ergebnis der Programmausführung:
1

Die Fläche eines Kreises mit Radius 3 beträgt 28,26
Statische Methoden können keine nichtstatischen Eigenschaften aufrufen

Statische Methoden können keine nicht statischen Eigenschaften aufrufen. Nicht statische Eigenschaften können nicht mit self:: aufgerufen werden.

<?
//
class Circle{
    public $pi = 3.14;

    public static function circleAcreage($r){
      return $r * $r * self::pi;
    }
}
$r = 3;
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);
?>

Ergebnis der Programmausführung:
1

Schwerwiegender Fehler: Undefinierte Klassenkonstante „pi“ in E:PHPProjectstest.php in Zeile 7

Sie können $this auch nicht verwenden, um den Wert nicht statischer Eigenschaften abzurufen.

<?
//
class Circle{
    public $pi = 3.14;

    public static function circleAcreage($r){
      return $r * $r * $this->pi;
    }
}
$r = 3;
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);
?>

Ergebnis der Programmausführung:
1

Schwerwiegender Fehler: Verwendung von $this, wenn nicht im Objektkontext in E:PHPProjectstest.php in Zeile 7
Statische Methode ruft nicht-statische Methode auf

In PHP5 kann der Bezeichner $this nicht in einer statischen Methode zum Aufrufen einer nicht-statischen Methode verwendet werden.

<?
// 实现最大值比较的Math类。
class Math{   
    public function Max($num1,$num2){
        echo "bad<br>";       
        return $num1 > $num2 ? $num1 : $num2;
    }
    public static function Max3($num1,$num2,$num3){
       $num1 = $this->Max($num1,$num2);
       $num2 = $this->Max($num2,$num3);
       $num1 = $this->Max($num1,$num2);       
       return $num1;
    }
}
$a = 99;
$b = 77;
$c = 188;
echo "显示 $a  $b $c  中的最大值是";
echo "<br>";
echo Math::Max3($a,$b,$c);
?>

Ergebnis der Programmausführung:

Zeigt an, dass der Maximalwert unter 99 77 188 ist
Schwerwiegender Fehler: Verwendung von $this, wenn nicht in Objektkontext in E:test.php in Zeile 10

Wenn eine nicht statische Methode in einer Klasse von self:: aufgerufen wird, konvertiert das System diese Methode automatisch in eine statische Methode.

Der folgende Code wurde ausgeführt und lieferte Ergebnisse. Weil die Max-Methode vom System in eine statische Methode umgewandelt wird.

<?
// 实现最大值比较的Math类。
class Math{   
    public function Max($num1,$num2){      
        return $num1 > $num2 ? $num1 : $num2;
    }
    public static function Max3($num1,$num2,$num3){
       $num1 = self::Max($num1,$num2);
       $num2 = self::Max($num2,$num3);
       $num1 = self::Max($num1,$num2);       
       return $num1;
    }
}
$a = 99;
$b = 77;
$c = 188;
echo "显示 $a  $b $c  中的最大值是";
echo "<br>";
echo Math::Max3($a,$b,$c);
?>

Ergebnis der Programmausführung:
1
2

Der in 99 77 188 angezeigte Maximalwert beträgt
188

Im Beispiel unten , lassen wir die statische Methode Max3 self:: verwenden, um die nicht-statische Methode Max aufzurufen, und lassen die nicht-statische Methode Max die nicht-statische Eigenschaft $pi über $this aufrufen.

Beim Ausführen wurde ein Fehler gemeldet. Dieser Fehler ist derselbe wie im vorherigen Beispiel 3-1-9.php. Diesmal hat die nicht-statische Methode Max einen Fehler beim Aufruf nicht-statischer Eigenschaften durch a gemeldet statische Methode.

Das beweist etwas. Die hier definierte nicht-statische Methode Max wird vom System automatisch in eine statische Methode umgewandelt.

<?
// 实现最大值比较的Math类。
class Math{
    public $pi = 3.14;

    public function Max($num1,$num2){
        echo self::$pi;  //这里的调用看来不应该有问题.
        return $num1 > $num2 ? $num1 : $num2;
    }
    public static function Max3($num1,$num2,$num3){
       $num1 = self::Max($num1,$num2);
       $num2 = self::Max($num2,$num3);
       $num1 = self::Max($num1,$num2);       
       return $num1;
    }
}
$a = 99;
$b = 77;
$c = 188;
echo "显示 $a  $b $c  中的最大值是";
echo "<br>";
echo Math::Max3($a,$b,$c);
?>

程序运行结果:
1
2

显示 99 77 188 中的最大值是
Fatal error: Access to undeclared static property: Math::$pi in E:PHPProjectstest.php on line 7


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn