在父PHP类上调用子类方法

xienkqul  于 2023-02-28  发布在  PHP
关注(0)|答案(2)|浏览(211)

我有两个PHP类,彼此相关,而不是使用__construct,我尝试使用扩展来合并这两个类。但为什么子类方法不能从父类调用?没有任何结果或错误显示,但警告达到内存限制。
下面是我示例代码:

<?php
class Me
{

    public $you;

    public function __construct()
    {
        $this->you = new You;
    }

    public function Hi()
    {
        return 'Hi You';
    }

    public function WhatYouSaid()
    {
        return $this->you->Me();
    }

}

class You extends Me
{

    public function Me()
    {
        return 'Yes Me';
    }
}

$talk = new You;
print_r($talk->WhatYouSaid());

https://onlinephp.io/c/3d84d
我收到错误:
致命错误:已耗尽允许的xxx字节内存大小(尝试分配xx字节)
根据@奈杰尔Ren的回答,我找到了另一个例子:

<?php
 class DataValidate {

    public $data;   

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

public  function inputValidate($newData)
    {
        // verifying
        if ($this->data->get_data($newData['Identifier'], 'nameId'))
        {
            return false; // alredy exists
        }
        return $newData;
    }
    
}



class Data {

    public $db; 
    public $validate;

  public function __construct() {
     $this->db = new Database;
     $this->validate = new DataValidate; 
  } 

public  function get_data($identifier, $col)
        {
            return $this->db->select($identifier, $col='*');
        }
        
public  function inputValidate($newData)
{
    
    return $this->validate->inputValidate($newData);
}
}


$data = new Data;
print_r($data->inputValidate($some_id));
7kqas0il

7kqas0il1#

每当你创建一个新的对象或类型You时,这将调用Me中的构造函数,然后创建一个类型为You的新对象,这将调用Me中的构造函数...
因此,当它创建大量新对象时,您很快就会耗尽内存。
还有一种情况是使用不同的方法名,我假设你的意思是两个输出方法使用相同的名称,你通常不会在子类中引入一个新的方法。
所以这段代码只是调用当前对象上的方法,而不是创建一个新对象来使用...

class Me {
    public  function Hi()
    {
        return 'Hi You';
    }

    public  function WhatYouSaid()
    {
        return $this->Hi();
    }   
    
}

class You extends Me{

    public  function Hi()
    {
        return 'Yes Me';
    }
}

$talk = new You;
print_r($talk->WhatYouSaid());

编辑:如果你只是想从另一个类调用一个方法,那么使用extend对你一点帮助都没有,它只需要是一个类,有一个public方法可以让你调用。
然后创建Me而不是You的示例,并调用...

class Me
{
    public $you;

    public function __construct()
    {
        $this->you = new You;
    }

    public function Hi()
    {
        return 'Hi You';
    }

    public function WhatYouSaid()
    {
        return $this->you->Me();
    }
}

class You
{
    public function Me()
    {
        return 'Yes Me';
    }
}

$talk = new Me;
print_r($talk->WhatYouSaid());
ccrfmcuu

ccrfmcuu2#

实际上问题在于,每次你试图创建一个Me对象时,它都会示例化一个You对象(正如你在Me的构造函数中所设置的)。
YouextendMe时,当你示例化一个You对象时,它从执行Me构造函数中的代码开始,所以你进入了一个不停的循环,然后你耗尽了内存。

相关问题