面向对象的静态属性、静态方法

静态属性:

基本概念:

  静态属性是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。

定义静态属性 

  (1)   访问修饰符 static 静态属性名;

  (2)   static 访问修饰符 静态属性名;

:: 叫 范围解析符

在类的内部访问可以使用两种方式  self::$静态属性名  ,  类名::$静态属性名

在类的外部访问静态属性,静态属性需要是public ,否则也不能直接访问, 访问的形式是 类名::$属性名

快速入门案例:

/*
    创建一个类:唐僧队伍 类中包含了姓名、年龄、个人每天消耗的食物数量
    队伍不断的有成员加入 唐僧、孙悟空、猪八戒、沙僧
    $num表示队伍的人数 $food_sum表示队伍每天消耗的蛋糕数量
*/
class Person{
    public $name;
    public $age;
    public $food_num;
    //创建静态属性
    public static $num = 0;
    public static $food_sum = 0;
    public function __construct($name,$age,$food_num){
        $this -> name = $name;
        $this -> age = $age;
        $this -> food_num = $food_num;
    }
    public function num(){
        //内部访问静态属性
        self :: $num++; 
        self :: $food_sum += $this -> food_num; 
    }
}
$p1 = new Person('唐僧',24,3);
$p1 -> num();
$p2 = new Person('孙悟空',720,5);
$p2 -> num();
$p3 = new Person('猪八戒',360,9);
$p3 -> num();
$p4 = new Person('沙僧',180,30);
$p4 -> num();
//外部访问静态属性
echo '师徒一共' . Person::$num . '人' . '每天吃' .  Person::$food_sum . '块蛋糕';
//创建一个类来计算一共有1000块蛋糕每过一天蛋糕还剩多少
class Day{ public $day; public static $sum = 1000; public function sum(){ self::$sum -= Person:: $food_sum; } } $day1 = new Day(); $day1 -> day = '第一天'; $day1 -> sum(); echo '<br>' . $day1 -> day . "蛋糕还剩下" . Day::$sum; $day2 = new Day(); $day2 -> day = '第二天'; $day2 -> sum(); echo '<br>' . $day2 -> day . "蛋糕还剩下" . Day::$sum; 输出结果: 师徒一共4人每天吃47块蛋糕 第一天蛋糕还剩下953 第二天蛋糕还剩下906

 静态方法:

基本概念:  

  当程序员需要对静态属性进行操作时,可以定义静态方法来处理, 静态方法是专门用于操作静态属性.

说明:

  (1)   静态方法是在类中定义的

  (2)   static 是关键字,不能修改.

  (3)   静态方法专门用于操作静态属性

  (4)   静态方法可以通过类名直接调用. 形式是 类名::静态方法名(参数 )

快速入门案例:

class Person{
    public $name;
    private static $address = '北京';
    public function __construct($name){
        $this -> name = $name; 
    }
    //静态方法操作静态属性
    public static function showAddress(){
        echo '<br>地址是' . self::$address;
    }
}
//外部调用静态方法
Person::showAddress();

细节:

  在类外部调用静态方法:  类名::静态方法名 或者 对象名->静态方法名 或者 对象名::静态方法(语法支持,但是不推荐)

  举例说明:

class Person{
    public $name;
    private static $address = '北京';
    public function __construct($name){
        $this -> name = $name; 
    }
    //静态方法操作静态属性
    public static function showAddress(){
        echo '<br>地址是' . self::$address;
    }
}
//外部调用静态方法
//第一种调用方法:推荐使用
Person::showAddress();
//后面两种调用方法不推荐使用但是需要了解
$p1 = new Person('小明');
$p1 -> showAddress();
$p1::showAddress();

  在类内部调用静态方法:    self::静态方法名 或者 类名::静态方法名 , 通过 $this也可以

  举例说明:

class Person{
    public $name;
    private static $address = '北京';
    public function __construct($name){
        $this -> name = $name; 
    }
    //静态方法操作静态属性
    private static function showAddress(){
        echo '<br>地址是' . self::$address;
    }
    //通过内部调用
    public function test(){
        //方式一:推荐使用
        self::showAddress();
        //其余两种方式不推荐使用但是需要了解
        //方式二:
        Person::showAddress();
        //方式三:
        $this -> showAddress();
    }
}
$p1 = new Person('小明');
$p1 -> test();

  ③静态方法中只能访静态属性,不能访问非静态属性(普通属性, 没有static)

  ④普通的成员方法,可以访问静态属性和非静态属性

原文地址:https://www.cnblogs.com/rickyctbur/p/11067844.html