[学习] php 类

php 类

PHP面向对象中new self( )和 new static( ) 的区别

  • 被定义为公有(public)的类成员可以在任何地方被访问(类的内部,包过父类,子类,自己;还可以通过类的实例对象访问)。
  • 被定义为受保护(protected)的类成员则可以被其自身以及其子类和父类访问,不能通过类的实例对象访问。
  • 被定义为私有(private)的类成员则只能被其定义所在的类访问,不能通过类的实例对象访问。

默认都是public。

子类默认继承父类所有的 public 和 protected 方法,但不继承 private 方法和属性。

双冒号(::)是范围解析操作符,用于访问类的静态成员类常量

双冒号只能访问静态属性,不能访问非静态的其他属性(public、private、protected)。但是双冒号可以调用非静态方法(包括public、protected、private)。

// php 版本5.6.9
class B {
    static $name = "b";
    public $er = "er";
    function testFnc() {
        echo self::aa()."\n";
        echo self::bb()."\n";
        echo self::c()."\n";
    }
    function aa() {
        echo "public aa function \n";
    }
    protected function bb() {
        echo "protected bb function \n";
    }
    private function c() {
        echo "private c function \n";
    }
}

$b = new B();
$b->testFnc();

static 关键字

static关键字声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

$this在静态方法中不可用。

// php 版本5.6.9
class Test {
    static $name = "ghj";
    public static function tt() {
        echo "static function tt \n";
    }
}

$t = new Test();
$t->tt(); // static function tt
$t->name; // 报错
echo Test::$name; // ghj

函数里的静态变量

在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。

静态变量只在局部的作用域中存在,离开这个作用域也不会丢失,当然也不能再次初始化。

// php 版本5.6.9
function test() {
   static $a = 1; // 只在第一次调用test()函数时执行这一句,之后每次调用都会以上次调用后$a的值作为初始值
   echo $a;
   $a++; 
}

test(); // 第一次调用 打印 1
test(); // 第二次调用 打印 2

后期静态绑定 static::

static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于静态方法的调用以及静态属性的访问。

// php 版本5.6.9
class Test {
    static $name = "ppp";
    static function getName() {
        return static::$name;
    }

    function tt() {
        echo '$name -- '.static::getName()."\n";
        echo 'static::$name -- '.static::$name."\n";
    }
}

class Fast extends Test {
    static $name = "Fast";
}

$t = new Test();
$t->tt(); // static解析为Test  ppp

$f = new Fast();
$f->tt(); // static解析为Fast  Fast

self与static的区别

比如在函数中:

  • self是静态函数(静态属性)声明所在的类
  • static是调用静态函数(访问静态属性)的那个类

例子:

// php 版本5.6.9
class A {
    static $name = 'a';
    function test() {
        echo self::$name."\n";
        echo static::$name."\n";
    }
}

class B extends A {
    static $name = "b";
}

$a = new A();
$b = new B();
$a->test(); // a a

$b->test();// a b
posted @ 2021-08-27 16:58  Fogwind  阅读(40)  评论(0编辑  收藏  举报