在构造函数PHP中访问父类变量

时间:2018-01-07 19:40:56

标签: php oop inheritance

我有以下课程。

class User extends GenericObject {
    private $table='users';
    private $primary_key='id';
}

class Animal extends GenericObject {
    private $table='animals';
    private $primary_key='id';
}

class GenericObject {
    public static function create_from_db($params) {
        $self = new self();
        //Build PDO query here

        //These echo statemtns fail
        echo $self->table;
        echo $self->primary_key;

        return $self;
    }
}

在我想要做的与这些类接口的代码中:

$animal=Animal::create_from_db($params);
$user=User::create_from_db($other_params);

我使用超类的意义是,我不必一遍又一遍地复制create_from_db函数。

我尝试覆盖父类并调用它,但我不确定实现我想要完成的“正确”方法。

任何提示

2 个答案:

答案 0 :(得分:1)

要访问这些变量,您应该修复两件事。使属性"受保护"而不是私有,以便可以从父类访问它们并更改新语句以使用" new static()"因为那将实例化Animal或User类而不是" new self()"因为它实例化了GenericObject类。

class User extends GenericObject {
    protected $table='users';
    protected $primary_key='id';
}

class Animal extends GenericObject {
    protected $table='animals';
    protected $primary_key='id';
}

class GenericObject {
    public static function create_from_db($params=[]) {
        $self = new static();
        //Build PDO query here

        //These echo statements will not fail
        echo $self->table . PHP_EOL;
        echo $self->primary_key . PHP_EOL;

        return $self;
    }
}

答案 1 :(得分:-3)

“我使用超类的意义是,我不必一遍又一遍地复制create_from_db函数。”这是错误的,使用一个特征。在traits中定义的代码可以访问导入它们的类的私有字段。