【问题标题】:PHP member data lost when abstract method returns抽象方法返回时PHP成员数据丢失
【发布时间】:2012-05-11 08:30:09
【问题描述】:

这是一个抽象类和派生类的例子。在类 A 中有一个抽象方法“collectData”,它在类 B 中实现。当调用方法“getData”时,会调用“collectData”,在私有成员变量“$data”中设置值。之后,getData 返回此变量的内容。如果你运行它,你会期望返回值是 array(1, 2, 3)。但它是一个空数组。为什么?顺便说一句,我使用的是 PHP 5.3.10。

<?php

abstract class A
{
    private $data;

    public function __construct()
    {
        $this->data = array();  
    }

    abstract protected function collectData();

    public function getData()
    {
        $this->collectData();
        return $this->data;
    }
}

class B extends A
{
    protected function collectData()
    {
        $this->data = array(1, 2, 3);
    }
}

$test = new B();
$data = $test->getData();
print_r($data);

【问题讨论】:

    标签: php class abstract


    【解决方案1】:

    它不应该是:

    private $data;
    

    但是:

    protected $data;
    

    派生后私有属性不可见。

    【讨论】:

    • 该死,这么简单的疏忽。谢谢。
    【解决方案2】:

    $data 属性设为publicprotected,您将看到...

    如果属性是私有的,print_r 看不到它...或调用 var_dump($data) - 这也应该打印出私有成员...

    【讨论】:

      【解决方案3】:

      在抽象类中放置一个 setter 和一个 getter 来管理数据属性

      public function setData($data){
         $this->data = $data;
      }
      
      public function getData($data){
         return $this->data;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多