栈 堆 代码段 初始化静态段

 

我们实例化的对象是存在堆内存的,实例化出来的 对象时存在 栈内存的

 

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; // 是不允许的
?>

 

posted @ 2019-07-23 19:39  李梓轩  阅读(243)  评论(0编辑  收藏  举报