PHP中this,self,parent的区别

本文详细介绍了PHP中面向对象编程的基本概念,重点解析了this、self和parent三个关键字的区别及应用场景,通过具体示例帮助读者更好地理解和掌握这些核心概念。

{一}PHP中this,self,parent的区别之一this篇

      面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的。

PHP5经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性。这里我主要谈的是this,self,parent 三个关键字之间的区别。从字面上来理解,分别是指这、自己、父亲。先初步解释一下,this是指向当前对象的指针(可以看成C里面的指针),self是指向当前类的指针parent是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达。关于指针的概念,大家可以去参考百科。

下面我们就根据实际的例子结合来讲讲。

<?php

 classname          //建立了一个名为name的类
 {
    private$name;         //定义属性,私有

    //定义构造函数,用于初始化赋值
    function __construct( $name )
    {
         $this->name =$name;         //这里已经使用了this指针语句①
    }

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

    //打印用户名成员函数
    function printname()
    {
         print( $this->name);             //再次使用了this指针语句②,也可以使用echo输出
    }
 }

 $obj1 = new name("PBPHome");   //实例化对象 语句③

 //执行打印
 $obj1->printname(); //输出:PBPHome
 echo"<br>";                                    //输出:回车

 //第二次实例化对象
 $obj2 = new name( "PHP" );

 //执行打印
 $obj2->printname();                         //输出:PHP
 ?>
 

说明:上面的类分别在 语句①语句②使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(语句③),那么当时this就是指向$obj1对象,那么执行语句②的打印时就把print( $this-><name ) 变成了 print($obj1t->name ),那么当然就输出了"PBPHome"。第二个实例的时候,print($this->name )变成了print( $obj2->name),于是就输出了"PHP"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。
 

{二}。PHP中this,self,parent的区别之二self篇

此篇我们就self的用法进行讲解

