PHP 面向对象:this 关键字
2010-04-16
PHP5中为解决变量的命名冲突和不确定性问题,引入关键字“$this”代表其所在当前对象。
$this在构造函数中指该构造函数所创建的新对象。
在类中使用当前对象的属性和方法,必须使用$this->取值。
方法内的局部变量,不属于对象,不使用$this关键字取值。
局部变量和全局变量与 $this 关键字
使用当前对象的属性必须使用$this关键字。
局部变量的只在当前对象的方法内有效,所以直接使用。
注意:局部变量和属性可以同名,但用法不一样。在使用中,要尽量避免这样使用,以免混淆。
01 | <!-- 验证属性和局部变量使用方法的类 --> |
02 | <? |
03 | class A{ |
04 | private $a = 99; |
05 | //这里写一个打印参数的方法. |
06 | public function printInt( $a ){ |
07 | echo "这里的 \$a 是传递的参数 $a " ; |
08 | echo "<br>" ; |
09 | echo "这里的 \$this->a 是属性 $this->a" ; |
10 | } |
11 | } |
12 | $a = new A(); // 这里的$a 可不是类中的任何一个变量了. |
13 | $a ->printInt(88); |
14 | ?> |
程序运行结果:
1 | 这里的 $a 是传递的参数 88 |
2 | 这里的 $this ->a 是属性 99 |
用$this调用对象中的其它方法
01 | <!--写一个类,让他自动完成最大值的换算.--> |
02 | <? |
03 | class Math{ |
04 | //两个数值比较大小. |
05 | public function Max( $a , $b ){ |
06 | return $a > $b ? $a : $b ; |
07 | } |
08 | //三个数值比较大小. |
09 | public function Max3( $a , $b , $c ){ |
10 | //调用类中的其它方法. |
11 | $a = $this ->Max( $a , $b ); |
12 | return $this ->Max( $a , $c ); |
13 | } |
14 | } |
15 | $math = new Math(); |
16 | echo "最大值是 " . $math ->Max3(99,100,88); |
17 | ?> |
程序运行结果:
1 | 最大值是 100 |
使用$this调用构造函数
调用构造函数和析构函数的方法一致。
01 | <? |
02 | class A{ |
03 | private $a = 0; |
04 | public function __construct(){ |
05 | $this ->a = $this ->a + 1 ; |
06 | } |
07 | |
08 | public function doSomeThing(){ |
09 | $this ->__construct(); |
10 | return $this ->a; |
11 | } |
12 | |
13 | |
14 | } |
15 | $a = new A(); // 这里的$a 可不是类中的任何一个变量了. |
16 | echo "现在 \$a 的值是" . $a ->doSomeThing(); |
17 | ?> |
程序运行结果:
1 | 现在 $a 的值是2 |
$this 到底指的什么?
$this 就是指当前对象,我们甚至可以返回这个对象使用 $this
01 | <? |
02 | class A{ |
03 | public function getASelf(){ |
04 | return $this ; |
05 | } |
06 | public function __toString(){ |
07 | return "这是类A的实例." ; |
08 | } |
09 | } |
10 | $a = new A(); // 创建A的实例; |
11 | $b = $a ->getASelf(); //调用方法返回当前实例. |
12 | echo $a ; //打印对象会调用它的__toString方法. |
13 | ?> |
程序运行结果:
1 | 这是类A的实例. |
通过 $this 传递对象
01 | <!-- 通过 $this 传递对象 |
02 | 在这个例子中,我们写一个根据不同的年龄发不同工资的类. |
03 | 我们设置处理年龄和工资的业务模型为一个独立的类. |
04 | --> |
05 | <? |
06 | class User{ |
07 | private $age ; |
08 | private $sal ; |
09 | private $payoff ; //声明全局属性. |
10 | |
11 | //构造函数,中创建Payoff的对象. |
12 | public function __construct(){ |
13 | $this ->payoff = new Payoff(); |
14 | } |
15 | public function getAge(){ |
16 | return $this ->age; |
17 | } |
18 | public function setAge( $age ){ |
19 | $this ->age = $age ; |
20 | } |
21 | // 获得工资. |
22 | public function getSal(){ |
23 | $this ->sal = $this ->payoff->figure( $this ); |
24 | return $this ->sal; |
25 | } |
26 | } |
27 | //这是对应工资与年龄关系的类. |
28 | class Payoff{ |
29 | public function figure( $a ){ |
30 | $sal =0; |
31 | $age = $a ->getAge(); |
32 | if ( $age >80 || $age <16 ){ |
33 | $sal = 0; |
34 | } elseif ( $age > 50){ |
35 | $sal = 1000; |
36 | } else { |
37 | $sal = 800; |
38 | } |
39 | return $sal ; |
40 | } |
41 | } |
42 | //实例化User |
43 | $user = new User(); |
44 |
45 | $user ->setAge(55); |
46 | echo $user ->getAge(). "age ,his sal is " . $user ->getSal(); |
47 | echo "<br>" ; |
48 |
49 | $user ->setAge(20); |
50 | echo $user ->getAge(). "age , his sal is " . $user ->getSal(); |
51 | echo "<br>" ; |
52 |
53 | $user ->setAge(-20); |
54 | echo $user ->getAge(). "age , his sal is " . $user ->getSal(); |
55 | echo "<br>" ; |
56 |
57 | $user ->setAge(150); |
58 | echo $user ->getAge(). "age , his sal is " . $user ->getSal(); |
59 | ?> |
程序运行结果:
1 | 55age ,his sal is 1000 |
2 | 20age , his sal is 800 |
3 | -20age , his sal is 0 |
4 | 150age , his sal is 0. |
随机文章推荐 |
- 你需要了解的十个PHP框架
- PHP多文件上传类推荐
- PHP面向对象:PHP中的多态
- 向iframe传递参数
- PHP 时区设置
- PHP判断浏览器类型的代码
- 关于PHP引用(符号&)的用法
- ZF实现Controllers的自定义Action
- 从手册去理解PHP session机制
- PHP求一元二次方程的根的算法
- PHP分页类advance_fenye2.0
- PHP 面向对象:访问控制
网站分类 |
注:如需转载本文,请注明出处(原文链接),谢谢。更多精彩内容,请进入简明现代魔法首页。