[PHP] 当一个类在另一个类中被使用,$this 所指是谁
你确定,你的代码可以执行吗,同学?A::foo();你的这句,会调用失败的,foo()不是静态方法,根本无法这样调用哈。你如果想调用,必须实例化。class B {\tfunction bar(){\t\t$a = new A(); $a-\u0026gt;foo();\t}}对A实例化出来的对象中,$this的class名是A,B实例化出来的对象中的$this的class名是B。而你的A::foo();这个用法,是一个类的静态成员方法,是唯一并且属于类本身(类内部使用的是self,没有$this)。和被我们通过new实例化出来的对象,不是同一个东西哈。更详细的,推荐你,可以看看PHP相关的面向对象知识哈。
■网友
这个问题是好久之前的了,我现在回答也算是挖坟了吧。前面两位答主似乎都没回答到点子上。其实答案很简单,同学你真的想多了。首先,吐槽一下PHP官方文档的中文翻译,题主你给出的连接中的中文表述实在是太操蛋了,读起来完全不知所以然嘛。相比而言,它的英文版就易懂多了PHP: The Basics:$this is a reference to the calling object (usually the object to which the method belongs, but possibly another object, if the method is called statically from the context of a secondary object). 再解释这段话之前,不妨扯一句大家都知道的废话:PHP这门未经过优雅设计的编程语言有个特点,那就是总是用最简单最直白的方式去解决遇到的问题。比如这里的关于类的$this引用,它总是遵循这样的规则:对于类定义中的伪变量$this,它指的是对调用这个方法的那个对象的引用这个情况有JavaScript中的$this有异曲同工之妙,都是动态可变的。具体而言,有两种表现:1、如果这个类是经过实例化之后再去调用那个实例的方法的,那就是咱们平时最常见到的情况。2、 如果这个类的方法是被直接静态调用的,那么$this指向的是调用这个类的静态方法的那个对象。说的比较拗口,但情况2其实就是你这里的遇见的问题。首先,为了说明问题,先不用管A类中的什么乱七八糟私有的$mysqli,我把你的例子改为:\u0026lt;?phpclass A { public function foo(){ echo $this-\u0026gt;a; }}class B { public $a=1; function bar(){ A::foo(); }}$b = new B();$b-\u0026gt;bar();?\u0026gt;你觉得输入是多少?也许很多人觉得会报错,因为A类中压根没有定义属性a;但实际上,结果是1——也就是B中的a属性。原因很简单,根据那条规则的情况2,$b-\u0026gt;bar()会静态调用A::foo() ,所以$this实际指的就是$b-\u0026gt;a。回到题主的问题中来,echo get_class($this);会输出\u0026#39;B\u0026#39;,根本原因是这个方法被你静态调用导致$this被”绑到“$b上来了,你get_class($b)自然得到B类的名称。所以:题主担心的会不会出现意外、怎么避免冲突,这些问题都不存在——这些问题的出现与否,得看你是否想去劫持$this。
■网友class A{ public function foo() { echo $this-\u0026gt;a; // (2) }}class B{ public $a = 1; public function bar() { A::foo(); // (1) }}$b = new B();$b-\u0026gt;bar();
【[PHP] 当一个类在另一个类中被使用,$this 所指是谁】 (1) 是文档所说的 calling a non-static method statically from an incompatible context
PHP 7,(1) 处 E_DEPRECATED,(2) 处 $this 不存在,fatal error
PHP 5.6,(1) 处 E_DEPRECATED, (2) 处 $this 为 calling object $b,打印 1
■网友
推荐阅读
- 同比■同比增长7.1%!2021年的第一个节你花了多少钱?
- “他是我第一个会说普通话的老师”:一对师生折射青海山村蝶变
- 有必要重新开个C店吗
- 大学再有三个月就结束了,没学到知识,参加一个软件测试培训机构好吗
- 汽车|长安UNI-K又将开创一个新的"引力"纪元?
- 神话|武汉传奇父亲:一个平行班孩子创造的高考神话(感动上万家长)
- 王者荣耀李白能不能出肉
- 直播会成为品牌传播的另一个途径么有哪些可行的方法感觉有戏又没头绪好捉急。
- 怎样成为一名合格的Python程序员?
- 知乎有没有必要增加一个特别关注功能
