【问题标题】:PHP, how to set class variable value from functionPHP,如何从函数中设置类变量值
【发布时间】:2015-06-13 19:13:18
【问题描述】:

我正在创建一个带变量的类,正如您从下面的代码中看到的那样, 我想访问

$allen = new guest(...); echo $allen->userName;

我必须使用这个

$allen->getUserName();

但是由于创建类后用户名不会改变,有没有办法做到这一点?

<?php 
    class guest {

        var $firstName;
        var $lastName; 
        var $email;
        var $userName;

        function guest($firstName, $lastName, $email) {
            $this->firstName = $firstName; 
            $this->lastName = $lastName; 
            $this->userName = getUserName();  // option 1 
            $this->userName = $this->getUserName(); // option 2

            preg_match('/^.*(?=(@))/i', $this->email, $userName);
            $this->userName = $userName[0];  // this is messy but work


        }
        function getUserName() {
            preg_match('/^.*(?=(@))/i', $this->email, $userName);
            return $userName[0];
        }
    }
?>   

【问题讨论】:

  • 对 PHP 类中的属性使用 var 是对 PHP 4 的回归,只是为了向后兼容而维护.....但建议您使用 public/protected/ private 可见性而不是....但是,由于 var 被视为 publicecho $allen-&gt;username; 完全有效
  • 如果您不想在类实例化后更改 $username,请为您的属性设置适当的可见性
  • 您确定这是您的真实代码,并且有效吗? getUserName() 指的是$userName,而不是$this-&gt;userName
  • no,opt 1 和 opt 2,它不起作用,似乎有冲突 b/c getUserName 函数是在 __construct 之后编写的。 ?

标签: php class constructor


【解决方案1】:

在 php5 中,构造函数不再以类命名。而是这样定义它:

public function __construct($firstName, $lastName, $email) 
{
    ///...
}

接下来,不清楚你是如何实际设置属性$this-&gt;userName...你写“这很乱,但它有效”,但我不明白这是如何工作的,因为 $userName 在调用preg_match() 之后应该是一个数组。而且保存数组没有任何意义……

进一步:如果你真的在构造函数内部定义了属性$this-&gt;userName(这是有道理的),那么为什么getter方法getUserName()会重新解析其他属性?相反,一个普通的 getter 应该只返回属性值而不需要太多解释。这应该没问题,因为您想在构造函数中设置值(这可能当前不起作用)。也许这只是以前尝试的遗留物。我只是想提一下,因为它看起来很奇怪......

玩得开心!

【讨论】:

  • 谢谢,是的,我正在尝试不同的方法来做到这一点,并且让自己感到困惑。我编辑代码,修复数组部分,我想在构造函数内部解释就可以了,而不是每次运行代码,值是需要的。
【解决方案2】:

为了拒绝直接访问您的类属性,您可以将其定义为private。通过这样做,像$allen-&gt;userName 这样的构造将引发错误。这也称为封装。

首先确保你正确地初始化了你的类对象。在 PHP 中,您应该使用 __constructor 函数定义您的构造函数。这是一个例子:

       class Guest {
    protected $lastName;
    protected $email;
    protected $lastName;
    protected $userName;

    public function __construct($firstName, $lastName, $email, $userName){
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->email = $email;
        $this->userName = $userName;
    }
    public function getUsername(){
        return $this->userName;
    }      
}

构造函数接收4个参数$firstName, $lastName, $email, $userName。为了创建此类的对象,您可以执行以下代码:

$allen = new Guest('John', 'Doe', 'some.email@email.com', 'username');

要检索用户名,请编写以下行:

$allen->getUsername();

在您当前的构造函数中有些东西不好,因为我认为您的 userName 属性未正确初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多