为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建一个只继承方法而不继承父类属性的子类?

如何创建一个只继承方法而不继承父类属性的子类?

PHP
米琪卡哇伊 2021-10-15 17:47:43
假设我有这个代码:首先我创建了父级 class Country {  public $country;  public $populationcountry;  public $language;     使用一些方法(与此问题无关)public function function1() {   }public function function2() {    }             .             .                }  //end of parent class然后我创建了孩子 Class city extends Country {public $populationcity;} 然后我创建对象(对于这个例子,我只创建了一个)$city1 = new city();$city1->populationcity = 10000; 和一组对象$cities = [$city1];    最后我只想“回显”孩子的属性(人口城市)foreach ($cities as $city) {foreach ($city as $k => $v) {$city->populationcity;echo $k . ': ' . $v . '<br>'; }}   输出:人口城市:10000国家:人口国家:语言:我想保留父级的方法,而不是父级的属性。我怎样才能做到这一点?David 在评论中告诉我将属性设置为 Private。我这样做了,并且工作正常,但是当我创建 Country 对象时,它会在子类中打印父类的属性。这是代码,当父属性为 Public 时,它为我提供此输出。人口城市:10000国家:人口国家:语言:国家:英格兰人口国家:30000语言:英语它应该打印:人口城市:10000国家:英格兰人口国家:30000语言:英语当我将它们设置为 Private 时,我得到了这个:致命错误:未捕获错误:无法访问 C:\xampp\htdocs\ejercicios.php:141 中的私有属性 Country::$language 堆栈跟踪:#0 {main} 抛出在 C:\xampp\htdocs\ejercicios.php 中141当我将它们设置为 Protected 时,我得到了这个:致命错误:未捕获的错误:无法访问 C:\xampp\htdocs\ejercicios.php:141 中的受保护属性 Country::$language 堆栈跟踪:#0 {main} 抛出在 C:\xampp\htdocs\ejercicios.php 141
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

看起来像一个糟糕的设计模式。对我来说,一个国家可以包含几个不同的城市。因此,城市不是国家。你的国家实体类不应该是这样的吗?


class Country

{

    /**

     * Collection of City objects

     * @var ArrayObject

     */

    protected $cities;

    protected $name;

    protected $population;

    protected $language;


    public function setCity(City $city) : self

    {

        if ($this->cities == null) {

            $this->cities = new ArrayObject();

        }


        $this->cities->append($city);

        return $this;

    }


    public function getCities() : ArrayObject

    {

        if ($this->cities == null) {

            $this->cities = new ArrayObject();

        }


        return $this->cities;

    }

}

无论如何......让我们用php自己的反射类来解决您的问题。要获取声明类的属性,只需在城市类中实现以下功能即可。


class City extends Country

{

    public $populationCity;


    public function getData() : array

    {

        $data = [];

        $reflection = new ReflectionClass($this);

        $properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);


        foreach ($properties as $property) {

            if ($property->getDeclaringClass() == $reflection) {

                $data[$property->getName()] = $property->getValue($this);

            }

        }


        return $data;

    }

}

有了这个,您只能获取City类的属性。让我们试一试...


$city = new City();

$city->populationCity = 10000;


var_dump($city->getData());

希望这可以帮助。


查看完整回答
反对 回复 2021-10-15
  • 2 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信