`

PHP中this self parent三个应用说明

    博客分类:
  • php
PHP 
阅读更多
this,self,parent三个关键字之间的区别。从字面上比较好理解,分别是指这、自己、父亲。我们先建立几个概念,这三个关键字分别是用在什么地方呢?我们初步解释一下,this是指向当前对象的指针(姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达。

      这么说还不能很了解,那我们就根据实际的例子结合来讲讲:

Php代码
(1) this  
 
class UserName  
{  
     //定义属性     
     private $name;  
 
     //定义构造函数  
     function __construct( $name )  
     {  
          $this->name = $name; //这里已经使用了this指针  
     }  
 
     //析构函数  
     function __destruct(){}  
 
     //打印用户名成员函数  
     function printName()  
     {  
         print( $this->name ); //又使用了this指针  
     }  
}  
 
//实例化对象  
$nameObject = new UserName( "heiyeluren" );  
 
//执行打印  
$nameObject->printName(); //输出: heiyeluren  
 
//第二次实例化对象  
$nameObject2 = new UserName( "PHP5" );  
 
//执行打印  
$nameObject2->printName(); //输出:PHP5  
?>  
 
我们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(25行),那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this-><name )变成了print( $nameObject->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject2->name ),于是就输出了"PHP5"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。  
 
   
 
(2)self  
 
首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。  
 
<?php  
 
     class Counter  
     {  
         //定义属性,包括一个静态变量  
         private static $firstCount = 0;  
         private $lastCount;  
 
         //构造函数  
         function __construct()  
         {  
              $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)  
         }  
 
         //打印最次数值  
         function printLastCount()  
         {  
              print( $this->lastCount );  
         }  
     }  
 
//实例化对象  
$countObject = new Counter();  
 
$countObject->printLastCount(); //输出 1  
 
?>  
 
我们这里只要注意两个地方,第6行和第12行。我们在第二行定义了一个静态变量$firstCount,并且初始值为0,那么在12行的时候调用了这个值,使用的是self来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量$frestCount,我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,可以使用 self来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self来调用。  
 
 
(3)parent  
 
我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。  
 
<?php  
 
//基类  
class Animal  
{  
     //基类的属性  
     public $name; //名字  
 
     //基类的构造函数  
     public function __construct( $name )  
     {  
          $this->name = $name;  
     }  
}  
 
//派生类  
class Person extends Animal //Person类继承了Animal类  
{  
     public $personSex; //性别  
     public $personAge; //年龄  
 
     //继承类的构造函数  
     function __construct( $personSex, $personAge )  
     {  
          parent::__construct( "heiyeluren" ); //使用parent调用了父类的构造函数  
          $this->personSex = $personSex;  
          $this->personAge = $personAge;  
     }  
 
     function printPerson()  
     {  
          print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge );  
      }  
}  
 
//实例化Person对象  
$personObject = new Person( "male", "21");  
 
//执行打印  
$personObject->printPerson(); //输出:heiyeluren is male,this year 21  
 
?> 

(1) this

class UserName
{
     //定义属性  
     private $name;

     //定义构造函数
     function __construct( $name )
     {
          $this->name = $name; //这里已经使用了this指针
     }

     //析构函数
     function __destruct(){}

     //打印用户名成员函数
     function printName()
     {
         print( $this->name ); //又使用了this指针
     }
}

//实例化对象
$nameObject = new UserName( "heiyeluren" );

//执行打印
$nameObject->printName(); //输出: heiyeluren

//第二次实例化对象
$nameObject2 = new UserName( "PHP5" );

//执行打印
$nameObject2->printName(); //输出:PHP5
?>

我们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(25行),那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this-><name )变成了print( $nameObject->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject2->name ),于是就输出了"PHP5"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。



(2)self

首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。

<?php

     class Counter
     {
         //定义属性,包括一个静态变量
         private static $firstCount = 0;
         private $lastCount;

         //构造函数
         function __construct()
         {
              $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
         }

         //打印最次数值
         function printLastCount()
         {
              print( $this->lastCount );
         }
     }

//实例化对象
$countObject = new Counter();

$countObject->printLastCount(); //输出 1

?>

我们这里只要注意两个地方,第6行和第12行。我们在第二行定义了一个静态变量$firstCount,并且初始值为0,那么在12行的时候调用了这个值,使用的是self来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量$frestCount,我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,可以使用 self来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self来调用。


(3)parent

我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。

<?php

//基类
class Animal
{
     //基类的属性
     public $name; //名字

     //基类的构造函数
     public function __construct( $name )
     {
          $this->name = $name;
     }
}

//派生类
class Person extends Animal //Person类继承了Animal类
{
     public $personSex; //性别
     public $personAge; //年龄

     //继承类的构造函数
     function __construct( $personSex, $personAge )
     {
          parent::__construct( "heiyeluren" ); //使用parent调用了父类的构造函数
          $this->personSex = $personSex;
          $this->personAge = $personAge;
     }

     function printPerson()
     {
          print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge );
      }
}

//实例化Person对象
$personObject = new Person( "male", "21");

//执行打印
$personObject->printPerson(); //输出:heiyeluren is male,this year 21

?>



 


Php代码
成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。我们注意关键的地方,第25行:  
parent::__construct( "heiyeluren" 
),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,因为父类的成员都是public的,于是我们就能够在继承类中直接使用  
this来调用。  
 
 
总结:  
this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用。
分享到:
评论

相关推荐

    PHP5中的this self和parent关键字详解

    在PHP编程语言中,`this`、`self`和`parent`这三个关键字对于理解类的内部工作原理以及如何在继承中正确使用类成员至关重要。下面将详细解释这三个关键字的意义及其用法。 #### 1. `this` 关键字 `this`关键字在...

    PHP5中的this,self和parent关键字详解教程

    在PHP5中,this、self和parent是三个非常重要的关键字,它们在面向对象编程中有着非常明确的用途和含义。为了更好地理解这三个关键字的用法,让我们一一进行探讨,并结合实例加深理解。 首先,让我们了解这三个...

    探讨PHP中this,self,parent的区别详解

    本文将深入探讨在PHP中this、self、parent这三个关键字的区别。 首先,`this`关键字在PHP中代表当前对象的引用。它是一个隐式传递的指针,允许我们访问当前对象的属性和方法。例如,在类的构造函数或成员函数中,`...

    php class中self,parent,this的区别以及实例介绍

    在PHP编程语言中,`this`, `self`, 和 `parent` 是三个非常重要的关键字,它们在处理类(class)和对象(object)时各有特定的用途。以下是对这三个关键字的详细解释,以及如何在实际场景中使用它们: 1. `this` ...

    PHP编程过程中需要了解的this,self,parent的区别

    {一}PHP中this,self,parent的区别之一...这里我主要谈的是 this,self,parent 三个关键字之间的区别。从字面上来理解,分别是指 这、自己、父亲。先初步解释一下,this是指向当前对象的指针(可以看成C里面的指针),se

    php5参考手书下载

    在PHP5中,`self` 被广泛应用于静态上下文中,例如初始化静态属性或调用静态方法。 ```php class Counter { private static $count = 0; function __construct() { self::$count++; } } ``` - **PARENT**:...

    php权威编程

    PHP 5首席设计师Andi Gutmans,PEAR创始人Stig Saether Bakken,PHP核心贡献者Derick Rethans三大高手合力而作:本书几乎囊括了PHP 5所有的新特性,包括PHP 5所有的新功能,PHP 5的面向对象编程方法和设计模式,以及...

    PHP5编程实践范例

    `$this`变量是PHP中的一个特殊变量,用于在类的方法内部引用当前对象。 继承是面向对象的另一重要特性,允许子类继承父类的属性和方法。PHP5提供了`public`、`protected`和`private`三种访问修饰符,分别控制属性和...

    php语法之php常用类

    在PHP中,我们使用`class`关键字来定义一个类。类可以包含属性(成员变量)和方法(成员函数)。例如,创建一个名为`Person`的类,包含`name`和`age`两个属性: ```php class Person { public $name; public $...

    PHP5类与对象编程.pdf

    以上是关于PHP5中面向对象编程的基础知识点总结,包括范围解析操作符、self 和 parent 关键字、方法覆盖、静态关键字以及类常量等内容。掌握这些基本概念对于深入理解和使用PHP5面向对象编程至关重要。

    2010年最新PHP类的精缩归纳

    在PHP中,`__construct()` 是一个特殊的构造函数,当创建一个新的对象实例时,该函数会自动调用。例如: ```php class ClassName { public function __construct($v, $v2) { // 初始化操作 } } $obj = new ...

    详解PHP后期静态绑定分析与应用

    self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。 parent用于调用父类中被覆盖的属性或方法(出现在哪里,就将解析为相应类的父类)。 self用于调用本类中的方法或属性...

    php高级进阶材料(详细)

    书中详细讲述了如何声明一个类,构造函数和析构函数的作用,以及如何利用$this变量访问类的属性和方法。 继承是面向对象编程的一个重要概念,它允许一个类继承另一个类的特性。PHP通过public、protected、private等...

    Laravel开发-nested-sets

    return $this-&gt;belongsTo(self::class, 'parent_id'); } public function children() { return $this-&gt;hasMany(self::class, 'parent_id'); } } ``` 安装好相应的包后,我们就可以使用提供的方法来进行操作...

Global site tag (gtag.js) - Google Analytics