码迷,mamicode.com
首页 > Web开发 > 详细

php分享二十二:php面向对象

时间:2016-02-23 12:54:23      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

1:static访问符

  • 在类中使用static有两种主要用途、定义静态成员和定义静态方法。静态成员只保留一个变量的值,这个值对所有实例都是有效的
  • 类的方法是static的,他所访问的属性也必须是static的

2:static后期静态绑定

什么是静态绑定?

abstract class U {

}
class u1 extends U {
    public static function create() {
        return new u1();
    }

}
class u2 extends U {
    public static function create(){
        return new u2();
    }
}

这段代码正常工作是没问题,但大量重复的代码会很烦人

我不想在每个子类中添加create方法,如果把create方法放在超类U中,代码可能是

abstract class U
{
    public static function create()
    {
       //return new self();  //self 会报错,self对该类所起的作用与$this对对象所起的作用并不完全相同。self指的不是调用上下文,他指的是解析上下文,
//因此如果运行上面的列子,将会得到
//Fatal error: Cannot instantiate abstract class U in D:wampwwwtestoopstatic.php on line 21
//因此self被解析为定义create的U,而不是解析为调用self的u1类。

    //static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符,甚至是从非静态上下文中调用
    return new static(); } } class u1 extends U{ } class u2 extends U{ } $res = u1::create(); var_dump($res);

 static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符,甚至是从非静态上下文中调用

abstract class U
{
    private $group;
    public function __construct()
    {
        $this->group = static::getGroup();
    }

    public static function create()
    {
        return new static();
    }

    static function getGroup()
    {
        return ‘default‘;
    }

}

class u1 extends U
{
    
}

class u2 extends U
{
    static function getGroup()
    {
        return ‘u2‘;
    }

}

class u3 extends u2
{
    
}

print_r(u1::create());

u1 Object ( [group:U:private] => default )

u3 Object ( [group:U:private] => u2 )

 

例子:

class A {
    public static function foo() {
        static::who();
    }
 
    public static function who() {
        echo __CLASS__."\n";
    }
}
class B extends A {
    public static function test() {
        A::foo();  //如果换成static,则向后绑定,如果是A,则最底层的类是A
        parent::foo();
        self::foo();
    }
 
    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}
C::test();

 输出:A C C

 

php分享二十二:php面向对象

标签:

原文地址:http://www.cnblogs.com/Alight/p/5209284.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!