php中class类中的详细用法

来源:互联网 发布:php画等腰三角形星星 编辑:程序博客网 时间:2024/05/19 22:28

一,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定义的属性懒得搭理

class test{
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,只有声明抽象的类才可以声明抽象方法,但是如果声明为抽象,就不能具体实现。

0 0
原创粉丝点击