찾다
php教程php手册php面向对象的简单总结 $this $parent self

php面向对象的简单总结 $this $parent self

 虽然接触php比较长时间,但有时在使用一些基础东西的时候还会有些不确定,有些疑惑。面向对象涉及到的比较多,大概总结整理一下php的属性、对象,以及访问方式$this  $parent  self  的使用场景。

 

1. PHP类属性定义和访问方式:

 

 

 1

 2 class testClass {

 3     const tConst = 1;

 4     public $tVar = 2;    //或 public $tVar;  前面需要有变量修饰符

 5     static $tSta = 3;

 6 

 7     public function __construct(){

 8         echo $this->tConst;    //无错误,无输出

 9         echo self::tConst;    //正确输出 1

10         

11         echo $this->tVar;    // 注意tVar前不能有$符号

12         echo self::$tVar;    // Access to undeclared static property: testClass::$tVar

13         echo self::tVar;    // tVar前需要加上$符号,Undefined class constant 'tVar'

14         

15         echo $this->tSta;    //无错误,无输出

16         echo self::$tSta;    //正确输出 3

17         

18     }

19 }

20 

21 $otestClass = new testClass();

 

 

 

 

 

总结几点:

 

在实例化对象时  $otestClass = new testClass(); 其中testClass()中的()可以省略,当构造函数有显式声明需要参数时,需要在这里传入参数

如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::

如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->

从类的内部访问const或者static变量或者方法,使用自引用的self

从类的内部访问不为const或者static变量或者方法,使用自引用的$this

2. $this->  究竟指向哪?

 

 1 class testClass {

 2     var $nick = '';

 3     

 4     public function __construct($nick){

 5         $this->nick = $nick;

 6     }

 7     

 8     public function display(){

 9         echo $this->nick;

10     }

11 }

12 

13 $otestClass1 = new testClass('frank');

14 $otestClass1->display();        //echo $otestClass1->nick;  和此结果相同

 

 

 

上面例子中,$this->display();   其实就是 $otestClass1->nick,因此$this究竟指向哪是由所实例化的对象决定的,指向当前对象实例的指针。包括变量、方法都是如此

 

$this->方法() 的例子:

 

 

 1 class baseClass{

 2     public function testFunc(){

 3         echo "\n" . 'I`m boss';

 4     }

 5 }

 6 

 7 class parentClass extends baseClass{

 8     public function testFunc(){

 9         echo "\n" . 'I`m the up';

10     }

11 }

12 

13 class testClass extends parentClass{

14     var $nick = '';

15     

16     public function __construct($nick){

17         $this->nick = $nick;

18     }

19     

20     public function display(){

21         echo $this->nick;

22         $this->testFunc();

23     }

24 }

25 

26 $otestClass1 = new testClass('frank');

27 $otestClass1->display();

 

 

 

这样的代码最后的输出结果是什么呢?关键是看testFunc()方法。

 

如果在类中用$this调用一个当前类中不存在的方法或变量,它会依次去父类寻找,直到找不到再报错

基于第一条,如果找到了需要的方法或变量,就会停止寻找,如果其上级父类中还有同样的,则选择当前找到的

所以上面代码输出为:

 

frank

