【问题标题】:PHP Constructors and extending parent classesPHP 构造函数和扩展父类
【发布时间】:2022-11-24 04:38:16
【问题描述】:

我来自 Java,并希望按照它在 Java 中的工作方式使用子类的构造函数,但它似乎不像在 PHP 中那样工作。子对象的构造函数似乎无法覆盖父对象中构造的实例变量值。在这里,父对象仅用于将扩展它的多个子类之间的通用方法。永远不会单独调用父类。

当我实例化一个新的 TestPackage 时,我只是从父类中获取初始化的错误值。是什么赋予了?

<?php
interface Package{
    public function getCode();
    public function decode($packageCode);
    public function getSetName();
    public function getSetNameLang();
    public function getSubsetType();
    public function getSubsetTypeLang();
    public function setSubsetType($typeCode);
    public function getPackageOptionsArray();
    public function getChoicesArray();
    public function getOptionStatus($index);
    public function setOptionStatus($index, $booleanStatus);
}
?>

父包.php

class ParentPackage implements Package{
    private int $packageCode;
    private int $subsetType;
    private String $setName;
    private String $setNameLang;
    private $packageOptionsArray;
    private $subsetTypeArray;

    public function __construct(){
        $this->packageCode = 0;
        $this->subsetType = 0;
        $this->setName = "Error: parentClass";
        $this->setNameLang = "Error: Parent Class";

        $this->packageOptionsArray = array("Error",   //too much stuff to pass
                                            "Error",  //to a constructor as a variable
                                            "Error",
                                            "Error",
                                            "Error",
                                            "Error",
                                            "Error",
                                            "Error",
                                            "Error",
                                            "Error",
                                            "Error",
                                            "Error",
                                            );
        
        $this->subsetTypeArray = array("Error: Initializer",   //16
                                        "Error: Initializer",  //32
                                        "Error: Initializer",  //48
                                        );

     //........A whole bunch more stuff that is too much to pass as a variable to a constructor
     //..... OR let's just say that I don't want to do it that way

    }

测试包.php

class TestPackage extends ParentPackage{

    public function __construct(){
        parent::__construct();
        $this->packageCode = 0;
        $this->subsetType = 0;
        $this->setName = "layeredarch";
        $this->setNameLang = "Layered Arch";

        $this->packageOptionsArray = array("Customized welcome sign (choice of trellis half arch or smooth half arch insert up to 25 words text)",
                                            "3 piece seating chart half arch set (print service for cards is available for a small additional fee)",
                                            "Table numbers 1-30",
                                            "Gold Card option04 with choice of Gifts & Cards sign",
                                            "5 Reserved signs",
                                            "Up to 2 Double Half Arch Small signs (Gifts & Cards, Take One, Dont Mind if I Do, In Loving Memory)",
                                            "Up to 2 Sunset Small signs (Please Sign Our Guestbook, Gifts & Cards, In Loving Memory)",
                                            "1 Double Half Arch Medium sign (Cheers, The Bar, Guestbook, or Custom Acrylic Text)",
                                            "1 Double Full Arch Medium sign (Signature Drinks, or Custom Acrylic Text)",
                                            "Unplugged Ceremony sign",
                                            "Hairpin Record Player Prop",
                                            "%22Mr & Mrs%22 Custom Head Table Keepsake is a free gift in addition to the items above"
                                            );
        
        $this->subsetTypeArray = array("Full Set",   //16
                                        "Pick Six",  //32
                                        "Pick Four" //48
                                        );

    }

【问题讨论】:

    标签: php constructor


    【解决方案1】:

    private 成员仅是本地成员,即不能通过子类读取/写入它们。中的任何 setter/getter父母类只会从成员那里读/写父母范围。

    如果您将成员访问权限从 private 更改为 protected,它会起作用。

    当子类设置它们时,PHP 不会给出访问错误,因为它使用了 PHP 的“动态声明的成员”功能。

    class ParentPackage implements Package {
        protected int $packageCode;
        protected int $subsetType;
        protected string $setName;
        protected string $setNameLang;
        protected $packageOptionsArray;
        protected $subsetTypeArray;
    ...
    

    不太理想的解决方案

    另一种解决方案是将整个 getter/setter 方法从父类复制到子类中,有效地切换它们访问的成员范围:

    class ParentPackage implements Package {
        private $packageOptionsArray;
        public function getPackageOptionsArray() { return $this->packageOptionsArray; }
    }
    
    class TestPackage extends ParentPackage {
        // Optional, but without this, this property is dynamically created and defaults to 'public'
        private $packageOptionsArray;
        /** Override */
        public function getPackageOptionsArray() { return $this->packageOptionsArray; }
    }
    

    【讨论】:

    • 将其更改为受保护正是我所需要的。它按照我现在想要的方式工作。谢谢!
    猜你喜欢
    • 2011-07-28
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2019-01-07
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多