php基础巩固加强(六)

静态(static)

在类中也有类似函数的静态变量之类的东西,(函数中:不被重复定义,函数的多次调用共有一个静态变量)使用静态修饰的表示该属性或者方法属于类,不会因为对象的实例化而改变其本身的内容。

语法:

1.静态属性: 访问修饰限定符 static 属性名字

2.静态方法: 访问修饰限定符 static function 方法名字(){}

静态访问:  类::静态属性或者静态方法

静态属性demo:

//假如有这样一个需求:当类创建一个对象时,使用一个计数器将对象的数量给记录下来,也就是说统计你一共创建了几个对象 见以下代码:

//静态
class Person
{
    //属性
    public  $name;
    private $age;

    //静态属性
    public static $count = 0;

    //方法
    public function __construct($name,$age){
        //初始化
        $this->name = $name;
        $this->age  = $age;

        //计数器
        self::$count++;
    }
}

//创建一个对象
$person1 = new Person('萧峰',30);

echo Person::$count; //访问类内的静态属性$count  输出: 1

//Person::$count = 10; //可以从外部修改类的内部数据(不安全)

$person2 = new Person('慕容复',28);

echo Person::$count; //输出: 2

//这样就满足了一共创建了多少个对象这样的需求。
//注意:无论是类的内部还是类的外部访问静态属性的时候 属性名字都必须加上$符号(Person::$count) 如果是这样写Person::count,表示的是访问一个常量

由于上面的静态属性$count是public 在类的外部可以修改 所以下面我们将$count定义成private,在类的内部定义一个公共静态方法来实现一共创建了多少个对象

静态方法demo:

//静态
class Person
{
    //属性
    public  $name;
    private $age;

    //静态属性
    private static $count = 0;

    //方法
    public function __construct($name,$age)
    {
        //初始化
        $this->name = $name;
        $this->age  = $age;

        //计数器
        self::$count++;
    }

    //定义一个静态方法,来获取对象数量
    public static function getCount()
    {
        //返回当前计数器的值
        return self::$count;
    }

}

//实例化
$person1 = new Person('萧峰',30);
$person2 = new Person('慕容复',28);

//echo Person::getCount();  //类访问静态方法
echo $person2->getCount();  //可以,对象也可以访问静态的方法  输出:2 (因为创建了两次对象)
//echo $person2->count;   //不可以

//这样既实现了统计一共创建了多少个对象的需求,也让类内部定义的静态属性$count不能在类的外部被修改(恶意修改)

静态与非静态的区别

1.设置出发点:静态是给类使用,非静态是给对象使用

2.对象不能访问静态属性(对象访问属性只会去对象的内存区域(堆)找,而静态属性在内存中的代码区),对象能够访问静态方法(静态方法和普通方法都在内存区域中的代码区里)

3.类能够访问普通方法(前提是 方法里面没有使用$this),类不能访问普通属性(属性是在对象空间里,也就是内存中的堆中)

代码案例如下:

<?php

   //定义一个类
   class Person
    {
        //属性
        public  $name;
        private $age;

        //静态属性
        public static $count = 0;

        //普通方法
        public function setAge($age)
        {
            $this->age = $age;
        }

        public function test()
        {
            echo 'hello world';
        }
    }

   //实例化
   $person = new Person('白眉鹰王',58);

   //省略对象访问

   //类访问非静态属性和方法
   //属性访问
   Person::$count;     //可以,因为$count是静态属性,就在代码区中
   //Person::$name;   //不可以,$name是普通属性,存在 在堆里,类找不到

   //方法访问
   Person::test();      //可以,但是因为test方法不是静态方法,本身不是为类存在的,所以会有一个类似警告的提示
   Person::setAge(20);  //不可以,因为setAge方法内部使用了$this 而$this代表当前对象 但是 此时不是对象在访问setAge,所以会报错


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与