php – 如何在我尝试访问静态属性时确保构造函数已执行?

我有一个用户详细信息的课程.
我想从我的应用程序中调用例如UserDetails :: $email,但它是空的,因为它不执行构造函数.我该怎么解决这个问题?

<?PHP

class UserDetails {

    public static $email;
    private $password;
    public static $role;
    public static $active;

    public function __construct() {
        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) {
            $this->email = $auth->getIdentity()->email;
            $this->password = $auth->getIdentity()->password;
            $this->role = $auth->getIdentity()->role;
            $this->active = $auth->getIdentity()->active;
        }
    }

}

解决方法:

我想你应该阅读OOP基础知识.你的班级有一些重大错误.

首先,您的构造函数不会设置$email,$role或$active.您将这些字段声明为静态.静态字段只能从静态上下文访问.构造函数不是静态上下文.

如果你想要那些字段是静态的 – 你没有 – 你可以从这样的静态方法设置它们:

public static function setEmail($email)
{
    self::$email = $email;
}

这些字段没有理由是静态的.每个$email,$role和$active都绑定到绑定到UserDetails类的特定实例的特定用户.

最后,这些领域不应该是公开的.公共字段可以直接从课外访问.这意味着任何人都可以随时从任何脚本更改公共字段的值.您应该将字段设为私有或受保护,并通过公共getter方法访问它们.

以下是此类的基本存根可能如下所示的示例:

<?PHP

class user {

    private $firstName;
    private $lastName;
    private $email;
    private $password;
    private $role;


    public function __construct($firstName, $lastName, $email, $password, $role)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->email = $email;
        $this->password = $password;
        $this->role = $role;
    }


    public function getFirstName()
    {
        return $this->firstName;
    }


    public function getLastName()
    {
        return $this->lastName;
    }

    public function getEmail()
    {
        return $this->email;
    }


    public function getRole()
    {
        return $this->role;
    }


}

你会像这样使用这个类:

你会像这样使用它:

$don_draper = new user('Donald', 'Draper, 'dondraper@gmail.com', '123xYz', 'admin');

$email = $don_draper->getEmail();

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...