我们实例化的对象是存在堆内存的,实例化出来的 对象时存在 栈内存的
static关键字是在类中描述成员属性和成员方法是静态的
static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;
从内存的角度我们来分析一下,内存从逻辑上被分为四段,其中对象是放在“堆内存”里面,对象的引用被放到了“栈内存“里,而静态成员则放到了“初始化静态段”,在类第一次被加载的时候放入的,可以让堆内存里面的每个对象所共享,如下图:
<? class Person { // 下面是人的静态成员属性 public static $myCountry = "中国"; // var $name; //人的名子 // 这是人的静态成员方法 public static function say() { echo "我是中国人"; } } // 输出静态属性 echo Person::$myCountry; // 访问静态方法 Person::say(); // 重新给静态属性赋值 Person::$myCountry = "美国"; echo Person::$myCountry; ?>
类里面的静态方法只能访问类的静态的属性,在类里面的静态方法是不能访问类的非静态成员的,原因很简单,我们要想在本类的方法中访问本类的其它成员,我们需要使用$this这个引用,而$this这个引用指针是代表调用此方法的对象,我们说了静态的方法是不用对象调用的,而是使用类名来访问, 所以根本就没有对象存在,也就没有$this这个引用了,没有了$this这个引用就不能访问类里面的非静态成员,又因为类里面的静态成员是可以不用对象 来访问的,所以类里面的静态方法只能访问类的静态的属性,即然$this不存在,在静态方法中访其它静态成员我们使用的是一个特殊的类“self”; self和$this相似,只不过self是代表这个静态方法所在的类。所以在静态方法里,可以使用这个方法所在的类的“类名“,也可以使用“self”来访问其它静态成员,如果没有特殊情况的话,我们通常使用后者,即“self::成员属性”的方式。
<?php class Person { // 下面是人的静态成员属性 public static $myCountry = "中国"; // 这是人的静态成员方法, 通过self访问其它静态成员 public static function say() { echo "我是" . self::$myCountry; } } // 访问静态方法 Person::say(); ?>
在非静态方法里可不可以访问静态成员呢,当然也是可以的了,但是也不能使用“$this”引用,也要使用类名或是”self::成员属性的形式”。
const是定义敞亮的关键字,在php中定义常亮的时“define()”这个函数,但是在类里面定义常亮使用的时“const0这个关键字”
用“const”修饰的成员属性的访问方式和“static”修饰的成员访问的方式差不多,也是使用“类名”,
在方法里面使用“self”关键字。但是不用使用“$”符号,也不能使用对象来访问。
<?php class MyClass { // 定义一个常量constant const constant = 'constant value'; function showConstant() { echo self::constant . " "; // 使用self访问,不要加“$” } } echo MyClass::constant . " "; // 使用类名来访问,也不加“$” $class = new MyClass(); $class->showConstant(); // echo $class::constant; // 是不允许的 ?>