【面向对象】php新手之学习类与对象-基本概念

PHP 5 引入了新的对象模型(Object Model)。完全重写了 PHP 处理对象的方式,允许更佳性能和更多特性。

一、基本概念

1、class

每个类的定义都以关键字 class 开头,后面跟着类名,可以是任何非 PHP 保留字的名字。后面跟着一对花括号,里面包含有类成员和方法的定义。伪变量 $this 可以在当一个方法在对象内部调用时使用。$this 是一个到调用对象(通常是方法所属于的对象,但也可以是另一个对象,如果该方法是从第二个对象内静态调用的话)的引用。看下面例子:

Example#1 面向对象语言中的 $this 变量

 
 
  1. <?php  
  2. class A  
  3. {  
  4. function foo()  
  5. {  
  6. if (isset($this)) {  
  7. echo '$this is defined (';  
  8. echo get_class($this);  
  9. echo ")\n";  
  10. else {  
  11. echo "\$this is not defined.\n";  
  12. }  
  13. }  
  14. }  
  15. class B  
  16. {  
  17. function bar()  
  18. {  
  19. A::foo();  
  20. }  
  21. }  
  22. $a = new A();  
  23. $a->foo();  
  24. A::foo();  
  25. $b = new B();  
  26. $b->bar();  
  27. B::bar();  
  28. ?> 

上例将输出:

 
 
  1. $this is defined (a)  
  2. $this is not defined.  
  3. $this is defined (b)  
  4. $this is not defined. 

Example#2 简单的类定义

 
 
  1. <?php  
  2. class SimpleClass  
  3. {  
  4. // 成员声明  
  5. public $var = 'a default value';  
  6. // 方法声明  
  7. public function displayVar() {  
  8. echo $this->var;  
  9. }  
  10. }  
  11. ?> 

Example#3 类成员的默认值

 
 
  1. <?php  
  2. class SimpleClass  
  3. {  
  4. // 无效的类成员定义:  
  5. public $var1 = 'hello '.'world';  
  6. public $var2 = <<<EOD  
  7. hello world  
  8. EOD;  
  9. public $var3 = 1+2;  
  10. public $var4 = self::myStaticMethod();  
  11. public $var5 = $myVar;  
  12. // 正确的类成员定义:  
  13. public $var6 = myConstant;  
  14. public $var7 = self::classConstant;  
  15. public $var8 = array(true, false);  
  16. }  
  17. ?> 

2、new

要创建一个对象的实例,必须创建一个新对象并将其赋给一个变量。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。

Example#4 创建一个实例

 
 
  1. <?php  
  2. $instance = new SimpleClass();  
  3. ?> 

复制代码当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。

Example#5 对象赋值

 
 
  1. <?php  
  2. $assigned   =  $instance;  
  3. $reference  =& $instance;  
  4. $instance->var = '$assigned will have this value';  
  5. $instance = null; // $instance and $reference become null  
  6. var_dump($instance);  
  7. var_dump($reference);  
  8. var_dump($assigned);  
  9. ?> 

复制代码上例将输出:

 
 
  1. NULL  
  2. NULL  
  3. object(SimpleClass)#1 (1) {  
  4. ["var"]=> 
  5. string(30) "$assigned will have this value"  

3、extends

一个类可以在声明中用 extends 关键字继承另一个类的方法和成员。不能扩展多个类,只能继承一个基类。

被继承的方法和成员可以通过用同样的名字重新声明被覆盖,除非父类定义方法时使用了 final 关键字。可以通过 parent:: 来访问被覆盖的方法或成员。

Example#6 简单的类继承

 
 
  1. <?php  
  2. class ExtendClass extends SimpleClass  
  3. {  
  4. // Redefine the parent method  
  5. function displayVar()  
  6. {  
  7. echo "Extending class\n";  
  8. parent::displayVar();  
  9. }  
  10. }  
  11. $extended = new ExtendClass();  
  12. $extended->displayVar();  
  13. ?> 

上例将输出:

 
 
  1. Extending class  
  2. a default value 


二、自动加载对象

很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表。

在 PHP 5 中,不再需要这样了。可以定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

Note: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。如果使用 PHP 的 CLI 交互模式 时,Autoloading 不存在。

Example#1 Autoload 例子(本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类。)

 
 
  1. <?php  
  2. function __autoload($class_name) {  
  3. require_once $class_name . '.php';  
  4. }  
  5. $obj = new MyClass1();  
  6. $obj2 = new MyClass2();  
  7. ?> 

三、构造函数和析构函数

1、构造函数

 
 
  1. void __construct ([ mixed $args [, $... ]] ) 

PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

Note: 如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。

Example#1 使用新标准的构造函数

 
 
  1. <?php  
  2. class BaseClass {  
  3. function __construct() {  
  4. print "In BaseClass constructor\n";  
  5. }  
  6. }  
  7. class SubClass extends BaseClass {  
  8. function __construct() {  
  9. parent::__construct();  
  10. print "In SubClass constructor\n";  
  11. }  
  12. }  
  13. $obj = new BaseClass();  
  14. $obj = new SubClass();  
  15. ?> 

复制代码为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法,但它却又不是构造函数。

2、析构函数

 
 
  1. void __destruct ( void ) 

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

Example#2 析构函数示例

 
 
  1. <?php  
  2. class MyDestructableClass {  
  3. function __construct() {  
  4. print "In constructor\n";  
  5. $this->name = "MyDestructableClass";  
  6. }  
  7. function __destruct() {  
  8. print "Destroying " . $this->name . "\n";  
  9. }  
  10. }  
  11. $obj = new MyDestructableClass();  
  12. ?> 

复制代码和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。

Note: 析构函数在脚本关闭时调用,此时所有的头信息已经发出。试图在析构函数中抛出一个异常会导致致命错误。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值