【问题标题】:Class inheritance and instances interaction类继承和实例交互
【发布时间】:2023-04-09 01:09:01
【问题描述】:

我有 2 个类继承自 father 类。 “父亲”类有一个 protected 变量,它被填充到两个 child 类中,每个类都使用不同的数据库信息填充它。

我的问题是,当我创建两个类的实例时,第二个实例会更改第一个实例的值。

代码如下:

class User
{
    //array with the MySQL Server details//
    private $serverInfoArray = array("host" => HOST, "user" => USER, "pass" => PASS);

    protected $data; //This will be populated with data in both of the "child" classes.

    //some database connection functions....//

    public function setData(){} //implemented on "child" classess

    public function getData(){} //implemented on "child" classess

}

这是child 类之一:

class Producer extends User
{

    function __construct($id)
    {
        $this->setData($id);  
    }

    public function setData($id)
    {
        global $serverInfoArray, $data;
        $connectionFB;

        $query = "MY FIRST QUERY"; //IN THE SECOND CHILD CLASS 
                                   //IT HAS DIFFERENT QUERY

        $result = mysql_query($query, $connectionFB);

        $i=0;

        while($row = mysql_fetch_array($result))
        {
            $data[$i] = $row;
            $i++;
        }     
    }

    public function getData()
    {
        global $data;
        return $data;    
    } 
}

第二个类具有相同的结构,但名称和正在执行的查询不同。它的声明是class Account extends User

当我创建 2 个实例时:

$producer = new Producer($_SESSION['PRODUCER_ID']); 
$account = new Account($_SESSION['ACCOUNT_ID']);

然后这样做:

  var_dump($producer->getData());

我得到了第二个查询填充的$data 的值。如果我不创建 account 实例,它将返回第一类中填充的值。

为什么account 实例会从producer 类实例中更改$data 的值,如何将它们分开?

谢谢。

【问题讨论】:

  • 您开始提出有关受保护类变量的问题,但实际方法不使用它们。没有帮助 ;) - 为什么不在父类/基类中执行实际的 mysql 查询?

标签: php oop class variables scope


【解决方案1】:
  1. 删除以下行:

    global $serverInfoArray, $data;
    
  2. 使用$this->serverInfoArray & $this->data 访问类变量。

【讨论】:

  • 谢谢,我确实知道$this 的用法,但是因为我在访问类变量时输入错误($this->$data 而不是$this->data)我遇到了问题并开始松动有了全局定义......现在一切都很好,我又重新整理了一下思路,谢谢:)
【解决方案2】:

$data 不是全局变量,那你为什么要使用global 呢?

你应该使用$this->data$this->serverInfoArray

【讨论】:

  • 我尝试使用它,但它没有用结果填充数组
  • 你也应该使用 $this->serverInfoArray
  • @Alon_A 你应该在引用类变量时始终使用 $this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2017-10-21
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多