$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?
$this 当前对象 self 当前类 parent 当前类的父类
$this 在类中使用当前对象的属性和方法, 使用->调用属性和方法;
self 在当前类中使用, 不过需要使用::调用, 用来访问常量、静态成员、静态方法;
parent 在类中使用, 用来访问父类中的成员属性、父类中的方法、父类中的常量等;
常量: 使用const关键字声明
类内部访问 self::常量名;
类外部访问 类名::类常量
:: 范围解析符
final关键字的应用:
使用final标识的类, 不能被继承
在类中使用final标识的成员方法, 在子类中不能被覆盖
final: 最终的, 不可更改的
self:(在类内部访问)
用于访问类常量 访问静态成员 访问静态方法
parent:调用父类中成员属性 父类中的方法 父类中常量 父类中的构造方法;
parent主要用于访问被子类覆盖的方法, 如果混用则可读性差!
parent::父类中静态变量 parent::父类中静态方法 是可行的;高洛峰、传智播客均证实
静态变量和静态方法:使用static关键字声明
类内部访问: 可以使用self或static关键字访问(PHP5.4才支持static关键字访问)
self::静态变量(成员)
self::静态方法
static::静态变量(成员)
static::静态方法
self和static的区别
self 永远代表当前的类, 不会因为方法的调用者(子类和父类)而变换
static 关键字就是谁调用就代表谁(实例化的类)
类外部访问:
静态变量访问 类名::静态变量(成员)
静态方法访问 类名::静态方法(也可以用对象名去访问)
注意:静态方法中只能访问静态成员; $this在静态方法中不能使用;
$this和self的区别
1、$this代表进入当前类的对象, self代表当前类;
2、$this可以被直接打印, self不能被打印(是类的一种结构, 不能打印);
3、$this不能访问类常量、静态变量、静态方法, 访问类常量、静态变量、静态方法均采用self关键字,
<?php
class MyClass { //声明一个MyClass类,用来演示如何使用静态成员
static $count; //在类中声明一个静态成员属性count,用来统计对象被创建的次数
function __construct() { //每次创建一个对象就会自动调用一次这个构造方法
self::$count++; //使用self访问静态成员count,使其自增1
}
static function getCount() { //声明一个静态方法,在类外面直接使用类名就可以调用
return self::$count; //在方法中使用self访问静态成员并返回
}
}
MyClass::$count=0; //在类外面使用类名访问类中的静态成员,为其初使化赋值0
$myc1=new MyClass(); //通过MyClass类创建第一个对象,在构造方法中将count累加1
$myc2=new MyClass(); //通过MyClass类创建第二个对象,在构造方法中又为count累加1
$myc3=new MyClass(); //通过MyClass类创建第三个对象,在构造方法中再次为count累加1
echo MyClass::getCount(); //在类外面使用类名访问类中的静态成员方法,获取静态属性的值 3
echo $myc3->getCount(); //通过对象也可以访问类中的静态成员方法,获取静态属性的值 3
echo $myc2->getCount(); //值为3
echo $myc1->getCount(); //值为3
?>
<?php
class Father{
//静态属性
public static $name = 'father';
protected static $money = 1000;
private static $age = 30;
//父类方法
public static function getFather(){
echo self::$name,'<br/>'; //father
echo self::$money,'<br/>'; //1000
echo self::$age,'<br/>'; //56
//self::永远代表自己类: Father
// Son调用该方法: static代表Son
echo static::$name,'<br/>'; //laowang
echo static::$money,'<br/>'; //10
//echo static::$age,'<br/>'; //错误: 私有属性不能在类外访问
}
}
//定义子类
class Son extends Father{
//静态属性
public static $name = 'laowang';
protected static $money = 10;
private static $age = 20;
}
//继承证明
//echo Son::$name; //有继承语法在 结果 son
//方法访问
//Father::getFather();
Son::getFather();
//总结:self关键字从一开始永远代表自己所在的类, 不会因为方法的调用者(子类和父类)而变换;
//static关键字就是谁调用就代表谁
静态方法实现递归函数的调用
private function changeArrKey($array,$case=0){
if(!is_array($array)) return $array;
$tempArray=array();
$do=($case === 0)?"strtolower":"strtoupper";
foreach ($array as $key=>$value){
$key=$do($key);
if(is_array($value)){
$value=self::changeArrKey($value);
}else{
$value=$do($value);
}
$tempArray[$key]=$value;
}
return $tempArray;
}