ホームページ  >  記事  >  バックエンド開発  >  オブジェクト指向PHPのStaticキーワードの詳しい説明(コード例)

オブジェクト指向PHPのStaticキーワードの詳しい説明(コード例)

易达
易达オリジナル
2020-05-25 14:08:081857ブラウズ

この記事の目的:

1. static の定義と機能を理解する

2. static の使い方と特徴をマスターする

us 知識を学ぶには、3w1h の考え方に基づいて学ぶことができます。3w1h

3w1h とは、

● What (what)

● Why (なぜ使うのか、その機能は何なのか)

#●● Where (利用シナリオ)

# How (具体的な使い方)

# (1) 定義static キーワードの役割 (what)

1. static によって変更されたプロパティやメソッドは、クラスの static メンバーと呼ばれます

(2) static キーワードの役割 (why)

1. クラスのすべてのインスタンスが特定の属性またはメソッドを共有できるようにします。

(3). 静的使用シナリオ (どこで)

1.特定のメソッドまたは属性をすべてのインスタンスで共有する場合は、static を検討できます

(4)、static の詳細な使用法 (方法)

要約:

1. 静的 属性を定義するには、属性定義の直前に static を追加します (例: static public $name ;

2. 静的属性はクラスのインスタンスによって取得できませんが、次の方法:

# クラス名::$属性名

#● クラス内で、self::$属性名

3. 静的メソッドを定義するにはstatic public function Hello(){ }

4. 静的メソッドはクラス インスタンスを使用して取得できませんが、次の方法で取得できます。

● クラス名::メソッド名


● クラス内では、self::メソッド名を使用できます

5. PHP では、static を使用してクラスを変更することはできません。変更できるのはプロパティまたはメソッドのみです。

6. 静的メソッド内では、非静的プロパティは呼び出すことができません。静的プロパティのみを呼び出すことができます。

7. 静的メソッド内では、非静的メソッドを呼び出すことはできません。静的メソッドのみ

# 8. 非静的メソッドは非静的メソッド内で呼び出すことができます 静的プロパティは静的プロパティとも呼び出すことができます


# 9. 非静的メソッド内では、非静的メソッドと非静的メソッドの両方が呼び出されます-静的メソッドと静的メソッドを呼び出すことができます。

すべての要約は実践に基づいています。次に、実際のコードを使用して上記の各要約を示し、それらが正しいかどうかを確認します。

(4 )、特定のコード

ケース 1:

実践的な目標:

1. 静的属性を定義するには、属性定義の直前に static を追加します。 as static public $name;

2. 静的属性では、

のインスタンスを取得する代わりにクラスを使用できません。実行結果は次のとおりです。

# #ケース 2:

実践的な目標:

オブジェクト指向PHPのStaticキーワードの詳しい説明(コード例) 1. 静的メソッド定義。静的パブリック関数 Hello(){ }

# など、メソッド定義の直前に static を追加します。 ## 2. 静的メソッドはクラスのインスタンスを使用して取得できませんが、次の方法で取得できます。

● クラス名::メソッド名

● クラス内self:: メソッド名

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

を渡すと、結果は次のようになります:


ケース 3:

練習目標:

1. PHP では、静的を使用してクラスを変更することはできません。変更できるのはプロパティまたはメソッドのみです。オブジェクト指向PHPのStaticキーワードの詳しい説明(コード例)

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

?>

実行結果は次のとおりです:

解析エラー: 構文エラー、予期しない 'class' (T_CLASS)、D:\E-class\class-code\classing\index.php の :: (T_PAAMAYIM_NEKUDOTAYIM) を期待しています 2

ケース 4:

実践的な目標:

1. 静的メソッド内で非静的プロパティを呼び出すことはできず、静的プロパティのみを呼び出すことができます

<?php 
static class Human{
   
}
?>

実行結果は次のとおりです:

静的属性-ヒューマン

致命的エラー: キャッチされないエラー: D:\E-class\class -code\classing\index.php:8 のオブジェクト コンテキストにないときに $this を使用しています。スタック トレース: #0 D:\E-class\class-code\classing\index.php(18): Human::staticFun1() #1 {main} が D: \E-class\class-code\classing\index.php でスローされました8行目

ケース5:

実用的な目標:


1.静的非静的メソッドはメソッド内で呼び出すことはできず、静的メソッドのみを呼び出すことができます

<?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
?>

実行結果は次のとおりです:

私は静的メソッド 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关键字的定义和特点

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

以上がオブジェクト指向PHPのStaticキーワードの詳しい説明(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。