在PHP的类定义中,常用$this代表该类实例化的对象,但是$this表示的是当前对象,他代表的值屈居于当前方法执行的对象环境。所以,某个方法内的$this,不一定是当前方法所属类的对象。
class B {
private $b_p='private';
private $p_test='B-class';
public function b_say(){
echo $this->b_p;
}
public function b_echo(){
echo $this->p_test;
}
}
class A extends B{
private $p_test='A-class';
public function a_say(){
echo $this->b_p;
}
public function a_echo(){
echo $this->p_test;
}
}
$o=new A;
/*在子类和父类中,如果存在同名的私有属性,那么在访问时,在父类访问的是父类中定义的私有属性,而在子类中访问的是子类中定义的私有属性*/
var_dump($o->b_echo());//输出 <span style="font-family: Arial, Helvetica, sans-serif;">'A-class'</span>
而self在类的定义中一般是指该类本身,一般在静态方法的声明时使用 。self是写在哪个类中,表示哪个类的对象
class C{
public static $title='c-class';
public static function sayTitle(){
echo self::$title;
}
}
class D extends C{
public static $title='d-class';
public static function getTitle(){
echo self::$title;
}
}
D::sayTitle();//输出c-class
由上例可知 当用类D调用方法sayTitle();返回的是c-title,所以self是写在哪个类中,代表的是哪个类 与谁调用的该方法没有关系
为了解决哪个类调用 应该使用哪个类的静态成员的问题 PHP中引入了静态延迟绑定的概念
self关键字所表示的类, 在编译时已经确定 在执行时不能修改 静态延迟绑定是推迟确定self的值 实现的方式是采用static关键字替代self关键字
class C{
public static $title='c-class';
public static function sayTitle(){
echo self::$title;
}
public static function comeTitle(){
echo static::$title;
}
}
class D extends C{
public static $title='d-class';
public static function getTitle(){
echo self::$title;
}
}
D::comeTitle();//输出 'd-class'
D::sayTitle()//输出'c-class'