从另一个类中引用类时,未定义的属性和未定义的索引

时间:2012-05-26 09:46:41

标签: php oop class

我目前正在为一个客户开发一个大型项目,为了简化操作并简化管理会话,我已经创建了一个会话类,这意味着如果我改变管理会话的方式,我可以访问该结构一个文件中的会话而不是一个已回显会话的多个文件(例如用户名或当前页)

我的类有3种类型的函数setter,getters和unsetters,这是一种自我解释。

现在在这个例子中,我直接向会话类设置一条错误消息,然后从另一个类中获取错误消息,该类从其中的会话调用一个函数。

以下是我的文件的简化版本,显示我觉得相关的代码

c_session.php

class session {

    private $instance = 'isntname';
    private $A_user = 'user';
    private $A_page = 'page';
    private $A_message = 'message';

    //Set messages to the session.
    public function set_message($type, $value) {
        $_SESSION[$this->instance][$this->A_message][$type] = $value;
    }

    //Get messages from the session.
    public function get_message() {     
        return $_SESSION[$this->instance][$this->A_message];
    }

    //Unset messages from the session.
    public function unset_message() {
        #unset($_SESSION[$this->instance][$this->A_message]);
    }

}

c_operations.php

class operations {

    //Display all pending messages.
    public function display_pending_messages() {

        if(session::get_message() != null) {
            foreach(session::get_message() as $type => $value) {
                if(strlen($type) != null) {
                    echo '
                        <div class="panel ' . $type . '">
                            ' . $value . '
                            <span class="close" onclick="hide_parent_element(this);">X</span>
                        </div>
                        ';
                }
            }
            session::unset_message();
        }
    }

}

使用example.php

$session->set_message('confirm', 'THIS IS A CONFIRM');
$session->set_message('error', 'THIS IS AN ERROR');
$session->set_message('notice', 'THIS IS A NOTICE');
$session->set_message('warning', 'THIS IS A WARNING');

var_dump($_SESSION);

$operation->display_pending_messages();

收到错误/通知

Notice: Undefined property: operations::$instance in /var/www/_classes/parent_session.php on line 43 
Notice: Undefined property: operations::$A_message in /var/www/_classes/parent_session.php on line 43 
Notice: Undefined index: in /var/www/_classes/parent_session.php on line 43

第43行引用行return $_SESSION[$this->instance][$this->A_message];

现在,如果我直接通过get_message()拨打unset_message()$session->get_message(),它会按预期工作,但在这种情况下通过另一个函数$operation->display_pending_messages()会返回上述错误。显然这与$this->运算符有关,但我不确定该怎么做才能阻止它。我尝试了各种搜索,在找到类似的东西时,在这种情况下没有用。

有人可以解释我哪里出错了以及如何解决这个问题?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您试图静态调用这些函数,但它们是实例方法。例如session::get_message()尝试将static关键字添加到函数中,或者更好地传递实例化的类并使用$session->get_message()调用方法

public function display_pending_messages($session) {

        if($session->get_message() != null) {

答案 1 :(得分:1)

在课程operations中,您将会话称为静态,但所有数据都在对象中。 最好的方法是在静态中存储类会话的所有数据: ` 课堂会议{

private static $instance = 'isntname';
private static $A_user = 'user';
private static $A_page = 'page';
private static $A_message = 'message';

//Set messages to the session.
public static function set_message($type, $value) {
    $_SESSION[self::instance][self::A_message][$type] = $value;
}

//Get messages from the session.
public static function get_message() {     
    return $_SESSION[self::instance][self::A_message];
}

}

因此,您可以在代码中使用session::调用所有函数,而无需创建对象会话