如何在OOP PHP中使用数组参数覆盖超类构造函数

时间:2014-01-27 04:47:01

标签: php arrays oop override

你好,我在OOP PHP中遇到了问题。 我尝试使用数组参数覆盖超类中的构造函数到子类。 这是我的超类代码:

    <?php
        class Person 
        {

            private $firstName;
            private $lastName;
            private $gender;
            private $dob;
            private $address;
            private $country;
            private $phone;
            private $occupation;

            public function __construct($array) {
                foreach($array as $key => $value) {
                    $this->$key = $value;
                }
            }


                public function setFirstName($firstName) {
                    $this->firstName = $firstName;
                }

                public function getFirstName() {
                    return $this->firstName;
                }
            // Another Getter and Setter
            // ...

这是我的子类代码:

<?php

    class Register extends Person
    {

        private $nickName;
        private $email;

        public function __construct($array) {
            parent::__construct($array);
        }

        // Getter and Setter
        // ...

但是当我尝试访问nickName和电子邮件时,我收到如下错误:

Fatal error: Cannot access private property Register::$email in C:\xampp\htdocs\php\oop\class\person.class.php on line 16

这是我的测试代码:

<?php
    function __autoload($myClass) {
        require_once 'class/' . $myClass . '.class.php';
    }

    $data = array(
        'firstname'     => $_POST['first_name'],
        'lastname'      => $_POST['last_name'],
        'nickname'      => $_POST['nick_name'],
        'gender'        => $_POST['gender'],
        'dob'           => $_POST['dob'],
        'address'       => $_POST['address'],
        'zipcode'       => $_POST['zipcode'],
        'country'       => $_POST['country'],
        'phone_number'  => $_POST['phone_number'],
        'email'         => $_POST['email'],
        'occupation'    => $_POST['occupation']
    );


    $account = new Register($data);
    echo $account->getFirstName();

    // Proses DB
    // $db->insert($account);

?>

任何Sugesstion? 谢谢。

答案:

我已经找到了解决方案。数组中的键名必须与class属性相同。 在数组中我写firstname和属性firstName,数组和属性中的正确方法是firstName

2 个答案:

答案 0 :(得分:1)

一个选项是创建私有属性protected,以便可以从父方法访问它们。

另一种选择是在子类构造函数中初始化子类的属性,并从数组中删除这些条目:

class Register extends Person
{

    private $nickName;
    private $email;

    public function __construct($array) {
        if (isset($array(['nickName'])) {
            $this->nickName = $array['nickName'];
            unset $array(['nickName'];
        }
        if (isset($array(['email'])) {
            $this->email = $array['email'];
            unset $array(['email'];
        }
        parent::__construct($array);
    }

答案 1 :(得分:1)

PHP中的how visibility works。如果您想访问子类中的属性,则必须是publicprotected

private属性在定义它的类中可见。