关于php:继承是指从父级复制到子级还是子级获得对父级可见成员的访问权限?

Is Inheritance means copy from parent to child or the child gain access to the parent visible members?

本问题已经有最佳答案,请猛点这里访问。

接受我作为OOP初学者的道歉,根据以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Class Test{

   private $name ="youhana";

   function setPrivatePropFromInside(){
      $this->name ="mina";
   }

   function getPrivate(){
      var_dump(__CLASS__);
      echo   $this->name ;
   }

}

Class Test2 extends Test {

}


$obj2 = new Test2();

$obj2->getPrivate();

我的问题是,继承意味着从父级复制到子级,还是子级获得对父级可见成员的访问权?

让我通过与两个问题成员提到我的想法来描述我为什么会感到困惑:

  • 如果它是一个副本,那么从子对象调用getprivate方法必须返回空值,因为私有成员不会从父对象复制到子对象,并且类常量必须返回test2 not test,以防继承意味着复制。
  • 所以上面提到的代码等于:

    1
    2
    3
    4
    5
    6
    7
    8
    Class Test{

    private $name ="youhana";

    function getPrivate(){
        var_dump(__CLASS__);
        echo   $this->name ;
    }

    }

    1
    2
    3
    4
    5
    6
    Class Test2 extends Test {
       function getPrivate(){
            var_dump(__CLASS__);
            echo   $this->name ;
        }
    }
  • 如果继承意味着获得对父级可见成员的访问权,那么它并不引用或指向继承的概念(子级获得父级的特征),尽管这个概念在逻辑上与执行上述代码段时的结果是正确的。
  • 我读了20多篇参考文献,仍然感到困惑,再次接受我作为初学者寻找正确方法的道歉。

    注意:我在这里问了一个问题,但是在研究了更多的参考资料之后,我又回到了困惑中,所以我需要一个可靠的答案。


    这与"复制"无关……类定义方法和属性,以及指示从何处可以访问这些方法和属性的可见性。

    当一个类扩展另一个类时,您将创建继承层次结构或树,或一组类上下文。

    当您实例化一个子类时,实际上是在实例化继承该完整树的对象。

    当您针对该实例调用一个方法时,它会查看子类定义中是否存在(并且可以访问)该方法。如果是,它将在该上下文中执行:如果不是,它将查看父类中是否存在该方法;如果是,它将在该上下文中执行该方法。

    当方法在类扩展层次结构中的特定上下文中执行时,它可以访问该上下文中可见的所有内容。私有属性只能在定义它们的上下文/定义它们的类中访问;但是该上下文/类中的方法可以访问这些私有属性。

    如果(在本例中)公共getter和setter与private属性位于同一类/上下文中,那么这些方法可以访问private属性(因为它们位于同一类/上下文中),并且可以从该上下文之外访问它,因为getter/setter本身是公共的。


    Is Inheritance means copy from parent to child or the child gain
    access to the parent visible members?

    子类可以访问父类的可见成员。此外,您还可以灵活地重写父类的特性(方法)。


    我认为你的困惑来自于

    1
    private $name ="youhana";

    是类声明中存在的静态值。在任何情况下,这只是在构造函数中声明变量值的一个简写,因此即使从父级继承"copy"也是一个错误的示例。您应该问的是:静态属性是从父级复制的吗?静态属性存在于类声明中,并且该类的所有对象都可以看到任何修改。关于静态属性的PHP文档答案是"否"。只传递对父级值的引用。我写了一个简单的例子来说明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
    class Foo
    {
        public static $my_static = 'foo';

        public function staticValue() {

            return self::$my_static;
        }

        public function modifyFooStatic(){
            return self::$my_static .= '+';
        }
    }

    class Bar extends Foo
    {
        public function fooStatic() {
            return self::$my_static;
        }
        public function modifyBarStatic(){
            return self::$my_static .= '-';
        }
    }

    $foo = new Foo();
    $foo->modifyFooStatic();
    print $foo->staticValue() ."
    "
    ; // foo+


    $bar = new Bar();
    $bar->modifyBarStatic();
    print $bar->fooStatic() ."
    "
    ; // foo+-
    ?>

    正如您所看到的,即使子变量使用sellf::$my_static调用,子变量和父变量也会修改相同的变量。