ホームページ  >  記事  >  php教程  >  PHP オブジェクト指向の旅: 静的変数とメソッドの深い理解

PHP オブジェクト指向の旅: 静的変数とメソッドの深い理解

黄舟
黄舟オリジナル
2016-12-12 17:06:071385ブラウズ

static キーワードは、属性またはメソッドがクラスの特定のインスタンスではなく、クラスに関連していることを宣言するため、このタイプの属性またはメソッドは「クラス属性」または「クラス メソッド」とも呼ばれます。

アクセス制御権限が許可する場合は、このクラスのオブジェクトを作成せずに、クラス名と 2 つのコロン「::」を使用して直接呼び出すことができます。

static キーワードは変数とメソッドを変更するために使用できます。

インスタンス化せずに、クラス内の静的属性と静的メソッドに直接アクセスできます。

静的 静的プロパティとメソッドのみにアクセスでき、非静的プロパティとメソッドにはクラスからアクセスできません。静的プロパティと静的メソッドが作成されるとき、呼び出すことができるこのクラスのインスタンスがまだ存在しない可能性があるためです。

静的プロパティはメモリ内に 1 つのコピーのみを持ち、すべてのインスタンスによって共有されます。

現在のクラスの静的メンバーにアクセスするには、self:: キーワードを使用します。
静的プロパティの公開機能

クラスのすべてのインスタンスは、クラス内の静的プロパティを共有します。

言い換えると、メモリ内に複数のインスタンスがあっても、静的属性のコピーは 1 つだけです。

次の例では、counter $count 属性がプライベートおよび静的に設定されています グルーミング。このようにして、外部の世界は $count プロパティに直接アクセスできなくなります。プログラムを実行した結果、複数のインスタンスが同じ静的 $count 属性を使用していることもわかります。

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

プログラムの実行結果:
1
2

現在ここには 3 人のユーザーがいます
現在ここには 2 人のユーザーがいます jb51.net
静的プロパティは直接呼び出されます

静的プロパティはインスタンス化せずに直接使用でき、クラスを作成する前に直接使用できます。

使用するメソッドはクラス名::静的プロパティ名です。

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

プログラムの実行結果:
1
2
3
4

半径3のエリアは
28.26
半径は3です エリアは
28.2743338823

クラスは作成されず、静的属性を直接使用できます。静的プロパティはいつメモリ内に作成されますか? PHP には関連する情報がありません。 Java の概念を引用して説明することも普遍的である必要があります。

静的プロパティとメソッド。クラスが呼び出されたときに作成されます。クラスが呼び出されるときは、クラスが作成されるか、クラス内の静的メンバーが呼び出されることを意味します。
静的メソッド

静的メソッドは、クラスをインスタンス化せずに直接使用できます。

使用するメソッドはクラス名::静的メソッド名です。

数学的な計算を実行するために、この Math クラスの作成を続けましょう。最大値を計算する方法を設計します。数学的な演算なので、このクラスをインスタンス化する必要はなく、このメソッドを引き継いで使用できるとさらに便利です。

このクラスは、静的メソッドを説明するためだけに設計されました。 PHP には、数値を比較するための max() 関数が用意されています。

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

プログラム実行結果:

$ a と $ b を表示 最大値は
99
$ a と $ b を表示 最大値は
100です
静的メソッドから静的メソッドを呼び出す方法

最初の例は、静的メソッドが他の静的メソッドを呼び出すときに、クラス名を直接使用します。

<?
// 实现最大值比较的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);
?>

プログラムの実行結果:
1
2

は、99 77 88 の最大値が
99

であることを示しています。 self:: を使用して、現在のクラス内の他の静的メソッドを呼び出すこともできます。 (提案)

<?
// 实现最大值比较的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);
?>

プログラム実行結果:
1
2

99 77 88の最大値が99であることを表示

静的メソッドは静的プロパティを呼び出します

この中で静的プロパティを呼び出すにはクラス名::静的プロパティ名を使用してくださいクラス 。

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

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

プログラムの実行結果:
1

半径3の円の面積は28.26です

このクラスの静的プロパティを呼び出すにはself::を使用します。 (提案)

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

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

プログラム実行結果:
1

半径3の円の面積は28.26
静的メソッドは非静的プロパティを呼び出すことはできません

静的メソッドは非静的プロパティを呼び出すことはできません。 self:: を使用して非静的プロパティを呼び出すことはできません。

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

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

プログラムの実行結果:
1

致命的なエラー: 未定義のクラス定数 'pi' E:PHPProjectstest.php の 7 行目

$this を使用して非静的プロパティの値を取得することもできません。

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

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

プログラムの実行結果:
1

致命的なエラー: オブジェクトコンテキストにないときに $this を使用しています E:PHPProjectstest.php の 7 行目
静的メソッドは非静的メソッドを呼び出します

PHP5 では、静的メソッドで $this 識別子を使用して非静的メソッドを呼び出すことはできません。

<?
// 实现最大值比较的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);
?>

プログラムの実行結果:

は、99 77 188 の最大値が
致命的なエラー: $this を使用していないことを示します。 E:test.php の 10 行目のオブジェクト コンテキスト

クラス内の非静的メソッドが self:: によって呼び出される場合、システムはこのメソッドを自動的に静的メソッドに変換します。

次のコードが実行され、結果が生成されました。 Max メソッドはシステムによって静的メソッドに変換されるためです。

<?
// 实现最大值比较的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);
?>

プログラムの実行結果:
1
2

は、99 77 188 の最大値が
188 であることを示しています

次の例では、静的メソッド Max3 に self:: を使用して非静的メソッドを呼び出します。 Max, let 非静的メソッド Max は、$this を通じて非静的プロパティ $pi を呼び出します。

実行時にエラーが報告されました。このエラーは、前の例 3-1-9.php と同じです。今回は、非静的メソッド Max が静的メソッドによる非静的プロパティの呼び出しのエラーを報告しました。

これは、ここで定義した非静的メソッド Max が、システムによって自動的に静的メソッドに変換されることを証明しています。

<?
// 实现最大值比较的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


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