在日常项目代码中,大家一定经常能看到self、static、get_class、get_called_class()的使用,但不一定都知道它们的区别,本文就以个人理解来说明一下。
1、self与static
self指向的是当前类,既self代码所在类;static首先指向调用类,既谁调用static所在类的代码就指向谁,一般指向子类。如果没有子类,则与self相同指向的是当前类;
示例:
<?php
class Father{
protected static $name = "father";
public static function whoami_self(){
echo self::$name."\n";
}
public static function whoami_static(){
echo static::$name."\n";
}
public static function getInstance_self(){
return new self();
}
public static function getInstance_static(){
return new static();
}
}
class FatherBrother extends Father{
protected static $name = "uncle";
}
FatherBrother::whoami_self(); //father
FatherBrother::whoami_static(); //uncle
var_dump(FatherBrother::getInstance_self()); //father
var_dump(var_dump(FatherBrother::getInstance_static())); //uncle
2、get_class()与get_called_class()
get_class()指向当前类,get_called_class()指向调用类,与上述self与static类似;
示例:
class Foo{
public function test(){
var_dump(get_class());
}
public function test2(){
var_dump(get_called_class());
}
public static function test3(){
var_dump(get_class());
}
public static function test4(){
var_dump(get_called_class());
}
}
class B extends Foo{
}
$B=new B();
$B->test(); //Foo
$B->test2(); //B
Foo::test3(); //Foo
Foo::test4(); //Foo
B::test3(); //Foo
B::test4(); //B