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


Undefined property and Undefined index when referencing a class from within another class

我目前正在为客户做一个大型项目,为了帮助简化事情并使会话管理更容易,我制作了一个会话类,这意味着如果我更改管理会话的方式,我可以访问一个文件中的会话结构,而不是访问会话已回显的多个文件(例如用户名或当前页面)

我的类有 3 种类型的函数 setter、getter 和 unsetter,这是不言自明的。

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

以下是我文件的简化版本,显示了我认为相关的代码

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();
        }
    }
}

示例.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()并直接通过$session->get_message() unset_message(),它会按预期工作,但在这种情况下通过另一个函数$operation->display_pending_messages()它会返回上述错误。显然,这与$this->运算符有关,但我不确定该怎么做才能阻止这种情况。我尝试了各种搜索,虽然找到了类似的东西,但在这种情况下没有帮助。

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

提前谢谢。

在类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::调用所有函数,而无需创建对象会话

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

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

等。