PHP 继承问题

2020-05-13 20:11:06 +08:00
 sy5587

class a{ private $ff;

public function cc(){

$this->ff=44;

echo $this->ff;

var_dump($this); }

}

class b extends a{

public function bb(){

parent::cc();

}

}

$dd = new b(); $dd->bb(); 我想知道$this->ff=44;这句代码执行的时候到底是在父类执行的还是在子类执行的啊,要是在父类,返回的对象为什么又是子类的对象,应该怎么理解

3152 次点击
所在节点    PHP
19 条回复
zsdroid
2020-05-13 20:13:17 +08:00
子类
zsdroid
2020-05-13 20:18:38 +08:00
new 子类,返回子类对象有问题吗?
zsdroid
2020-05-13 20:19:35 +08:00
@zsdroid #1 子=》父
sy5587
2020-05-13 20:19:40 +08:00
这个地方好绕啊,在子类执行父类的方法,还能看到父类的私有属性还看不到子类的私有属性,到底是什么运行机制啊
ben1024
2020-05-13 23:16:23 +08:00
@sy5587
父类的方法能访问父类的私有属性,子类的方法不能访问,因为没有继承
类似 child class => child function => parent function => parent attribute
GM
2020-05-14 00:16:57 +08:00
@sy5587 代码是共享的,只有成员变量才是各自独立的,你说的那个 $this->ff = 44; 这只是给 a 类的一个实例对象的 ff 变量赋值,并不是运行什么函数,所以并不存在“在哪里运行”这种问题。

至于类的成员函数,你可以把类的成员函数改写成这样,就容易理解了:

````
public function cc ($this) { <--- 注意这个$this 是调用 cc 函数的时候作为参数传进来的
$this->ff = 44;
echo $this->ff;
var_dump($this);
}
````
Wenco
2020-05-14 09:08:33 +08:00
parent::cc();
你这代码运行起来没问题吗?非静态方法可以这样用?
sy5587
2020-05-14 09:32:14 +08:00
@ben1024 =>是调用的意思吗
sy5587
2020-05-14 09:40:23 +08:00
@GM 不好意思,太笨,还是有点模糊,你的意思是不是把两个类看成一个类
sy5587
2020-05-14 09:57:49 +08:00
@GM 你写的那个代码是放在子类里的吗,$this 是调用 cc 函数作为参数,是把子类传进去?晕了。。。。。。
GM
2020-05-14 10:09:02 +08:00
@Wenco 可以的,其实就跟 java 里的 super.cc() 一样,只要 cc 不是 private,子类就可以调用。
sy5587
2020-05-14 10:11:22 +08:00
既然$this 指的是子类,$this->ff 不是应该是子类的 ff 吗,子类没有 ff,父类有个 ff 子类又无法获取,那$this->ff 的时候$this 到底是父类还是子类,难道是动态的、我要崩溃了。。。。。。。。。。。。。
sy5587
2020-05-14 10:13:18 +08:00
@GM 大哥没学过 java,刚开始学 php,到这里卡住了
sy5587
2020-05-14 10:14:45 +08:00
既然$this 指的是子类,$this->ff 不是应该是子类的 ff 吗,子类没有 ff,父类有个 ff 子类又无法获取,那$this->ff=44 的时候$this 到底是父类还是子类,难道是动态的、我要崩溃了。。。。。。。。。。。。。
lxrmido
2020-05-14 10:36:51 +08:00
https://www.php.net/manual/zh/language.oop5.visibility.php

ff 是 private 的,只有在它自己的上下文里能被访问
GM
2020-05-14 10:41:20 +08:00
@sy5587 开了个新帖回答你问题,希望对你有帮助。

https://www.v2ex.com/t/671509
Bule
2020-05-14 10:47:39 +08:00
你还是走吧
sayitagain
2020-05-14 10:49:27 +08:00
1.都是 public 会被继承和复写
2.都是私有会出现两属性
private 'ff' => string 'bbb'
private 'ff' (a) => string 'aaa'
3.私有不能被继承

印象中是这样,不过我不太写类
Wenco
2020-05-17 11:42:50 +08:00
@GM 是我才疏学浅了,一直以为静态方法才能这样写的。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/671368

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX