【问题标题】:How to unset object's inherited properties?如何取消设置对象的继承属性?
【发布时间】:2011-02-05 17:36:01
【问题描述】:

我有一个对象

    (
        [id] => 1
        [parent_id] => 0
        [result:Database:private] => 
        [db:Database:private] => mysqli Object
            (
                [affected_rows] => 0
                ...
            )

    )

显然,Object 继承了父 Database 类的 'db' 和 'result' 属性。

unset($object->result) 也没有 unset($object->result:Database) 也没有 unset($object->result:Database:private) 工作。

当不再需要这些属性时(即即将输出对象属性时),如何取消设置这些属性?

将数据库对象作为其他类的继承属性通常是一个好主意吗(将一个数据库类与所有其他使用数据库连接的类一起扩展)?

【问题讨论】:

    标签: php inheritance parent unset


    【解决方案1】:

    如果您只在一个对象中使用 unset() ,您并没有取消设置该对象,因为它存在于内存中的某个地方,而您在对象中拥有的只是一个引用。持有此 DB 对象的所有其他对象都使用相同的引用。您唯一能做的就是将此引用设置为等于 NULL,但您不会释放任何内存,因为其他对象仍在使用 DB。

    通常我不会担心取消设置 DB 对象,因为您不会获得任何性能提升。 PHP 会在执行结束时自动对它的对象进行垃圾回收。

    是的,拥有一个静态数据库对象或在使用数据库的类中继承它是个好主意。

    【讨论】:

    • 取消设置数据库对象继承属性的目的不是释放内存,而是使子对象更易于管理,例如迭代。我正在使用所有其他需要数据库 IO 的类来扩展 Database 类,因为我发现只做 $this->query($query) 很容易,而且 Eclipse 也不喜欢 $t​​his->db->query($query ) 句法。我很高兴您发现这种方法是个好主意。 Мерси много за помощта приятелю ;)
    • 更易于管理是什么意思?此外,所有继承 DB 的类都是专门针对仅进行数据库操作的好主意。 Пакзаповядай :)
    • 例如:Item类有很多属性,扩展了Database类,所以Item类可以使用任何数据库方法。当即将输出 Item 类的对象时,我想剥离该对象的所有继承属性并在 Item 对象上使用迭代。
    【解决方案2】:

    试试$object->result = null

    将数据库对象作为其他类的继承属性通常是一个好主意吗(将一个数据库类与所有其他使用数据库连接的类一起扩展)?

    没有。你的班级最好有一个责任。将数据库连接保存在一个类或一组类中,这些类的职责是从数据库中读取和写入数据。您的其他域对象应该处理自己的职责,而不会被 SQL 和数据库代码所拥挤——即使它是继承的。

    您可能还想了解“偏好组合优于继承”的概念。

    【讨论】:

    • $object->result = null 只会删除对 DB 的引用,该引用将继续存在于内存中。 unset() 从内存中删除对象,他不能使用 unset() 因为 DB 也被其他类继承。
    • 不幸的是,$object->result = null 和 unset($object->result) 都不起作用。 $object->result = null 只设置新属性'result'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多