资讯专栏INFORMATION COLUMN

PHP中的符号 ->、=> 和 :: 分别表示什么意思?以及this,self,pare

null1145 / 9154人阅读

摘要:定义属性,包括一个静态变量构造函数使用来调用静态变量使用调用必须使用域运算符号打印最次数值实例化对象输出我们这里只要注意两个地方,第行和第行。我们知道是指向父类的指针,一般我们使用来调用父类的构造函数。

一、->,=>和::的区别

->前面的变量是一个对象:

$user->friends_count
取对象的friends_count属性。

$t->homeTimeline($p)
调用对象的homeTimeline方法,方法中传入一个参数$p

    php新手经常碰到的问题,->、=> 和 :: 这三个家伙是什么分别都是做什么的啊!看着就很晕。
    没关系,下面我们做一下详细的解释,如果你有C++,Perl基础,你会发现这些家伙和他们里面的一些符号功能是差不多的。
    php‘- >’符号是“插入式解引用操作符”(infix dereference operator)。换句话说,它是调用由引用传递参数的子程序的方法(当然,还有其它的作用)。正如我们上面所提到的,在调用PHP的函数的时候,大部分参数都是通过引用传递的。PHP中的‘->’功能就和它们在Perl或C++中一样。下面是一个简单的解引用的例子:

    在PHP的脚本中‘=>’操作符时很常见的。因为php数组函数很丰富,我们要经常用到数组,因为它操作数据很方便。

</>复制代码

  1. $phparr= new array( in => "reply,"
  2. side => "left",
  3. padx => 2m,
  4. pady => 2m,
  5. ipadx => 2m,
  6. ipady => 1m
  7. )

    顺便说一下,如果你需要用数字“大于等于”的符号,你应该用“>=”而不是“=>”。
    在PHP中“::”这个叫范围解析操作符,又名域运算符。“::”符号可以认为是与C语言中的“.”相似的,而它更像C++中(Perl)的::类范围操作符。
    php调用类的内部静态成员,或者是类之间调用就要用::
下面是一个例子:

</>复制代码

  1. class A
  2. {
  3. static $count = 0;
  4. static function haha()
  5. {
  6. //
  7. }
  8. function diaoyoug()
  9. {
  10. self::haha();
  11. self::$count;
  12. }
  13. }
  14. a.b.c; /* C语言中的 */
  15. a::b::c(); // C++ 中的函数
  16. $a::b::c; # Perl 5中的标量
  17.   
二、this,self,parent三个关键字从字面上比较好理解,分别是指这、自己、父亲。

this是指向当前对象的指针(姑且用C里面的指针来看吧)
==>this是指向当前对象实例的指针,不指向任何其他对象或类。

self是指向当前类的指针
==>self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。

parent是指向父类的指针(我 们这里频繁使用指针来描述,是因为没有更好的语言来表达)

根据实际的例子来看看

</>复制代码

  1. (1) this
  2. 1 name = $name; //这里已经使用了this指针
  3. 12     }
  4. 13 
  5. 14     //析构函数
  6. 15     function __destruct(){}
  7. 16
  8. 17     //打印用户名成员函数
  9. 18     function printName()
  10. 19     {
  11. 20          print( $this->name ); //又使用了this指针
  12. 21     }
  13. 22 }
  14. 23
  15. 24 //实例化对象
  16. 25 $nameObject = new UserName( "heiyeluren" );
  17. 26
  18. 27 //执行打印
  19. 28 $nameObject->printName(); //输出: heiyeluren
  20. 29
  21. 30 //第二次实例化对象
  22. 31 $nameObject2 = new UserName( "PHP5" );
  23. 32
  24. 33 //执行打印
  25. 34 $nameObject2->printName(); //输出:PHP5
  26. 35 ?>

    我们看,上面的类分别在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使用来指向类中的静态变量。

</>复制代码

  1. 1 lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
  2. 13         }
  3. 14
  4. 15         //打印最次数值
  5. 16         function printLastCount()
  6. 17         {
  7. 18              print( $this->lastCount );
  8. 19         } 
  9. 20     }
  10. 21
  11. 22 //实例化对象
  12. 23 $countObject = new Counter();
  13. 24
  14. 25 $countObject->printLastCount(); //输出 1
  15. 26
  16. 27 ?>

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

(3)parent

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

