1. static の定義と機能を理解する
2. static の使い方と特徴をマスターする
us 知識を学ぶには、3w1h の考え方に基づいて学ぶことができます。3w1h
3w1h とは、
● What (what)
● Why (なぜ使うのか、その機能は何なのか)
#●● Where (利用シナリオ) # How (具体的な使い方) # (1) 定義static キーワードの役割 (what)1. static によって変更されたプロパティやメソッドは、クラスの static メンバーと呼ばれます要約:
1. 静的 属性を定義するには、属性定義の直前に static を追加します (例: static public $name ; 2. 静的属性はクラスのインスタンスによって取得できませんが、次の方法: # クラス名::$属性名#● クラス内で、self::$属性名 3. 静的メソッドを定義するにはstatic public function Hello(){ } 4. 静的メソッドはクラス インスタンスを使用して取得できませんが、次の方法で取得できます。 ● クラス名::メソッド名
# 9. 非静的メソッド内では、非静的メソッドと非静的メソッドの両方が呼び出されます-静的メソッドと静的メソッドを呼び出すことができます。
すべての要約は実践に基づいています。次に、実際のコードを使用して上記の各要約を示し、それらが正しいかどうかを確認します。
(4 )、特定のコード
ケース 1:実践的な目標:
1. 静的属性を定義するには、属性定義の直前に static を追加します。 as static public $name;
2. 静的属性では、
のインスタンスを取得する代わりにクラスを使用できません。実行結果は次のとおりです。# #ケース 2:
実践的な目標: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(); ?>
を渡すと、結果は次のようになります:
練習目標:
1. PHP では、静的を使用してクラスを変更することはできません。変更できるのはプロパティまたはメソッドのみです。
<?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 サイトの他の関連記事を参照してください。