您的位置:首页 > 编程语言 > PHP开发

php类和对象(二)

2012-12-25 00:00 253 查看
类常量:类常量可以看成是一个有前缀的常量,类名是前缀,用的时候和类变量一样

构造函数:构造函数可以这么说是类实例最早运行的函数,构造函数可以用__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类和对象