你好,我在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
。
答案 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。如果您想访问子类中的属性,则必须是public
或protected
。
private
属性仅在定义它的类中可见。