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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php分享二十二:php面向对象相关的知识,希望对你有一定的参考价值。

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面向对象的主要内容,如果未能解决你的问题,请参考以下文章

第二十二节 面向对象 简单小结类与对象

Python之路(第二十二篇) 面向对象初级:概念类属性

Java入门二十二 面向对象三大特征之多态

java 面向对象(二十二):关键字:final

2018-07-06 第二十二次课

php增删改查实例第二十二节 - 引入百度地图