PHP面向对象中的重要知识点(一)

转自:http://www.cnblogs.com/stephen-liu74/p/3497440.html

1. __construct: 

     内置构造函数,在对象被创建时自动调用。见如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class  ConstructTest {
     private  $arg1 ;
     private  $arg2 ;
 
     public  function  __construct( $arg1 $arg2 ) {
         $this ->arg1 =  $arg1 ;
         $this ->arg2 =  $arg2 ;
         print  "__construct is called...\n" ;
     }
     public  function  printAttributes() {
         print  '$arg1 = ' . $this ->arg1. ' $arg2 = ' . $this ->arg2. "\n" ;
     }
}
$testObject  new  ConstructTest( "arg1" , "arg2" );
$testObject ->printAttributes();

  

     运行结果如下:

Stephens-Air:Desktop$ php Test.php 
__construct is called...
$arg1 = arg1 $arg2 = arg2

2. parent: 

     用于在子类中直接调用父类中的方法,功能等同于Java中的super。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class  BaseClass {
     protected  $arg1 ;
     protected  $arg2 ;
 
     function  __construct( $arg1 $arg2 ) {
         $this ->arg1 =  $arg1 ;
         $this ->arg2 =  $arg2 ;
         print  "__construct is called...\n" ;
     }
     function  getAttributes() {
         return  '$arg1 = ' . $this ->arg1. ' $arg2 = ' . $this ->arg2;
     }
}
 
class  SubClass  extends  BaseClass {
     protected  $arg3 ;
 
     function  __construct( $baseArg1 $baseArg2 $subArg3 ) {
         parent::__construct( $baseArg1 $baseArg2 );
         $this ->arg3 =  $subArg3 ;
     }
     function  getAttributes() {
         return  parent::getAttributes(). ' $arg3 = ' . $this ->arg3;
     }
}
$testObject  new  SubClass( "arg1" , "arg2" , "arg3" );
print  $testObject ->getAttributes(). "\n" ;

  

     运行结果如下:

Stephens-Air:Desktop$ php Test.php 
__construct is called...
$arg1 = arg1 $arg2 = arg2 $arg3 = arg3

3. self:

     在类内调用该类静态成员和静态方法的前缀修饰,对于非静态成员变量和函数则使用this。 

1
2
3
4
5
6
7
8
9
10
<?php
class  StaticExample {
     static  public  $arg1  "Hello, This is static field.\n" ;
     static  public  function  sayHello() {
         print  self:: $arg1 ;
     }
}
 
print  StaticExample:: $arg1 ;
StaticExample::sayHello();

  

     运行结果如下:

Stephens-Air:Desktop$ php Test.php 
Hello, This is static field.
Hello, This is static field.

4. static:

     这里介绍的static关键字主要用于PHP 5.3以上版本新增的延迟静态绑定功能。请看一下代码和关键性注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
abstract  class  Base {
     public  static  function  getInstance() {
         //这里的new static()实例化的是调用该静态方法的当前类。
         return  new  static ();
     }
     abstract  public  function  printSelf();
}
 
class  SubA  extends  Base {
     public  function  printSelf() {
         print  "This is SubA::printSelf.\n" ;
     }
}
 
class  SubB  extends  Base {
     public  function  printSelf() {
         print  "This is SubB::printSelf.\n" ;
     }
}
 
SubA::getInstance()->printSelf();
SubB::getInstance()->printSelf();

  

     运行结果如下:

Stephens-Air:Desktop$ php Test.php 
This is SubA::printSelf.
This is SubB::printSelf.

     static关键字不仅仅可以用于实例化。和self和parent一样,static还可以作为静态方法调用的标识符,甚至是从非静态上下文中调用。在该场景下,self仍然表示的是当前方法所在的类。见如下代码: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
abstract  class  Base {
     private  $ownedGroup ;
     public  function  __construct() {
         //这里的static和上面的例子一样,表示当前调用该方法的实际类。
         //需要另外说明的是,这里的getGroup方法即便不是静态方法,也会得到相同的结果。然而倘若
         //getGroup真的只是普通类方法,那么这里还是建议使用$this。
         $this ->ownedGroup =  static ::getGroup();
     }
     public  function  printGroup() {
         print  "My Group is " . $this ->ownedGroup. "\n" ;
     }
     public  static  function  getInstance() {
         return  new  static ();
     }
     public  static  function  getGroup() {
         return  "default" ;
     }
}
 
class  SubA  extends  Base {
}
 
class  SubB  extends  Base {
     public  static  function  getGroup() {
         return  "SubB" ;
     }
}
 
SubA::getInstance()->printGroup();
SubB::getInstance()->printGroup();

 

     运行结果如下:

Stephens-Air:Desktop$ php Test.php 
My Group is default
My Group is SubB

5. __destruct:

     析构方法的作用和构造方法__construct刚好相反,它只是在对象被垃圾收集器收集之前自动调用,我们可以利用该方法做一些必要的清理工作。

1
2
3
4
5
6
7
8
9
10
<?php
class  TestClass {
     function  __destruct() {
         print  "TestClass destructor is called.\n" ;
     }
}
 
$testObj  new  TestClass();
unset( $testObj );
print  "Application will exit.\n" ;

  

     运行结果如下:

Stephens-Air:Desktop$ php Test.php 
TestClass destructor is called.
Application will exit.

6. __clone:

     在PHP 5之后的版本中,对象之间的赋值为引用赋值,即赋值后的两个对象将指向同一地址空间,如果想基于对象赋值,可以使用PHP提供的clone方法。该方法将当前对象浅拷贝之后的副本返回,如果想在clone的过程中完成一些特殊的操作,如深拷贝,则需要在当前类的声明中实现__clone方法,该方法在执行clone的过程中会被隐式调用。另外需要格外注意的是,__clone方法是作用再被拷贝的对象上,即赋值后的对象上执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class  InnerClass {
     public  $id  = 10;
     public  function  printSelf() {
         print  '$id = ' . $this ->id. "\n" ;
     }
}
 
class  OuterClass {
     public  $innerClass ;
     public  function  __construct() {
         $this ->innerClass =  new  InnerClass();
     }
     public  function  __clone() {
         $this ->innerClass =  clone  $this ->innerClass;
         print  "__clone is called.\n" ;
     }
}
 
$outerA  new  OuterClass();
print  "Before calling to clone.\n" ;
$outerB  clone  $outerA ;
print  "After calling to clone.\n" ;
$outerA ->innerClass->id = 20;
print  "In outerA: " ;
$outerA ->innerClass->printSelf();
print  "In outerB: " ;
$outerB ->innerClass->printSelf();

  

     运行结果如下:

Stephens-Air:Desktop$ php Test.php 
Before calling to clone.
__clone is called.
After calling to clone.
In outerA: $id = 20
In outerB: $id = 10

7. const:

    PHP5可以在类中定义常量属性。和全局常量一样,一旦定义就不能改变。常量属性不需要像普通属性那样以$开头,按照惯例,只能用大写字母来命名常量。另外和静态属性一样,只能通过类而不能通过类的实例访问常量属性,引用常量时同样也不需要以$符号作为前导符。另外常量只能被赋值为基础类型,如整型,而不能指向任何对象类型。

1
2
3
4
5
6
<?php
class  TestClass {
     const  AVAILABLE = 0;
}
 
print  "TestClass::AVAILABLE = " .TestClass::AVAILABLE. "\n" ;

  

    运行结果如下:

0Stephens-Air:Desktop$ php Test.php 
TestClass::AVAILABLE = 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值