PHP 中static ,const,final的设值和访问
static :Static 关键字是在类中描述成员属性和成员方法是静态的;static成员总是唯一存在的,被类的全部对象实例共享。静态的成员好处在那里呢? 前面我们声明了“Person”的人类,在“Person”这个类里如果我们加上一个“人所属国家” 的属性,这样用“Person”这个类实例化出几百个或者更多个实例对象,每个对象里面就都 有“所属国家”的属性了,如果开发的项目就是为中国人而开发的,那么每个对象里面就都 有一个国家的属性是“中国”其它的属性是不同的,如果我们把“国家”的属性做成静态的 成员,这样国家的属性在内存中就只有一个,而让这几百个或更多的对象共用这一个属性, static 成员能够限制外部的访问,因为static 的成员是属于类的,是不属于任何对象实例,是 在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程 度对类该成员形成保护;静态成员是在类第一次加载的时候就创建的,所以在类的外部不需要对象而使用类
名就可以访问的到静态的成员;静态成员被这个类的每个实例对象所共享
从内存的角度我们来分析一下,内存从逻辑上被分为四段,其中对象是放在“堆内存”里
面,对象的引用被放到了“栈内存”里,而静态成员则放到了“初始化静态段”,在类第一次 被加载的时候放入的,可以让堆内存里面的每个对象所共享,如下图;

const: const关键字是在类中定义常量(并不是定义类的属性和方法),而define()函数也是定义常量,但它是在类外定义常量。const标识的常量的属性是只读的,不能重新赋值,所以一定要在定义的时候初始化。使用const声明的常量名称前不要使用“$”符号,并且常量名通常都是大写
final :类属性(成员)不能被定义为 final,只有类和方法才能被定义为 final。。作用: 使用final标识的类,不能被继承。在类中使用final标识的成员方法,在子类中不能覆盖。总结:final表示为最终的意思,所以使用final关键字的类或者类中的成员方法是不能被更改的。但是我们在子类中依然可以继承这个方法

static 属性的访问:类外:类名::静态成员属性名;类名::静态成员方法名(); Person::$myCountry;(推荐使用的方法)
对象引用::静态成员属性名;对象引用::静态成员方法名();$person=new Person(); $person::$myCountry;
建议在类外使用类名访问静态的属性或方法。(此时有一个类自动加载,spl_autoload_register方法,来引入类才能使用)
类内:self::静态成员属性名;self::静态成员方法名()。self::$myCountry; self::say();
其他使用原则:在使用静态方法时需要注意,在静态方法中只能访问静态成员。因为非静态的成员必须通过对象的引用进行访问,通常是使用$this完成。静态方法中可以有传入的参数和自己定义的局部变量
以此来进行逻辑处理。
const属性的访问:调用方式和静态成员是一样的,都是通过类名或者在成员方法中使用self关键字进行访问,但是不建议使用对象引用进行访问。

static 和const的区别和联系:在实际工作中会有一个类的多个对象,可能会共享一份数据。
解决办法:
1:类常量,不能更改。const
2、有时在共享一份数据后,还要所有的共享此数据的对象还允许更改。
所以就有static
浙公网安备 33010602011771号