php类和对象(二)

类常量:类常量能够当作是一个有前缀的常量,类名是前缀,用的时候和类变量同样 函数

构造函数:构造函数能够这么说是类实例最先运行的函数,构造函数能够用__construct 或者类名 来定义,可是如今来讲仍是用前者吧,后者到最后不知道会不会被淘汰; this

析构函数:析构函数是在实例被删除的时候被调用的函数;不要在析构函数中抛出一个异常,不然会致使致命错误。 spa

咱们来看看下面的例子 .net

01 class Zhuge{
02   public $name;
03   function __construct($name){
04     $this->name = $name;
05     echo "我是构造函数,我属于".$this->name."!qaforcode.net\n";
06   }
07   function __destruct(){
08  
09     echo "我是析构函数,我属于".$this->name."!qaforcode.net\n";
10   }
11 }
12  
13 $a = new Zhuge("猪哥");
14 unset($a);//试试注释掉这行看看效果
15 $b = new Zhuge("猪哥疼你");

抽象类:抽象类,就至关于比类更加高一层的东西。好比你的说动物,动物描述的是一个种类,而不是具体的某个动物。这个就能够定义为抽象类。抽象类不能直接被实例化,你必须先继承该抽象类,而后再实例化子类。抽象类中 至少要包含一个抽象方法。若是类方法被声明为抽象的,那么其中就不能包括具体的功能实现。继承一个抽象类的时候,子类必须实现抽象类中的全部抽象方法;若是抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不 能定义为private。 code

01 abstract class Animal{
02  
03   abstract public function eat();
04 }
05  
06 class Cat{
07   public function eat(){
08     echo "I'm eating;";
09   }
10 }
11  
12 //$a =  new Animal();会出错
13 $black_cat =  new Cat();
14  
15 $black_cat->eat();

接口:接口和抽象类有点类似,只是他是功能性的,抽象类有点父子的关系,接口类有点象功能集合。电灯有发光的功能,蜡烛也有。看下面的例子 对象

01 interface Light{
02  
03   public function turnoff();
04   public function turnon();
05 }
06  
07 class ElectricLight implements Light{
08  
09   public function turnoff(){
10     echo "turnoff by touch switch\n";
11   }
12   public function turnon(){
13     echo "turnon by touch switch\n";
14   }
15  
16 }
17 class Candle implements Light{
18  
19   public function turnoff(){
20     echo "turnoff by blow\n";
21   }
22   public function turnon(){
23     echo "turnon use match\n";
24   }
25  
26 }
27 $electriclight = new ElectricLight();
28 $candle = new Candle();
29 $electriclight->turnoff();
30 $candle->turnoff();

你能够指定某个类必须实现哪些方法,但不须要定义这些方法的具体内容。 继承

咱们能够经过interface来定义一个接口,就像定义一个标准的类同样,但其中定义全部的方法都是空的。 接口

接口中定义的全部方法都必须是public,这是接口的特性。 字符串

要实现一个接口,可使用implements操做符。类中必须实现接口中定义的全部方法,不然 会报一个fatal错误。若是要实现多个接口,能够用逗号来分隔多个接口的名称。 get

魔术方法:PHP把全部以__(两个下划线)开头的类方法当成魔术方法。因此你定义本身的类方法时,不要以 __为前缀。

__sleep 和 __wakeup:serialize() 函数会检查是否存在一个魔术方法 __sleep.若是存在,__sleep()方法会先被调用, 而后才执行序列化操做。与之相反,unserialize()会检查是否存在一个__wakeup方法。若是存在,则会先调用 __wakeup方法,预先准备对象数据。

__toString:__toString 方法可让一个类决定它如何转换成一个字符串。

__invoke:当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。

__set_state:当调用var_export()时,这个静态 方法会被调用

final:若是父类中的方法被声明为final,则子类没法覆盖该方法; 若是一个类被声明为final,则不能被继承。

对象比较:当使用对比操做符(==)比较两个对象变量时,比较的原则是:若是两个对象的属性和属性值 都相等,并且两个对象是同一个类的实例,那么这两个对象变量相等。而若是使用全等操做符(===),这两个对象变量必定要指向某个类的同一个实例(即同一个对象)。

01 class A{
02   public $name;
03  
04   function __construct($name){
05  
06     $this->name = $name;
07   }
08   function getName(){
09  
10     return $this->name;
11   }
12  
13 }
14 $a = new A("趴树上的猪");
15 $b = new A("趴树上的猪");
16 $c = $a;
17  
18 var_dump($a==$b);
19 var_dump($a===$b);
20 var_dump($a==$c);
21 var_dump($a===$c);

 

本文固定连接: http://www.qaforcode.net/archives/270 | 猪哥每日一贴

相关文章
相关标签/搜索