【问题标题】:Class inheritance problem in PHPPHP中的类继承问题
【发布时间】:2011-10-11 14:37:22
【问题描述】:

你好 stackOverflow 家族:),

我有一个问题,但我没有在其他地方找到答案。我试图解释我的问题: 我有一个类,如果我从中创建另一个类,则从该子类中我无法访问父类的属性。 我做错事情了? 我尝试将我的类变量复制到本地并尝试返回该本地变量,但以下 3 种方式均无效。

这是我的例子。 一开始我只是简单地创建一个对象:

$test = new test();

我的两个班级如下:

class test {

    public $testvar;

    public function __construct() {
        $this->testvar = 1234568;
        echo ":) ".$this->testvar();
        $test2 = new test2();
}

    public function testvar() {
        echo "testvar() called > ";
        return $this->testvar;
    }
}

和测试2:

class test2 extends test  {

    public function __construct() {
        echo "<br>:| this-> ".$this->testvar;
        echo "<br>:| parent:: ". parent::testvar();
        echo "<br>:| "; $this->testvar();
    }

}

有人有什么想法吗? 谢谢

【问题讨论】:

    标签: php class inheritance properties extends


    【解决方案1】:

    您误解了继承的概念。在test的构造函数中实例化test2不是继承。

    test 的构造函数未被调用,因此testvar 未被设置。从test 的构造函数中删除$test2 = new test2();。试试:

    class test {
    
        public $testvar;
    
        public function __construct() {
            $this->testvar = 1234568;
            echo ":) ".$this->testvar();
    }
    
        public function testvar() {
            echo "testvar() called > ";
            return $this->testvar;
        }
    }
    
    class test2 extends test  {
    
        public function __construct() {
            parent::__construct();
            echo "<br>:| this-> ".$this->testvar;
            echo "<br>:| "; $this->testvar();
        }
    
    }
    
    $test2 = new test2();
    

    另请参阅PHP manual on constructors(以及classes)。

    【讨论】:

      【解决方案2】:

      我猜,如果您在 test 的构造函数中实例化 test2,这并不意味着测试 2 在您创建的上下文中实例化,这意味着:您设置的变量不可用于 test2 :) ...我绝对不应该成为技术专家:-D

      test2 应该类似于:

      class test2 extends test  {
      
      public function __construct() {
          parent::__construct();
          echo "<br>:| this-> ".$this->testvar;
          echo "<br>:| parent:: ". parent::testvar();
          echo "<br>:| "; $this->testvar();
        }
      }
      

      和测试构造函数:

      public function __construct() {
          $this->testvar = 1234568;
          echo ":) ".$this->testvar();
      }
      

      然后你在这些类之外调用 new test2()!

      【讨论】:

      • 我真的误解了这一点。测试类效果更好,但是我必须在哪里实例化 test2?如果我不这样做,test2 对象就不会是。但是如果我在构造函数中实现它,就会变成一个 ifinity 循环。
      • @szatti1489 所以你有Test和Test2类。创建一个新的 php 文件,例如testing.php,包括 Test.php 和 Test2.php (或其他任何名称),然后简单地实例化 test2: $test2 = new $test2(); - 当你现在打开 testing.php 时,它应该输出 '1234568' ;)
      • 是的,但我的项目是:test2 动态实例化。测试是从数据库中查询数据,并从自身实例化表数据所需的子类。我必须从这个新类访问父属性。
      • 如果我猜对了:您在父类 (Test) 中提取数据库数据,但需要 Test2 来处理数据?您永远不应该直接实例化父类!父类通过调用 parent::__construct(); 在子类中隐式实例化; (不只是通过调用它,而是你明白了......) - 那么,你在父类的构造函数中设置的所有属性也可以从子类中访问。
      • 是的,就像你说的那样。我从 Test 中查询 DB 数据,它从 DB 中读取名称 Test2 并实例化一个对象 $test2。从 $test2 我喜欢使用 Test 的属性。我想,我必须创建第三个类,它实例化 Test,然后读取 DB 并在需要时实例化 Test2。
      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2010-10-30
      相关资源
      最近更新 更多