Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 继承是指从父级复制到子级,还是子级可以访问父级可见成员?_Php_Oop_Inheritance - Fatal编程技术网

Php 继承是指从父级复制到子级,还是子级可以访问父级可见成员?

Php 继承是指从父级复制到子级,还是子级可以访问父级可见成员?,php,oop,inheritance,Php,Oop,Inheritance,请接受我对OOP初学者的歉意, 根据以下代码: Class Test{ private $name = "youhana"; function setPrivatePropFromInside(){ $this->name = "mina"; } function getPrivate(){ var_dump(__CLASS__); echo $this->name ; } } Class Test2

请接受我对OOP初学者的歉意, 根据以下代码:

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方法必须返回null,因为私有成员不会从父对象复制到子对象,并且如果继承意味着复制,常量必须返回Test2 not TEST
  • 所以上面提到的代码等于:

    Class Test{
    
    private $name = "youhana";
    
    function getPrivate(){
        var_dump(__CLASS__); 
        echo   $this->name ;
    }
    
    }

  • 如果继承意味着获得对父可见成员的访问权,那么它不会引用或指向继承的概念(子元素获得父元素的特征),尽管这个概念在逻辑上是正确的,并且在执行所提到的代码片段时会产生结果
  • 我读了20多篇参考文献,但仍有困惑,再次接受我的道歉,因为我是初学者,正在寻找正确的方法

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

    继承是指从父项复制到子项或子项获得 访问父可见成员的权限

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

    这与“复制”无关。。。。一个类定义了方法和属性以及一个可见性,该可见性指示从何处可以访问这些方法和属性

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

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

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

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


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

    我认为您的困惑来自于这样的想法

    private $name = "youhana";
    
    是存在于类声明中的静态值。在任何情况下,这只是在构造函数中声明变量值的一个简写,所以即使继承“复制”自父项,这也是一个错误的例子来说明这一点。您应该问的是:静态属性是否从父级复制?静态属性存在于类声明中,任何修改对该类的所有对象都是可见的。
    答案是否。只传递对父级值的引用。 我写了一个简单的例子来说明

    <?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() . "\n"; // foo+
    
    
    $bar = new Bar();
    $bar->modifyBarStatic();
    print $bar->fooStatic() . "\n"; // foo+-
    ?>
    
    
    

    正如您所见,即使child使用
    sellf:$my_static

    调用同一变量,child和parent都会修改同一变量。这里的主要问题是私有成员是否实例化,但这里我有继承的概念,我面临一个没有答案的问题,所以我提到了它,我提到了引起混淆的两个要点。我在这里的混淆会让专家们回答得更清楚。你能提供一个强大的教程或书籍来加强PHP中的OOP并做一些练习吗?
    <?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() . "\n"; // foo+
    
    
    $bar = new Bar();
    $bar->modifyBarStatic();
    print $bar->fooStatic() . "\n"; // foo+-
    ?>