我正在创建一个带变量的类,如下面的代码所示, 我想访问
$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];
}
}
?>
答案 0 :(得分:2)
在php5中,构造函数不再以类命名。而是像这样定义它:
> cbind(dx,x=x[-(1:k)],rse)
dx x rse
[1,] 0.004472136 0.004472136 0.01
[2,] 0.008944272 0.013416408 0.02
[3,] 0.013416408 0.026832816 0.03
[4,] 0.017888544 0.044721360 0.04
[5,] 0.022360680 0.067082039 0.05
接下来,目前还不清楚你是如何实际设置属性public function __construct($firstName, $lastName, $email)
{
///...
}
...你写的#34;这很麻烦,但它有效&#34;但是我不知道这是怎么回事意思是工作,因为$ userName 在调用$this->userName
后应该是一个数组。保存阵列没有任何意义......
此外:如果您确实在构造函数中定义了属性preg_match()
(这有意义),那么为什么getter方法$this->userName
会重新解析其他属性?相反,普通的getter应该只返回属性值而不需要太多的解释。这应该没问题,因为你想在构造函数中设置值(这可能当前不起作用)。也许这只是以前尝试的遗留物。我只是想提一下,因为它看起来很奇怪......
玩得开心!
答案 1 :(得分:1)
要拒绝直接访问您的类属性,您可以将其定义为private
。通过这样做,像$allen->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
属性没有正确初始化。