创建新对象实例时,mysqli_fetch_object($ class_name)不使用__set()方法

时间:2012-11-15 16:43:50

标签: php mysqli magic-methods

这是我的php课程:

class Category {
    private $cat_id;
    private $cat_name;
    private $cat_is_main;
    private $cat_parent;

    function __get($key) {
        switch ($key) {
            case 'cat_id':
                return $this->cat_id;
            case 'cat_name':
                return $this->cat_name;
            case 'cat_is_main':
                return $this->cat_is_main;
            case 'cat_parent':
                return $this->cat_parent;
        }
    }

    function __set($key, $value) {
        switch ($key) {
            case 'cat_id':
                $this->cat_id = (int) $value;
                break;
            case 'cat_name':
                $this->cat_name = (string) $value;
                break;
            case 'cat_is_main':
                $this->cat_is_main = (bool) $value;
                break;
            case 'cat_parent':
                $this->cat_parent = (int) $value;
                break;
        }
    }
}
$conn = new mysqli($server, $username, $password, $dbname);
if ($result = $conn->query('SELECT cat_id, cat_name FROM categories WHERE cat_id = 1;')) {
    var_dump($result->fetch_object('Category'));
}

我得到了:

object(Category)#5 (4) {
    ["cat_id":"Category":private]=> string(1) "1"
    ["cat_name":"Category":private]=> string(9) "test data"
    ["cat_is_main":"Category":private]=> string(1) "1"
    ["cat_parent":"Category":private]=> string(1) "0"
}

我期待的是:

object(Category)#1 (4) {
    ["cat_id":"Category":private]=> int(1)
    ["cat_name":"Category":private]=> string(9) "test data"
    ["cat_is_main":"Category":private]=> bool(true)
    ["cat_parent":"Category":private]=> int(0)
}

在创建新对象时,似乎mysqli_fetch_object()不使用我的__set()方法。它只是我私人财产的设定价值 这在PHP中是正常的吗?我还能做些什么来得到我想要的东西吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

mysqli_fetch_object()创建一个对象时,它首先创建一个stdClass,首先设置所有属性,然后将对象的类切换为您提供的类,然后运行构造函数。正如您所注意到的那样,__set()方法不会被调用,但这是正常的,只是函数的工作原理。