Can';在php中不能删除对象属性

Can';在php中不能删除对象属性,php,oop,magic-methods,Php,Oop,Magic Methods,我有以下代码: class Service { public function get_session($token) { foreach ($this->config->sessions as $session) { if ($token == $session->token) { $session->last_access = date('r'); retu

我有以下代码:

class Service {
    public function get_session($token) {
        foreach ($this->config->sessions as $session) {
            if ($token == $session->token) {
                $session->last_access = date('r');
                return $session;
            }
        }
        return null;
    }
    public function mysql_connect($token, $host, $username, $password, $db) {
        if (!$this->valid_token($token)) {
            throw new Exception("Access Denied: Invalid Token");
        }
        // will throw exception if invalid
        $this->mysql_create_connection($host, $username, $password, $db);
        $session = $this->get_session($token);
        $id = uniqid('res_');
        if (!isset($session->mysql)) {
            $session->mysql = new stdClass();
        }
        $mysql = &$session->mysql;
        $mysql->$id = array(
            'host' => $host,
            'user' => $username,
            'pass' => $password,
            'name' => $db
        );
        return $id;
    }
    public function mysql_close($token, $res_id) {
        if (!$this->valid_token($token)) {
            throw new Exception("Access Denied: Invalid Token");
        }
        $session = $this->get_session($token);
        if (!(isset($session->mysql->$res_id))) {
            throw new Exception("Invalid resource id");
        }
        unset($session->mysql->$res_id);
        if (empty((array)$session->mysql)) {
            unset($session->mysql); // this don't work, don't know why
            throw new Exception('isset($session->mysql) == ' .
                                (isset($session->mysql) ? 'true' : 'false'));
        }
    }
}
我调用
unset($session->mysql)
如果它是空的,但对象没有被删除,异常抛出
true
,如何删除
$session->mysql
对象?我曾尝试在get_会话中添加
&
,但没有效果


整个代码都可以找到。

你真的应该在帖子中发布你的会话类,而不是链接到你的GitHub repo。。。这就是为什么评论令人困惑。您正在会话类中使用神奇的方法

我做了一个改变:添加magic\uu unset方法

此外,我认为构造函数需要是公共的,但进一步研究后,我错了(因此,除非构造函数是公共的,否则我的测试代码将无法工作…)

下面是更新类的代码:

<?
class Session {
    public $storage;
    public $token;
    public $username;
    public $browser;
    public $start;
    public $last_access;
    private function __construct($u, $t, $s = null, $b = null, $d = null) {
        $this->storage = $s ? $s : new stdClass();
        $this->username = $u;
        $this->token = $t;
        $this->browser = $b ? $b : $_SERVER['HTTP_USER_AGENT'];
        $this->start = $d ? $d : date('r');
    }
    function &__get($name) {
        return $this->storage->$name;
    }
    function __set($name, $value) {
        $this->storage->$name = $value;
    }
    function __isset($name) {
        return isset($this->storage->$name);
    }
    function __unset($name) {
        echo "Unsetting $name";
        unset($this->storage->$name);
    }
    static function create_sessions($sessions) {
        $result = array();
        foreach ($sessions as $session) {
            $result[] = new Session($session->username,
                                    $session->token,
                                    $session->storage,
                                    $session->browser,
                                    $session->start);
        }
        return $result;
    }
    static function cast($stdClass) {
        $storage = $stdClass->storage ? $stdClass->storage : new stdClass();
        return new Session($stdClass->username,
                           $stdClass->token,
                           $storage,
                           $stdClass->browser,
                           $stdClass->start);
    }
    static function new_session($username) {
        return new Session($username, token());
    }
}
这是添加方法的代码:

function __unset($name) {
    echo "Unsetting $name";
    unset($this->storage->$name);
}
查看文档,了解需要添加到类中的magic _uunset方法:

__在无法访问的属性上使用unset()时,将调用unset()


你真的应该在帖子中发布你的会话类,而不是链接到你的GitHub repo。。。这就是为什么评论令人困惑。您正在会话类中使用神奇的方法

我做了一个改变:添加magic\uu unset方法

此外,我认为构造函数需要是公共的,但进一步研究后,我错了(因此,除非构造函数是公共的,否则我的测试代码将无法工作…)

下面是更新类的代码:

<?
class Session {
    public $storage;
    public $token;
    public $username;
    public $browser;
    public $start;
    public $last_access;
    private function __construct($u, $t, $s = null, $b = null, $d = null) {
        $this->storage = $s ? $s : new stdClass();
        $this->username = $u;
        $this->token = $t;
        $this->browser = $b ? $b : $_SERVER['HTTP_USER_AGENT'];
        $this->start = $d ? $d : date('r');
    }
    function &__get($name) {
        return $this->storage->$name;
    }
    function __set($name, $value) {
        $this->storage->$name = $value;
    }
    function __isset($name) {
        return isset($this->storage->$name);
    }
    function __unset($name) {
        echo "Unsetting $name";
        unset($this->storage->$name);
    }
    static function create_sessions($sessions) {
        $result = array();
        foreach ($sessions as $session) {
            $result[] = new Session($session->username,
                                    $session->token,
                                    $session->storage,
                                    $session->browser,
                                    $session->start);
        }
        return $result;
    }
    static function cast($stdClass) {
        $storage = $stdClass->storage ? $stdClass->storage : new stdClass();
        return new Session($stdClass->username,
                           $stdClass->token,
                           $storage,
                           $stdClass->browser,
                           $stdClass->start);
    }
    static function new_session($username) {
        return new Session($username, token());
    }
}
这是添加方法的代码:

function __unset($name) {
    echo "Unsetting $name";
    unset($this->storage->$name);
}
查看文档,了解需要添加到类中的magic _uunset方法:

__在无法访问的属性上使用unset()时,将调用unset()


unset($session->mysql->$resu id)这是错误的。这可能是问题的一部分,应该是:
unset($session->mysql->res_id)
@dan08它是动态变量
$res\u id
持有真实的变量名,这部分工作。我没有得到这些
函数mysql\u connect($token、$host、$username、$password、$db)
-
mysql\u创建连接($host、$username、$password、$db)
-
mysql\u连接使用3个参数(第4个是其他参数)您似乎试图使用一个名为
mysql\u connect()
的自定义函数,这是一个核心PHP函数(应该会抛出一个错误)。或者我在这里遗漏了什么;我这样说是在愚弄自己吗?(哈哈)。只要说一个字,我就把这个删掉。已在PHP7中删除。了解使用PDO的语句,并考虑使用PDO,代码< > VARYDUMP($session),以检查对对象“代码>未设置($session -> mysql)> $RESIID)发生的一些了解;代码>这是错误的。这可能是问题的一部分,应该是:
unset($session->mysql->res_id)
@dan08它是动态变量
$res\u id
持有真实的变量名,这部分工作。我没有得到这些
函数mysql\u connect($token、$host、$username、$password、$db)
-
mysql\u创建连接($host、$username、$password、$db)
-
mysql\u连接使用3个参数(第4个是其他参数)您似乎试图使用一个名为
mysql\u connect()
的自定义函数,这是一个核心PHP函数(应该会抛出一个错误)。或者我在这里遗漏了什么;我这样说是在愚弄自己吗?(哈哈)。只要说一个字,我就把这个删掉。已在PHP7中删除。了解使用PDO的语句,并考虑使用PDO,代码< > VARYDUMP($session)检查增益,了解对象发生了什么,非常感谢,我忘记了我在会话中使用魔术方法。非常感谢,我忘了在会话中我使用魔术方法。