首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。假如我们使用类里面静态(一般用关键字static)的成员,我们也必须使用self来调用。还要注意使用self来调用静态变量必须使用:: (域运算符号),见实例。

 <?php

    classcounter     //定义一个counter的类
    {
        //定义属性,包括一个静态变量$firstCount,并赋初值0 语句①  
        private static $firstCount = 0;
        private $lastCount;

        //构造函数
        function __construct()
        {
             $this->lastCount =++self::$firstCount;      //使用self来调用静态变量 语句②
        }

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

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

 $obj->printLastCount();                             //执行到这里的时候,程序输出1

 ?>

这里要注意两个地方语句①语句②。我们在语句①定义了一个静态变量$firstCount,那么在语句②的时候使用了self调用这个值,那么这时候我们调用的就是类自己定义的静态变量$frestCount。我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,因为self是指向类本身,与任何对象实例无关。然后前面使用的this调用的是实例化的对象$obj,大家不要混淆了。

关于self就说到这里,结合例子还是比较方便理解的。第二篇结束。

 

{三}PHP中this,self,parent的区别之三parent篇

此篇我们就parent的用法进行讲解。

首先,我们明确,parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。实例如下:

<?php
 //建立基类Animal
 class Animal
 {
    public $name; //基类的属性,名字$name

    //基类的构造函数,初始化赋值
    public function __construct( $name )
    {
         $this->name = $name;
    }
 }

 //定义派生类Person 继承自Animal类
 class Person extends Animal
 {
    public$personSex;       //对于派生类,新定义了属性$personSex性别、$personAge年龄
    public $personAge;

    //派生类的构造函数
    function __construct( $personSex, $personAge )
    {
         parent::__construct( "PBPHome");    //使用parent调用了父类的构造函数 语句①
         $this->personSex = $personSex;
         $this->personAge = $personAge;
    }

    //派生类的成员函数,用于打印,格式:名字 is name,age is 年龄
    function printPerson()
    {
         print( $this->name. " is ".$this->personSex. ",age is ".$this->personAge );
     }
 }

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

 //执行打印
 $personObject->printPerson();//输出结果:PBPHome is male,age is 21

 ?>

里面同样含有this的用法,大家自己分析。我们注意这么个细节:成员属性都是public(公有属性和方法,类内部和外部的代码均可访问)的,特别是父类的,这是为了供继承类通过this来访问。关键点在语句①:parent::__construct( "heiyeluren"),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,这样,继承类的对象就都给赋值了name为PBPHome。我们可以测试下,再实例化一个对象$personObject1,执行打印后name仍然是PBPHome。

总结:this是指向对象实例的一个指针,在实例化的时候来确定指向;self是对类本身的一个引用,一般用来指向类中的静态变量;parent是对父类的引用,一般使用parent来调用父类的构造函数。

<think>首先,用户的问题是:“我想了解C++中关键字parentselfthis的用法 请问C++中parentselfthis关键字的用法”。但在引用的内容中,提到的关键词是来自PHP的,而不是C++。引用[1], [2], [3] 都讨论的是PHP中的符号和关键字,如->、=>、::、thisselfparent,并且引用[5]提到C++关键字,但没有具体说parentselfthis。 系统指令要求我使用中文回答,并生成相关问题。回答必须清晰、可靠。 关键点: - 提供的引用主要是关于PHP的,不是C++。 - 用户问的是C++中的关键字parentselfthis。 - 在C++中,this是一个关键字,但parentself不是标准C++关键字。在C++中,通常使用继承时,通过指针或引用来访问父类,没有专门的parent关键字。类似地,self不是关键字;可能用户误解了,或者来自其他语言如PHP或Python。 在C++中: - this:是一个指针,指向当前对象的实例。它在成员函数中使用,表示当前对象。 - 没有parent关键字。在继承中,访问父类成员时,使用作用域解析运算符::,或者通过父类的指针/引用。 - 没有self关键字。this用于类似目的。 用户可能混淆了PHP和C++。引用中讨论的是PHP的关键字,但用户问的是C++。所以我需要澄清这一点。 我的回答应该: 1. 明确指出引用是关于PHP的,不是C++。 2. 解释C++中类似的概念。 3. 因为parentself不是C++关键字,我需要说明在C++中如何处理类似情况。 4. 确保回答真实可靠。 结构化回答: - 先确认用户的问题。 - 解释C++中的this关键字。 - 解释在C++中如何处理“parent”和“self”的概念,因为没有直接的关键字。 - 生成相关问题。 关于引用: - 引用[1], [2], [3], [4] 都是关于PHP的,讨论->、=>、::、thisselfparent。 - 引用[5] 提到C++关键字,但没有具体内容。 - 所以我不能直接依赖引用,因为它们不适用于C++。 回答内容: - 介绍C++中的thisthis是一个指针,指向当前实例的对象。在成员函数中,可以使用this来访问成员变量或成员函数。 - 对于“parent”:在C++中,没有parent关键字。当派生类需要访问基类成员时,使用基类的作用域或类型转换。例如,Base::function() 或 static_cast<Base*>(this)->function()。 - 对于“self”:C++中没有self关键字。this关键字用于表示当前对象。 生成相关问题: - 根据系统指令,我需要生成相关问题。例如: - 如何在C++中访问基类的成员? - C++中的this指针有哪些常见用途? - C++中是否有类似其他语言的selfparent关键字? 使用中文回答。 </think>### C++中关键字thisparentself的用法详解 在C++中,关键字`this`是标准语言特性,用于表示当前对象实例的指针。然而,`parent`和`self` **不是C++标准关键字**。它们可能源自其他编程语言(如PHP),在C++中没有直接等价物。以下我将基于可靠的C++语言规范(C++11及以上标准)解释这些概念的实际用法和替代方案,确保概念清晰且准确。 --- ### 1. `this`关键字的用法 `this`是C++中的内置指针,指向当前对象的实例。它在类的成员函数中使用,主要用于解决命名冲突、访问成员变量或返回当前对象引用。 - **核心用途**: - **访问成员变量**:当成员变量与局部变量同名时,用`this->`显式指明成员变量。 ```cpp class MyClass { public: int value; void setValue(int value) { this->value = value; // 使用this->区分成员变量value和参数value } }; ``` - **返回当前对象**:在成员函数中返回对象自身,常用于链式调用。 ```cpp class Counter { int count = 0; public: Counter& increment() { count++; return *this; // 返回当前对象的引用 } }; ``` - **注意事项**:`this`在静态成员函数中不可用,因为静态函数不绑定对象实例。作用域仅限于类的非静态成员函数中。 在PHP中,`this`用于访问对象成员(如引用[1]和[2]所述),但在C++中,`this`更强调指针语义和管理对象生命周期[^1][^4]。 --- ### 2. `parent`和`self`在C++中的处理 如前所述,C++没有`parent`或`self`关键字。这些概念通常通过其他机制实现: - **替代“parent”的功能(访问基类成员)**: - 在继承中,使用作用域解析运算符`::`显式调用基类成员。 ```cpp class Base { public: void print() { std::cout << "Base"; } }; class Derived : public Base { public: void print() { Base::print(); // 调用基类方法,类似于parent::print() in PHP std::cout << "Derived"; } }; ``` 这类似于PHP中`parent::__construct()`调用父类构造函数(如引用[1]所述),但在C++中直接使用基类名[^1][^3]。 - 如果涉及多重继承,需明确指定基类名(如`Base1::function()`)。 - **替代“self”的功能(访问静态成员或类自身)**: - 在C++中,访问静态成员或类作用域时,直接使用类名加`::`。 ```cpp class MyClass { public: static int count; static void increment() { count++; // 静态成员直接访问 } void show() { std::cout << MyClass::count; // 显式使用类名,类似于self::count in PHP } }; int MyClass::count = 0; ``` 这与PHP中`self::$firstCount`调用静态变量类似(引用[2]),但C++中没有`self`关键字,必须使用类名[^2][^3]。 - **关键区别**: - C++强调编译时类型安全,因此不使用`parent`或`self`关键字,而是依赖类名和运算符。 - 在PHP中,`self`指向类本身(引用[2]),`parent`指向父类(引用[1][3]);在C++中,等效操作通过硬编码类名或类型系统实现,灵活性较低但更高效。 --- ### 总结 - `this`:C++标准关键字,指针类型,用于对象实例访问。 - `parent`:非C++关键字,需用基类名加`::`替代。 - `self`:非C++关键字,需用类名加`::`替代(静态成员)或直接使用成员名(非静态)。 这些设计反映了C++的性能导向和静态类型特性,与PHP的动态特性不同(如引用[4]所述的解引用操作符差异)[^1][^2][^4]。 如需进一步学习,建议参考C++官方文档(如cppreference.com)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值