OO PHP Class метод переименован в переменные? - PullRequest
0 голосов
/ 04 августа 2010

Я вроде как в странной ситуации ... Одна из которых я никогда не сталкивалась раньше (возможно, из-за моего перехода от 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;
        }
    }

?>

Теперь ничего интересного пока нет ... Однако, когда у этого есть значения в etc ... нужно подумать, что использование этого класса в другом месте будет простым ... DOHHH ну, это не

Вот где он используется:

<code><?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 '
';вернуть;$ 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] как $ 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 Ответ

4 голосов
/ 04 августа 2010

Помните, что у вашего класса есть свойства , и у него есть методы получения . Свойства - это закрытые переменные, объявленные в верхней части класса, например, private $_username;, а получатели - методы, объявленные ниже, например, public function Username(). Получатель Username() возвращает значение свойства $_username.

Во-первых, это наименование довольно нестандартное. По крайней мере, я бы назвал свои геттеры как getUsername() или getPassword(). Это может помочь вам понять вашу проблему, проведя различие между геттерами и свойствами.

Когда вы используете print_r() для объекта, он печатает текущее состояние объекта. Текущее состояние объекта определяется типом объекта и значениями его свойств. Как вы видите, в вашем выводе print_r() говорится, что это объект User с 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(), если вы изменили соглашение об именах. Помните, что это функции, поэтому их нужно вызывать, помещая скобки после имени функции. Это функции, которые возвращают значения изнутри объекта.

А потом вы пытаетесь установить значения внутри объекта неправильно. Для этого вам нужно создать несколько методов установки, например setUsername(). Таким образом, эти строки станут:

$user->setUsername($this->db->escape($user->getUsername()));
$user->setPassword($this->db->escape($user->getPassword()));
$user->setEmail($this->db->escape($user->getEmail()));

Но это, вероятно, не тот подход, который вы действительно хотите использовать. Почему бы вам не экранировать свойства, когда вы устанавливаете их в конструкторе класса? Или избежать их, прежде чем передать их в класс? На самом деле не имеет смысла вытаскивать их из класса, убегать от них, а затем отталкивать их обратно.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...