Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung des Static-Schlüsselworts in objektorientiertem PHP (Codebeispiel)

Detaillierte Erklärung des Static-Schlüsselworts in objektorientiertem PHP (Codebeispiel)

易达
易达Original
2020-05-25 14:08:081876Durchsuche

Ziele dieses Artikels:

1. Die Definition und Funktion von Statik verstehen

2. Die Verwendung und Eigenschaften von Statik beherrschen

Um ein Stück Wissen zu lernen, können Sie es basierend auf den Ideen von 3w1h lernen. Lassen Sie uns 3w1h kurz vorstellen 🎜>● warum (warum es verwenden, welche Funktion hat es)

● wo (Nutzungsszenario)

● wie (insbesondere wie es verwendet wird)

(1) , Definition des statischen Schlüsselworts (was)

1. Durch statische Eigenschaften oder Methoden werden statische Mitglieder der Klasse genannt

(2) Die Rolle des statischen Schlüsselworts (warum)

1. Lassen Sie alle Instanzen einer Klasse ein bestimmtes Attribut oder eine bestimmte Methode teilen

(3) Statische Verwendungsszenarien (wo) 1 Wenn eine bestimmte Methode oder ein bestimmtes Attribut von allen Instanzen gemeinsam genutzt wird, können Sie statische

(4) in Betracht ziehen, detaillierte Verwendung von statischen (wie)

Zusammenfassung:

1. Statisch Um ein Attribut zu definieren, fügen Sie statisch direkt vor der Attributdefinition hinzu. Zum Beispiel static public $name::$Attribute Name

● Innerhalb der Klasse können Sie self übergeben: :$Attribute Name 3. Um eine statische Methode zu definieren, fügen Sie statische Methoden direkt vor der Methodendefinition hinzu, z. B. die statische öffentliche Funktion Hello(){ }

4. Statische Methoden können nicht abgerufen werden Instanzen von Klassen, aber durch die folgenden Methoden:

● Klassenname::Methodenname

● Innerhalb der Klasse können Sie self::methodenname

5. In PHP können Sie nicht statisch verwenden, um die Klasse zu ändern, Sie können nur die Eigenschaften oder Methoden ändern

6. Innerhalb der statischen Methode können nicht statische Eigenschaften nicht aufgerufen werden, sondern nur statische Eigenschaften

7. Nicht-statische Methoden können nicht innerhalb statischer Methoden aufgerufen werden, nur statische Methoden

können aufgerufen werden. 8. Innerhalb nicht-statischer Methoden können beide nicht-statischen Methoden aufgerufen werden. Statische Eigenschaften können auch statische Eigenschaften aufrufen

9. Innerhalb nicht statischer Methoden können Sie entweder nicht statische Methoden oder statische Methoden aufrufen.

Alle Zusammenfassungen basieren auf der Praxis. Als Nächstes verwenden wir tatsächlichen Code um jede Zusammenfassung oben zu demonstrieren, um zu sehen, ob sie korrekt ist

(4), spezifischer Code

Fall 1:


Praktische Ziele:

1. Um statische Attribute zu definieren, fügen Sie statische Attribute direkt vor der Attributdefinition hinzu, z. B. static public $name;

2. Statische Attribute können keine Klassen verwenden. Rufen Sie sie stattdessen mit den folgenden Methoden ab:

● Klassenname::$Attribute name

● Innerhalb der Klasse können Sie self::$Attribute name verwenden

<?php 
 class Human{
    static public $name = "人类";//静态属性的定义
    public function say(){
        echo  "self::name = ".self::$name ."<br/>";
    }
}
//输出静态属性
echo "名称为:".Human::$name."<br/>";
$human = new Human();
$human->say();
?>

Das laufende Ergebnis ist:

Fall 2:

Praktisches Ziel:

1. Statische Methodendefinition, fügen Sie statische Methoden direkt vor der Methodendefinition hinzu, z. B. static public function Hello(){ }

2. Statische Methoden können nicht mit Instanzen der Klasse abgerufen werden, können aber auf folgende Weise abgerufen werden: Detaillierte Erklärung des Static-Schlüsselworts in objektorientiertem PHP (Codebeispiel)

●Klassenname::Methodenname

● Innerhalb der Klasse können Sie self::Methodenname übergeben

<?php 
 class Human{
    public function __construct(){
        self::staticFun1();
    }
    static public function staticFun1(){
        echo "我是静态方法<br/>";
    }
}
//输出静态方法
Human::staticFun1();
//运行构造函数,看是否可以被正常调用
$human = new Human();

?>

Das Ergebnis ist:

Fall 3 :

Praktische Ziele:

1. In PHP können Sie keine Statik verwenden, um Klassen zu ändern, sondern nur Attribute oder Methoden

<?php 
static class Human{
   
}
?>

Das laufende Ergebnis ist:Detaillierte Erklärung des Static-Schlüsselworts in objektorientiertem PHP (Codebeispiel)

Parse-Fehler: Syntaxfehler, unerwartete 'Klasse' (T_CLASS), erwartet :: (T_PAAMAYIM_NEKUDOTAYIM) in D:E-classclass-codeclassingindex.php in Zeile 2

