0

これが私の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では正常ですか?欲しいものを手に入れるために他にできることはありますか?
ありがとう!

4

1 に答える 1

1

mysqli_fetch_object()オブジェクトを作成するときは、基本的stdClassにすべての属性が設定された最初のオブジェクトを作成し、次にオブジェクトのクラスを指定したクラスに切り替えてから、コンストラクターを実行します。お気づきのとおり、__set()メソッドは呼び出されませんが、これは正常であり、関数がどのように機能するかを示しています。

于 2012-11-15T16:55:08.490 に答える