V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sy5587
V2EX  ›  PHP

PHP 继承问题

  •  
  •   sy5587 · 2020-05-13 20:11:06 +08:00 · 3114 次点击
    这是一个创建于 1646 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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;这句代码执行的时候到底是在父类执行的还是在子类执行的啊,要是在父类,返回的对象为什么又是子类的对象,应该怎么理解

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

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

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

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

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

    印象中是这样,不过我不太写类
    Wenco
        19
    Wenco  
       2020-05-17 11:42:50 +08:00
    @GM 是我才疏学浅了,一直以为静态方法才能这样写的。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1060 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:20 · PVG 06:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.