Fall 4:

Praktische Ziele:

1. Nicht-statische Eigenschaften können nicht innerhalb statischer Methoden aufgerufen werden, nur statische Eigenschaften können aufgerufen werden

<?php 
class Human{
    static public $staticName = "静态属性-人类";
    public $commonName="非静态属性-人类";
    
    //定义静态方法 静态方法调用非静态属性
    static public function staticFun1(){
        echo $this->commonName."<br/>";
        
    }
    //测试静态方法调用静态属性
    static public function staticFun2(){
        echo self::$staticName."<br/>";
        
    }
}
Human::staticFun2();//OK
Human::staticFun1();//not OK
?>

Das laufende Ergebnis ist:

Static Property-Human

Schwerwiegender Fehler: Nicht erfasster Fehler: Verwendung von $this, wenn nicht im Objektkontext in D:E-classclass-codeclassingindex.php:8 Stack-Trace: # 0 D:E-classclass -codeclassingindex.php(18): Human::staticFun1() #1 {main} in D:E-classclass-codeclassingindex.php in Zeile 8 geworfen

Fall 5:

Praktische Ziele:

1. Nicht statische Methoden können nicht innerhalb statischer Methoden aufgerufen werden, nur statische Methoden können aufgerufen werden

<?php 
class Human{
   
    //定义静态方法 
    //测试静态方法调用 静态方法
    static public function staticFun1(){
        self::staticFun2();
        $this->commonFun1();
    }
    static public function staticFun2(){
        echo "我是静态方法2<br/>";
    }
    //普通方法
    public function commonFun1(){
        echo "我是普通方法1<br/>";
    }

    
}
Human::staticFun1();
?>

Das Operationsergebnis ist:

Ich bin statische Methode 2

Fatal error: Uncaught Error: Using $this when not in object context in D:\E-class\class-code\classing\index.php:8 Stack trace: #0 D:\E-class\class-code\classing\index.php(20): Human::staticFun1() #1 {main} thrown in D:\E-class\class-code\classing\index.php on line 8

案例六:

实践目标:

1、非静态方法内部,既可以调用非静态属性也可以调用静态属性

<?php 
class Human{
    static public $staticName = "静态属性-人类";
    public $name = "非静态属性-人类";

    ///普通方法
    public function commonFun1(){
       echo self::$staticName."<br/>";
       echo $this->name."<br/>";
    }

}
$human = new Human();
$human->commonFun1();
?>

运行结果为:

静态属性-人类
非静态属性-人类

案例七:

实践目标:

1、非静态方法内部,既可以调用非静态方法也可以调用静态方法

<?php 
class Human{
    ///普通方法
    public function commonFun1(){
       self::staticFun1();
       $this->commonFun2();
    }

    //测试静态方法调用 静态方法
    static public function staticFun1(){
        echo "我是静态方法1<br/>";
    }
    public function commonFun2(){
        echo "我是普通方法2<br/>";
    }
}
$human = new Human();
$human->commonFun1();
?>

运行结果为:

我是静态方法1
我是普通方法2

(五)、学以致用

问题:

    1、所有的NBA球员都有一个共同的联盟总裁,David Stern(大卫*斯特恩)

    2、总裁换成了“Adam Silver” 怎么办?

     大家自己思考一下,再看后面的结果

.........................

答案揭晓:

思路分析:

1、“换”是一个动词,换总裁,所以是一个方法,而总裁是一个数据,所以是一个属性

2、换总裁要达到一个目的就是,换了以后,这个对象仍然要被其他所有的NBA球员对象使用到

3、既然 总裁 (属性) 要被所有的NBA球员对象 共享,那么我们就可以结合static的作用,将总裁属性定义为静态属性

4、所以根据综上所述,大概的思路就是定义一个NBA球员类,然后类里面主要有静态属性“总裁”和一个 换总裁 的方法

具体代码如下:

<?php 
//Nba球员类
class NbaPlayer{
    public $name = "";
    //构造函数初始化对象
    public function __construct($name){
        $this->name = $name;
    }
    //总裁
    static public $president = "David Stern";

    //换总裁方法
    public function changePresident($name){
      self::$president = $name;
    }

}
$jordon = new NbaPlayer("乔丹");
$kebo = new NbaPlayer("科比");
echo "输出他们目前共同的总裁,总裁为:".NbaPlayer::$president."<br/>";

echo "现在把乔丹总裁换成Adam Silver<br/>";
$jordon->changePresident("Adam Silver");
echo "输出科比的总裁是否也和乔丹的一样,科比总裁为:".NbaPlayer::$president."<br/>";
?>

运行结果为:

输出他们目前共同的总裁,总裁为:David Stern
现在把乔丹总裁换成Adam Silver
输出科比的总裁是否也和乔丹的一样,科比总裁为:Adam Silver

总结:

1、本文主要是讲了static关键字的定义和特点

希望本文能给大家带来一定的帮助,谢谢!!!

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Static-Schlüsselworts in objektorientiertem PHP (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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