</>复制代码

  1. 1 name = $name;
  2. 13     }
  3. 14 }
  4. 15
  5. 16 //派生类
  6. 17 class Person extends Animal //Person类继承了Animal
  7. 18 {
  8. 19     public $personSex; //性别
  9. 20     public $personAge; //年龄
  10. 21
  11. 22     //继承类的构造函数
  12. 23     function __construct( $personSex, $personAge )
  13. 24     {
  14. 25          parent::__construct( "heiyeluren" ); //使用parent调用了父类的构造函数
  15. 26          $this->personSex = $personSex;
  16. 27          $this->personAge = $personAge;
  17. 28     }
  18. 29
  19. 30     function printPerson()
  20. 31     {
  21. 32          print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge );
  22. 33      }
  23. 34 }
  24. 35
  25. 36 //实例化Person对象
  26. 37 $personObject = new Person( "male", "21");
  27. 38
  28. 39 //执行打印
  29. 40 $personObject->printPerson(); //输出:heiyeluren is male,this year 21
  30. 41
  31. 42 ?>

我们注意这么几个细节:成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。
我们注意关键的地方,第25行: parent::__construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,
因为父类的成员都是public的,于是我们就能够在继承类中直接使用 this来调用。

总结:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22492.html

相关文章

  • PHPself关键字

    摘要:有了的静态延迟绑定功能,可以在运行时动态确定归属的类。与是被讨论最多,也是最容易引起误用的组合。的用途看完与上述三个关键字的区别,的用途是不是呼之即出一句话总结,那就是总是指向当前类及类实例。 转载请注明文章出处:https://tlanyan.me/self-in-php/ PHP群里有人询问self关键字的用法,答案是比较明显的:静态成员函数内不能用this调用非成员函数,但可以用...

    morgan 评论0 收藏0
  • PHP面向对象编程:面向对象概念、基本实践、高级实战、PHP面向对象特殊实践

    摘要:一面向对象的概念什么是面向对象世间万物皆对象,抽象的也是对象,一切可见或不可见都是对象对象的基本组成对象包含两个部分对象的组成元素是对象的数据模型,用于描述对象的数据又称为对象的属性,或者对象的成员变量对象的行为是对象的行为模型,用于描述对 一、面向对象的概念 1.1 什么是面向对象(object oriented)      世间万物皆对象,抽象的也是对象,一切可见或不可见都是对象 ...

    worldligang 评论0 收藏0
  • 三篇文章带你极速入门php(一)之语法

    摘要:本文适合阅读用户有其他语言基础的童鞋看完语法教程来回顾一下的童鞋传送门,想全面看一下语法推荐这里毫无基础然而天资聪慧颇有慧根不要左顾右看说的就是你,老夫这里有一本从入门到放弃,观你根骨清奇两银子卖给你如何看完本文后你会收获到什么的变量的定义 本文适合阅读用户 有其他语言基础的童鞋 看完w3cschool语法教程来回顾一下的童鞋(传送门,想全面看一下php语法推荐这里) 毫无基础然而天...

    loostudy 评论0 收藏0
  • PHP基础系列之正则表达式(一)

    摘要:正则表达式作为一个匹配的模板,是由定界符,原子普通字符,例如有特殊功能的字符称为元字符,例如等以及模式修正符等部分组成的文字模式。正则表达式中可以使用编码。限定符限定符用来指定正则表达式的一个给定原子必须要出现多少次才能满足匹配。 正则表达式的定义 正则表达式就是描述字符排列模式的一种自定义的语法规则。由于正则表达式本身具有一套非常完整的、可以编写模式的语法体系,提供了一种灵活且直观的...

    Anchorer 评论0 收藏0
  • 搞定PHP面试 - 正则表达式知识点整理

    摘要:是决定正则表达式匹配规则的主要部分。二分隔符分隔符的选择当使用函数的时候,正则表达式必须由分隔符闭合包裹。果分隔符经常在正则表达式内出现,最好使用其他分隔符来提高可读性。需要将一个字符串放入正则表达式中使用时,可以用函数对其进行转义。 一、简介 1. 什么是正则表达式 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的一种公式。正则表达式使用单个字符串来...

    AaronYuan 评论0 收藏0
  • PHP7源码分析】PHP7源码研究之浅谈Zend虚拟机

    摘要:中词法语法分析,生成抽象语法树,然后编译成及被执行均由虚拟机完成。通常情况下这部分是可选部分,主要为便于程序的读写方便而使用。指令虚拟机的指令称为,每条指令对应一个。 作者 陈雷编程语言的虚拟机是一种可以运行中间语言的程序。中间语言是抽象出的指令集,由原生语言编译而成,作为虚拟机执行阶段的输入。很多语言都实现了自己的虚拟机,比如Java、C#和Lua。PHP语言也有自己的虚拟机,称为Z...

    马龙驹 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<