【问题标题】:PHP Accessing Parent Class VariablePHP访问父类变量
【发布时间】:2011-09-21 08:46:37
【问题描述】:
class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo parent::$bb; //Fatal error: Undefined class constant 'bb' 
    }
}

$test = new B($some);
$test->childfunction();

问题: 如何在孩子中显示父变量? 预期结果将回显“父 bb”

【问题讨论】:

    标签: php class variables parent


    【解决方案1】:
    echo $this->bb;
    

    变量是继承的,不是私有的,所以是当前对象的一部分。


    以下是应您要求提供有关使用parent:: 的更多信息的补充信息:

    当您希望从父类中为方法添加额外功能时,请使用parent::。例如,想象一个Airplane 类:

    class Airplane {
        private $pilot;
    
        public function __construct( $pilot ) {
            $this->pilot = $pilot;
        }
    }
    

    现在假设我们要创建一种新型飞机,它也有一个导航器。您可以扩展 __construct() 方法来添加新功能,但仍然可以使用父级提供的功能:

    class Bomber extends Airplane {
        private $navigator;
    
        public function __construct( $pilot, $navigator ) {
            $this->navigator = $navigator;
    
            parent::__construct( $pilot ); // Assigns $pilot to $this->pilot
        }
    }
    

    通过这种方式,您可以遵循 DRY principle 的开发,但仍然提供您想要的所有功能。

    【讨论】:

    • 也就是说parent关键字只用于访问父方法?
    • 通常,当您想要覆盖父方法但仍引用父方法时,您会使用 parent::。如果你只想调用父类的方法,你可以像处理变量一样:$this->parentmethod()
    【解决方案2】:

    $bb 在扩展 A 类后,现在成为 B 类的成员。

    所以你访问 $bb 就像它是 B 类的属性一样。

    class A {
        private $aa;
        protected $bb = 'parent bb';
    
        function __construct($arg) {
           //do something..
        }
    
        private function parentmethod($arg2) {
           //do something..
        }
    }
    
    class B extends A {
        function __construct($arg) {
            parent::__construct($arg);
        }
        function childfunction() {
            echo $this->bb; 
        }
    }
    
    $test = new B($some);
    $test->childfunction();
    

    【讨论】:

      【解决方案3】:

      因为它是继承的,所以只是回显它

      echo $this->bb;
      

      【讨论】:

      • 只要确保该变量没有被定义为私有。
      • 我无法让它工作。变量是公共的,但变量并没有被继承。
      • 显然不是。我以为会是,但发现它们不会被继承。
      【解决方案4】:

      父类的所有属性和方法都在子类中继承,所以理论上你可以在子类中访问它们,但要注意在你的类中使用protected关键字,因为在子类中使用它会引发致命错误上课。
      php.net 中所述

      属性或方法的可见性 可以通过前缀定义 带有关键字 public 的声明, 受保护的或私有的。班级成员 声明的公共可以访问 到处。宣布受保护的成员 只能在类内访问 本身以及通过继承和父母 类。声明为私有的成员 只能由以下类访问 定义成员。

      【讨论】:

      • protected 在继承类和父类中使用时不会引发错误。
      【解决方案5】:

      使用parent::$bb;,您尝试检索使用$bb 的值定义的静态常量。

      改为:

      echo $this->bb;
      

      注意:如果 B 是唯一调用它的类,则不需要调用 parent::_construct。只需不要在 B 类中声明 __construct。

      【讨论】:

        【解决方案6】:
        class A {
            private $aa;
            protected $bb = 'parent bb';
        
            function __construct($arg) {
               //do something..
            }
        
            private function parentmethod($arg2) {
               //do something..
            }
        }
        
        class B extends A {
            function __construct($arg) {
                parent::__construct($arg);
            }
            function childfunction() {
                echo parent::$this->bb; //works by M
            }
        }
        
        $test = new B($some);
        $test->childfunction();`
        

        【讨论】:

        • parent::$this->bb 一定是我见过的最疯狂的面向对象语法
        • parent:: in parent::$this->bb 只会让提问的人感到困惑。我建议删除或进一步解释,以降低答案的复杂性。
        • 这不起作用Fatal error: Uncaught Error: Access to undeclared static property: A::$this in /Applications/MAMP/htdocs/native_testing/index.php:24 Stack trace: #0 /Applications/MAMP/htdocs/native_testing/index.php(29): B->childfunction() #1 {main} thrown in /Applications/MAMP/htdocs/native_testing/index.php on line 24
        • 此代码返回Fatal error: Access to undeclared static property: A::$this
        【解决方案7】:
        PHP Accessing Parent Class Protected Variable & Methods
        class A {
            protected $bb = 'parent bb';
            protected function sayHello(){
                echo 'Say Hello';
            }
        }
        
        class B extends A {
            public function childfunction() {
                echo $this->bb.'<br>'; 
                echo $this->sayHello();
            }
        }
        
        $test = new B();
        $test->childfunction();
        

        【讨论】:

        【解决方案8】:

        通过父类构造器,您可以将数据从子类传递给父类。请看下面的示例以更好地理解

        <?php
        
        class Student 
        {
            public $name;
            function __construct($name){
                $this->name = $name;
            }
        }
        
        class Test extends Student
        {
            public $age;
            function __construct($name,$age){
                $this->age = $age;
                parent::__construct($name);
            }
        }
        
        $obj = new Test("sajib khan" ,21);
        echo $obj->name;
        echo $obj->age;
        
        ?>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-13
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          相关资源
          最近更新 更多