我有点处于一种奇怪的境地......其中一个我从未进入过(这可能是由于我从PHP到.Net的突破)。使用框架CodeIgniter。
这就是情况......我有一个User类,它充当包含用户名/密码/电子邮件等的用户对象......(如下所示):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
include_once(APPPATH . INTERFACE_PATH . 'IUser' . EXT);
include_once(APPPATH . CLASS_PATH . 'Encryption' . EXT);
final class User extends Encryption implements IUser
{
private $_username;
private $_password;
private $_email;
public function SetUserData(StdClass $data)
{
$this->_username = $data->Username;
$this->_password = self::EncryptPassword($data->Password);
$this->_email = $data->Email;
}
public function Username()
{
return (string)$this->_username;
}
public function Password()
{
return (string)$this->_password;
}
public function Email()
{
return (string)$this->_email;
}
}
?>
现在到目前为止还没什么令人兴奋的...但是一旦这个值有了等等......人们应该认为在其他地方使用这个类很简单... DOHHH 它不是 p>
以下是使用它的地方:
<?php
#some class/methods up here...
public function AddNewUser(User $user) #here is where it's passed in...
{
print '<pre>';
print_r($user); # my output of this is shown in email.
print '</pre>';
return;
$user->Username = $this->db->escape($user->Username);
$user->Password = $this->db->escape($user->Password);
$user->Email = $this->db->escape($user->Email);
$sql = 'CALL sp_RegisterUser(' . $user->Username . ', ' .
$user->Password . ', ' . $user->Email . ', '
. (int)((isset($user->RefId) && is_numeric($user->RefId))
? $user->RefId : 0) . ', @usersId);';
$query = $this->db->query($sql);
if($query)
{
$sql = "SELECT @usersId;";
$query = $this->db->query($sql);
if($query->num_rows())
{
$sqlData = $query->result();
$query->free_result();
foreach($sqlData[0] as $k => $v)
{
$array[$k] = $v;
}
return (int)$array['@usersId'];
}
}
}
}
现在print_r输出以下内容:
User Object
(
[_username:private] => joebloggs
[_password:private] => m/SzYRxTF29cZJqk/B/2sg==
[_email:private] => joebloggs@msn.com
)
为什么这些方法现在称为返回的变量,但它们的值是什么?
PS,我还在其他库中包含了类/接口,所以对象没有理由不知道它应该如何渲染。
答案 0 :(得分:4)
请记住,您的班级有属性,并且它有一些 getter方法。属性是在类顶部声明的私有变量,例如private $_username;
,而getter是下面声明的方法,例如public function Username()
。 getter Username()
返回属性$_username
的值。
首先,这个命名非常不标准。至少,我为吸气者命名的方式就像getUsername()
或getPassword()
。这可能会通过区分getter和属性来帮助您理解您的问题。
在对象上使用print_r()
时,它会打印对象的当前状态。对象的当前状态由对象的类型及其属性的值定义。如您所见,在print_r()
输出中,它表示它是一个具有3个私有属性的用户对象,_username,_ password和_email。这是正确的,它具有与之关联的正确值。 print_r()
正在做它应该做的事情。
但接下来代码的问题是你如何尝试访问这些属性。让我们来看看这些行:
$user->Username = $this->db->escape($user->Username);
$user->Password = $this->db->escape($user->Password);
$user->Email = $this->db->escape($user->Email);
这是不对的。首先,如果您更改了命名约定,要从用户获取属性,您将使用:$user->Username()
或$user->getUsername()
。请记住,这些是函数,因此必须通过在函数名称后面放置括号来调用它们。它们是从对象内部返回值的函数。
然后你试图错误地设置对象内的值。为此,您需要创建一些setter方法,例如setUsername()
。所以那些线将成为:
$user->setUsername($this->db->escape($user->getUsername()));
$user->setPassword($this->db->escape($user->getPassword()));
$user->setEmail($this->db->escape($user->getEmail()));
但这可能不是你真正想要的方法。当你在类的构造函数中设置属性时,为什么不转义属性?或者在将它们传递给全班之前逃避它们?将它们拉出课堂,逃离它们然后将它们推回去是没有意义的。
希望这些东西有所帮助。