OO PHP类方法重命名为变量?

时间:2010-08-03 21:44:11

标签: php oop class codeigniter

我有点处于一种奇怪的境地......其中一个我从未进入过(这可能是由于我从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,我还在其他库中包含了类/接口,所以对象没有理由不知道它应该如何渲染。

1 个答案:

答案 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()));

但这可能不是你真正想要的方法。当你在类的构造函数中设置属性时,为什么不转义属性?或者在将它们传递给全班之前逃避它们?将它们拉出课堂,逃离它们然后将它们推回去是没有意义的。

希望这些东西有所帮助。