• php 面向对象:this 关键字


    PHP5中为解决变量的命名冲突和不确定性问题,引入关键字“$this”代表其所在当前对象。

    $this在构造函数中指该构造函数所创建的新对象。

    在类中使用当前对象的属性和方法,必须使用$this->取值。

    方法内的局部变量,不属于对象,不使用$this关键字取值。

    局部变量和全局变量与 $this 关键字

    使用当前对象的属性必须使用$this关键字。

    局部变量的只在当前对象的方法内有效,所以直接使用。

    注意:局部变量和属性可以同名,但用法不一样。在使用中,要尽量避免这样使用,以免混淆。

     1 <?php
     2 class A{
     3     private $a = 99;
     4     //这里写一个打印参数的方法.
     5     public function printInt($a){
     6         echo "这里的 $a 是传递的参数 $a ";
     7         echo "<br>";
     8         echo "这里的 $this->a 是属性 $this->a";
     9     }
    10 }
    11 
    12 $a = new A(); // 这里的$a 可不是类中的任何一个变量了.
    13 $a->printInt(88);

    打印结果是

    这里的 $a 是传递的参数 88 
    这里的 $this->a 是属性 99

    用$this调用对象中的其它方法

     1 <?php
     2 //写一个类,让他自动完成最大值的换算
     3 class Math{
     4     //两个数值比较大小.
     5     public function Max($a,$b){
     6         return $a>$b?$a:$b;     
     7     }
     8     //三个数值比较大小.
     9     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);

    打印结果是:

    最大值是 100

    使用$this调用构造函数

    调用构造函数和析构函数的方法一致。

     1 <?php
     2 class A{
     3     private $a = 0;
     4     public function __construct(){
     5         $this->a = $this->a + 1 ;
     6     }
     7      
     8     public function doSomeThing(){
     9         $this->__construct();
    10         return $this->a;
    11     }     
    12 }
    13 $a = new A(); // 这里的$a 可不是类中的任何一个变量了.
    14 echo "现在 $a 的值是" . $a->doSomeThing();

    打印结果是:

    现在 $a 的值是2

    $this 到底指的什么?

    $this 就是指当前对象,我们甚至可以返回这个对象使用 $this

     1 <?php
     2 class A{
     3     public function  getASelf(){
     4         return $this;
     5     }
     6     public function __toString(){
     7         return "这是类A的实例.";     
     8     }  
     9 }
    10 $a = new A(); // 创建A的实例;
    11 $b = $a->getASelf(); //调用方法返回当前实例.
    12 echo $a; //打印对象会调用它的__toString方法.

    打印结果是:

    这是类A的实例.

    通过 $this 传递对象

     1 <!-- 通过$this 传递对象 
     2 在这个例子中,我们写一个根据不同的年龄发不同工资的类.
     3 我们设置处理年龄和工资的业务模型为一个独立的类.
     4 -->
     5 <?php
     6 class User{
     7     private $age ; 
     8     private $sal ;
     9     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();

    打印结果是:

    55age ,his sal is 1000
    20age , his sal is 800
    -20age , his sal is 0
    150age , his sal is 0

    转载:http://www.nowamagic.net/php/php_KeywordThis.php

  • 相关阅读:
    atitit.团队建设要不要招技术储备人才的问题
    Atitit. 最佳实践 QA降低cpu占有率cpu占用太高怎么办
    Atitit.struts2体系结构大总结
    Atitit.hibernate体系结构大总结
    Atitit.软件GUI按钮与仪表盘db数据库区导入mysql sql错误的解决之道
    Atitit. Gui控件and面板程序快速启动区最佳实践Launchy ObjectDocko0g
    Atitit。团队建设管理最佳实践如何留住核心人才,防止人才流失 ??
    Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁但是不能切换
    Atitit.Gui控件and面板数据库区mssql 2008 权限 配置 报表查看成员
    Atitit.故障排除系列NoClassDefFoundError NoClassDefFoundError
  • 原文地址:https://www.cnblogs.com/clubs/p/10015254.html
Copyright © 2020-2023  润新知