[学习] 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