self 代表當下的自己class(方法當下的class)

self 代表 get_class()static 代表 get_called_class

get_class()与上面一样,都是获取当前的类名

get_called_class()获取当前主调类的类名

 

 

---

class a{
    static function get_static(){
        return new static();
    }
    static function get_self(){
        return new self();
    }
}
class b extends a{

}
echo get_class(b::get_static()); 印出b因為是從b類繼承的a調的方法,static就是一個類別呼叫到別的類別,要取得呼叫別人類別的類別

self指自己(方法所存在某類別)的類別

 

----

self:: 的限制 

使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:

Example #1 self:: 用法

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        
self::who();
    }
}

class 
extends {
    public static function 
who() {
        echo 
__CLASS__;
    }
}


B::test();
?>

以上例程会输出:

A

 

-

---

MVC框架中,涉及到单例时很好用,一般在基类中

    public static function getInstance() {
        $class_name = get_called_class();
        if (isset(self::$instance[$class_name])) {
            return self::$instance[$class_name];
        }
        self::$instance[$class_name] = new $class_name;
        return self::$instance[$class_name];
    }

 

 

---

<?php
class {
    public static function 
foo() {
        static::
who();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

class 
extends {
    public static function 
test() {
        
A::foo();
        
parent::foo();
        
self::foo();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}
class 
extends {
    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}


C::test();
?>

 

RESULT:a,c,c

 

---

static 和 self 一样,都是指向类,一般都用来访问类中的静态变量和静态方法,但是又有一些不一样,具体来讲:self 写在哪个类里,实际调用的就是这个类;static 则是写在父类里,然后通过子类用到了这个 static,这个 static 指向的是这个子类,官方称之为 后期静态绑定 

arrow
arrow
    全站熱搜

    學習程式 發表在 痞客邦 留言(0) 人氣()