一,php中类的构造函数和析构函数
1,构造函数用于初始化,用—construct()可以带参数
2,析构函数不能带参数,(用于在消去一个类之前执行一些操作或者功能),使用—destruct()
3,php不会自动调用父类的构造函数,(不支持构造函数重载),必须使用parent关键字显示的调用
class employee{
function __construct()….
}
class Manager extents Employee{
function __construct(){
parent::_construct();
echo ‘这个子类的父类构造函数调用了!';
}
}
调用与该实例没有任何关系的其他类的构造函数,只需要在—construct()前面加上类名就可以。
ortherclassname::__construct();
类的主要家庭成员:属性,方法,常量,静态成员
二,类的属性
对类的属性有两种方式直接赋值或者取值
1,使用公共工作域或public关键字
2,使用__set()__get()分别赋值和取值
注意:__set()__get()只对私有属性起作用,对于public定义的属性懒得搭理
protected $a=9,$b=2,$c;
public $d;
function __set($n,$v) { $this->$n = $v+2; }
function __get($name) { return $this->$name+2; }
}
$a = new test();
$a->b =5; echo “<br />”; echo $a->b;
实例只对$a,$b,$c的设置会经过__set和__get过滤与返回,对于$d,就不会起作用。如$a->d=5,再返回还是5。
三,类的方法:
1,内部调用方式:$this->fanname();或者test::addab();
2,实例化调用$e->addb();也可以用test::addab();
四,类的常量
类中的常量定义const
class test{
private $a;
const PI = '3.14′;
…..
类中调用上面的常量方法如:"$this::PI",或者“类名::PI”
实例化中,只能通过 类名::PI才可以调用常量。
$e= new test();
$e->PI =5; //注意,这里用 ->只是创造了一个也是名为PI的属性,而不是改变类中的PI常量的值。
echo $e::PI; //这个才是调用类的常量。
注意:常量只能用::来调用,不能改变其值。
五,类的静态成员(静态属性或者静态方法)
什么时候使用静态成员呢,需要创建所有类是实例共享的字段或者方法的时候,需要静态成员。
静态成员的特征如下:
1,静态成员,他让脚本上的所有该类的实例调用,但是不能借助类的特定实例调用,而是在类的外部,统一使用”类名::$成员“的方式调用
类的内部则统一用”self::$成员“来调用。
2,当新创建一次实例时,静态成员会从上次创建的实例最后值开始重新计算,而不是类中初始值开始计算。
3,对于public定义的静态成员,可以在外部更改他的值,private则不可以改变其值。
class test{
public static $v = 0;
function __construct(){ self::$v++; }
static function getV(){ return self::$v; }
}
$a = new test();
echo test::getV(); // 返回 1
$b = new test();
echo test::getV(); // 返回 2
test::$v=8; //由于public定义的成员,改变静态成员的值。
$c = new test();
echo test::getV(); // 返回 9
六,关键字
1,this关键字:用于类的内部指代类的本身。来访问属性或方法或常量,如$this->属性名或方法名。$this::常量名。this还可以用在该类的子类中,来指代本身的属性或方法。
2,双冒号”::“用于调用常量和静态成员
3,self关键字,在类的内部与双冒号配合调用静态成员,例如self::$staticvar,内部不能用$this调用静态成员。
4,__clone()克隆对象
5,__call()方法重载
方法重载实例;
class cB{
function __call($method,$n){
if($method=='showVarType'){
if(is_numeric($n[0])){ //不能用$n。要用$n[0];
$this->displayNum();
}else if (is_array($n[0])){
$this->displayArr();
}else{
$this->displayOther();
}
}
}
function displayNum() {
echo ‘<h3>这是数字!</h3>';
}
function displayArr() {
echo ‘<h3>这是数组!</h3>';
}
function displayOther() {
echo ‘<h3>不是数组也不是数字!</h3>';
}
}
$x='a';
$y=array(‘a','b');
$b=new cB;
$b->showVarType($x); //不是数组也不是数字
$b->showVarType($y); //这是数组
注意:注意,不能在类中定义showVarType()方法,否则代码不能用。
6,继承entend
记忆方法:常量用::访问,常量实例方法不可以改变值,静态属性,外部可以改变值,切按照最后一次改变的值为起始值。但限于public的静态。
七:方法和属性的作用域
public 可以省略,private不能由子类使用,protected可以由子类使用,abstract抽象类,final(阻止在子类中覆盖,也称为重载,阻止被继承,用于修饰类名以及方法,例如:final class test{final function fun(){}},但是不能用于属性),static静态类。
八:抽象类和抽象方法:abstract
抽象可以理解成父类为子类定义一个模板或者基类,作用域abstrct只能在父类中声明,但是在子类中实现。
1,抽象类不能被实例化,只能被子类继承后实现。
2,抽象类必须在其子类中实现该抽象类的所有抽象方法,否则会出错。
3,在抽象方法中,只是声明,但不能具体实现:
只能声明这个方法:abstract function gettow();(连方括号{}都不要出现)
抽象方法和抽象类主要用于复杂的类层次关系中。该层次关系需要确保每一个子类都包含并重载了某些特定的方法。这也可以通过接口实现
4,属性不能被命名为抽象属性
5,只有声明抽象的类才可以声明抽象方法,但是如果声明为抽象,就不能具体实现。