php类和对象(二)

类常量:类常量可以看成是一个有前缀的常量,类名是前缀,用的时候和类变量一样

构造函数:构造函数可以这么说是类实例最早运行的函数,构造函数可以用__construct 或者类名 来定义,但是现在来说还是用前者吧,后者到最后不知道会不会被淘汰;

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

我们来看看下面的例子

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。

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错误。如果要实现多个接口,可以用逗号来分隔多个接口的名称。

魔术方法: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 | 猪哥每日一贴

你可能感兴趣的:(php类和对象)