I`m the up

 

 

3. 关于parent::

 

parent是对父类的引用

 

 

 1

 2 class A {

 3     public  $a = 'aa';

 4     public function callFunc(){

 5         echo 'parent';

 6     }

 7 }

 8 

 9 class B extends A{

10     public function __construct(){

11         parent::callFunc();

12         echo "\n" . $this->a;

13     }

14 }

15 

16 $oB = new B;

 

比如,上面的代码中,在class B中,若要调用其父类A中的callFunc()方法,就需要使用parent::callFunc(),但A类中此方法必须是public修饰的,否则会提示 Fatal error: Call to private method A::callfunc() from context 'B'...

 

另外需要注意的是,对于父类中的属性$a,调用的时候用$this,用parent就访问不到了。若$a在A类中是这样定义的:public static $a,则访问的时候就需要parent::$a

 

注意,parent不具备传递性,它只能代表当前类的父类,若此例子A类继承base类,在base类中定义baseFunc()方法,那么在B类中使用parent::baseFunc()是错误的,只能在A类中这样使用。

 

4. self::又指向哪里?

 

简单的说,self和某具体实例没有关系,它只指向当前类,不会受某具体类对象的影响

 

 

 1 class testClass{

 2     public static $count = 0;

 3     public $num = 0;

 4     

 5     function __construct(){

 6         self::$count++;

 7         $this->num++;

 8     }

 9     

10     function display(){

11         echo self::$count . "\n";

12         echo $this->num . "\n";

13     }

14 }

15 

16 $oTest1 = new testClass;

17 $oTest1->display();        //输出: 1  1

18 

19 $oTest2 = new testClass;

20 $oTest2->display();        //输出: 2  1

 

 

上面例子中self::$cout始终指向该类本身,而$num是单独存在于各个具体实例中的。

 

 

 

5. 总结:

 

  $this 指向当前的实例

 

  $parent 是父类的引用

 

  self 对当前类本身的一个引用

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
使用PHP的json_encode()函数将数组或对象转换为JSON字符串使用PHP的json_encode()函数将数组或对象转换为JSON字符串Nov 03, 2023 pm 03:30 PM

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,已经成为Web应用程序之间数据交换的常用格式。PHP的json_encode()函数可以将数组或对象转换为JSON字符串。本文将介绍如何使用PHP的json_encode()函数,包括语法、参数、返回值以及具体的示例。语法json_encode()函数的语法如下:st

源码探秘:Python 中对象是如何被调用的?源码探秘:Python 中对象是如何被调用的?May 11, 2023 am 11:46 AM

楔子我们知道对象被创建,主要有两种方式,一种是通过Python/CAPI,另一种是通过调用类型对象。对于内置类型的实例对象而言,这两种方式都是支持的,比如列表,我们即可以通过[]创建,也可以通过list(),前者是Python/CAPI,后者是调用类型对象。但对于自定义类的实例对象而言,我们只能通过调用类型对象的方式来创建。而一个对象如果可以被调用,那么这个对象就是callable,否则就不是callable。而决定一个对象是不是callable,就取决于其对应的类型对象中是否定义了某个方法。如

使用Python的__contains__()函数定义对象的包含操作使用Python的__contains__()函数定义对象的包含操作Aug 22, 2023 pm 04:23 PM

使用Python的__contains__()函数定义对象的包含操作Python是一种简洁而强大的编程语言,提供了许多强大的功能来处理各种类型的数据。其中之一是通过定义__contains__()函数来实现对象的包含操作。本文将介绍如何使用__contains__()函数来定义对象的包含操作,并且给出一些示例代码。__contains__()函数是Pytho

使用Python的__le__()函数定义两个对象的小于等于比较使用Python的__le__()函数定义两个对象的小于等于比较Aug 21, 2023 pm 09:29 PM

标题:使用Python的__le__()函数定义两个对象的小于等于比较在Python中,我们可以通过使用特殊方法来定义对象之间的比较操作。其中之一就是__le__()函数,它用于定义小于等于比较。__le__()函数是Python中的一个魔法方法,并且是一种用于实现“小于等于”操作的特殊函数。当我们使用小于等于运算符(<=)比较两个对象时,Python

详解Javascript对象的5种循环遍历方法详解Javascript对象的5种循环遍历方法Aug 04, 2022 pm 05:28 PM

Javascript对象如何循环遍历?下面本篇文章给大家详细介绍5种JS对象遍历方法,并浅显对比一下这5种方法,希望对大家有所帮助!

Python中如何使用getattr()函数获取对象的属性值Python中如何使用getattr()函数获取对象的属性值Aug 22, 2023 pm 03:00 PM

Python中如何使用getattr()函数获取对象的属性值在Python编程中,我们经常会遇到需要获取对象属性值的情况。Python提供了一个内置函数getattr()来帮助我们实现这个目标。getattr()函数允许我们通过传递对象和属性名称作为参数来获取该对象的属性值。本文将详细介绍getattr()函数的用法,并提供实际的代码示例,以便更好地理解。g

使用Python的isinstance()函数判断对象是否属于某个类使用Python的isinstance()函数判断对象是否属于某个类Aug 22, 2023 am 11:52 AM

使用Python的isinstance()函数判断对象是否属于某个类在Python中,我们经常需要判断一个对象是否属于某个特定的类。为了方便地进行类别判断,Python提供了一个内置函数isinstance()。本文将介绍isinstance()函数的用法,并提供代码示例。isinstance()函数可以判断一个对象是否属于指定的类或类的派生类。它的语法如下

Vue中如何使用v-for指令循环输出对象Vue中如何使用v-for指令循环输出对象Jun 11, 2023 am 08:51 AM

在Vue中,v-for是一种指令,在模板中使用它可以对数组或对象进行循环操作。v-for指令用于循环渲染数据,它是Vue中非常有用的指令之一。在Vue中,使用v-for指令循环输出对象的方式和循环输出数组的方式类似,只需要稍作区别即可。如何使用v-for指令循环输出对象呢?下面我们将分以下几个部分进行讲解。一、v-for指令的基本使用v-for指令的基本语法

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경