new static()是在php5.3才出来的。对两者的区别之前一直是模棱两可,国外的一片文章对此描述的非常好,原文地址http://www.programmerinterview.com/index.php/php-questions/php-self-vs-static/。以下论述均为个人见解,如有偏颇,望请指点

上代码

class Car{
   protected static function model(){
       echo 'I am a car';
   }
   public static function getModel(){
       self::model();
   }
}
class Mercedes extends Car{
    protected static function Model(){
        echo "I am a Mercedes!";
    }
}
Mercedes::getModel();//I am a car
Car::getModel();//I am a car

为什么会这样?self是一个动态的上下文,上面例子中,虽然子类继承了getModel函数,当在子类中调用getModel时,实际上是调用父类的getModel,此时的self指向的是Car而不是Mercedes,getModel中self::mode()自然调用的是car中的model了

之所以出现上面的情况完全是因为getModel是属于父类中的,才会导致self::model调用也是父类中的model。。。所以我们只要子类中实现getModel函数,那么self自然就指向了Mercedes了

class Car{
   protected static function model(){
       echo 'I am a car';
   }
   public static function getModel(){
       self::model();
   }
}
class Mercedes extends Car{
    protected static function Model(){
        echo "I am a Mercedes!";
    }
    public static function getModel(){
               self::model();
       }
}
Mercedes::getModel();//I am a Mercedes
Car::getModel();//I am a car


所以综上所述,我们可以得出结论,self的指向,完全是有self所处的那个函数属于的那个类决定的,似乎与面向对象中多态的概念有所冲突


接下来说一下static,php5.3还加入了一个叫'last static bindings'新特性,下面是它的一个例子

class Car{
   protected static function model(){
       echo 'I am a car';
   }
   public static function getModel(){
       static::model();
   }
}
class Mercedes extends Car{
    protected static function Model(){
        echo "I am a Mercedes!";
    }
}
Mercedes::getModel();//I am a Mercedes
Car::getModel();//I am a car