第十八节:类与对象-构造函数和析构函数-访问控制-对象继承
构造函数和析构函数
此处要注意一个知识点,就是子类和父类他们的__construct和__destruct之间的关系,子类不会执行父类的__construct和__destruct除非在子类的
__construct和__destruct中,通过parent::__construct()或parent::__destruct()调用
1 <?php 2 class Baseclass{ 3 function __construct(){ 4 print "In BaseClass construct\n"; 5 } 6 } 7 class Subclass extends Baseclass{ 8 function __construct(){ 9 parent::__construct(); 10 print "In SubClass construct\n"; 11 } 12 } 13 $obj=new Baseclass();//输出 In BaseClass construct 14 $obj=new Subclass();//输出 In BaseClass construct In SubClass construct 15 ?>
在__destruct中 即使程序中有exit 析构函数仍然会被执行
1 <?php 2 class MyDestructableClass{ 3 function __construct(){ 4 print "In constructor\n"; 5 $this->name="MyDestructableClass"; 6 exit;//即使有exit __destruct依然执行。 7 } 8 function __destruct(){ 9 print "Destroing".$this->name."\n"; 10 } 11 } 12 $obj=new MyDestructableClass(); //输出In constructor DestroingMyDestructableClass 13 ?>
访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
对象的继承
继承已为大家所熟知的一个程序设计特性,PHP 的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。
比如,当扩展一个类,子类就会继承父类的所有公有和保护方法。但是子类的方法会覆盖父类的方法。
继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。
注意当子类的方法覆盖父类的方法时通过parent::fun();调用。
1 <?php 2 class FaClass{ 3 function foo(){ 4 var_dump(Faclass); 5 } 6 } 7 class SonClass extends FaClass{ 8 function __construct(){ 9 $this->foo(); 10 } 11 function foo(){ 12 parent::foo(); 13 var_dump(SonClass); 14 } 15 } 16 $obj=new SonClass(); //string(7) "Faclass" string(8) "SonClass" 17 ?>