为什么get_object_vars返回受保护的属性?

4

我已经使用get_object_vars有一段时间了。它通常只返回对象的公共属性,但突然间它也返回了受保护的变量?!这怎么可能?以前从未发生过。

代码

print_r($row);
print_r(get_object_vars($row));

返回值

Data_model_Accounting Object
(
    [get_external:protected] => 1
    [put_external:protected] => 1
    [delete_external:protected] => 1
    [post_class:protected] => 1
    [external_field_const:protected] => Array
        (
            [type] => Array
                (
                    [0] => LEDGER
                    [1] => DEBTOR_LEDGER
                    [2] => CREDITOR_LEDGER
                    [3] => DEBTOR_INVOICE
                    [4] => CREDITOR_INVOICE
                )

        )

    [external_field_condition_unset:protected] => Array
        (
            [invoice_id_] => Array
                (
                    [type] => Array
                        (
                            [mode] => not_in
                            [values] => Array
                                (
                                    [0] => DEBTOR_INVOICE
                                    [1] => CREDITOR_INVOICE
                                )

                        )

                )

            [invoice_time_due] => Array
                (
                    [type] => Array
                        (
                            [mode] => not_in
                            [values] => Array
                                (
                                    [0] => DEBTOR_INVOICE
                                    [1] => CREDITOR_INVOICE
                                )

                        )

                )

        )

    [table:protected] => 
    [predata:protected] => Array
        (
        )

    [data:protected] => Array
        (
        )

    [external:protected] => 1
    [put_error:protected] => 
    [action_mode:protected] => 
    [Shell:protected] => 
    [access_admin_primary:protected] => 1
    [get_admin_external:protected] => 
    [put_admin_external:protected] => 
    [delete_admin_external:protected] => 
    [id] => 19
    [time] => 1362787200
    [type] => DEBTOR_LEDGER
    [account_id_] => 16000
    [account_name] => Debitor
    [accountoff_id_] => 16000
    [accountoff_name] => Debitor
    [vatcode_name] => 
    [subaccount_id_] => 10
    [subaccount_type] => DEBTOR
    [subaccount_name] => hehe
    [subaccountoff_id_] => 101
    [subaccountoff_type] => DEBTOR
    [subaccountoff_name] => oskel
    [dimension_name] => 
    [dimensionoff_name] => 
    [currency_name] => 
    [invoice_id_] => 
    [invoice_time_due] => 0
    [amount] => -165
    [currency_amount] => -165
    [currency_rate] => 1
)
Array
(
    [table] => 
    [predata] => Array
        (
        )

    [data] => Array
        (
        )

    [external] => 1
    [put_error] => 
    [action_mode] => 
    [Shell] => 
    [access_admin_primary] => 1
    [get_admin_external] => 
    [put_admin_external] => 
    [delete_admin_external] => 
    [id] => 19
    [time] => 1362787200
    [type] => DEBTOR_LEDGER
    [account_id_] => 16000
    [account_name] => Debitor
    [accountoff_id_] => 16000
    [accountoff_name] => Debitor
    [vatcode_name] => 
    [subaccount_id_] => 10
    [subaccount_type] => DEBTOR
    [subaccount_name] => hehe
    [subaccountoff_id_] => 101
    [subaccountoff_type] => DEBTOR
    [subaccountoff_name] => oskel
    [dimension_name] => 
    [dimensionoff_name] => 
    [currency_name] => 
    [invoice_id_] => 
    [invoice_time_due] => 0
    [amount] => -165
    [currency_amount] => -165
    [currency_rate] => 1
)
2个回答

5
不,这不是新行为,也不是在你的电脑隔夜传输的行为。
根据文档:
返回指定对象范围内已定义并可访问的非静态属性的关联数组。
没有提及访问级别。
然而,有一个未记录的方面涉及可见性和范围,由一个用户在同一文档页面上留下以下评论报告:
请注意,这是范围敏感的。如果您从对象自己的方法调用它,那么私有和受保护的变量也会被输出。从对象外部调用它,结果很可能是您想要实现的。
文档是您的朋友。使用它。

1
好的,但是您如何以非范围敏感的方式检索所有公共属性? - clarkk
2
@clarkk:请阅读我 完整的 回答,而不仅仅是前几行。 - Lightness Races in Orbit
你可以使用闭包来打破作用域上下文。例如:$getPublic = function($var) { return get_object_vars($var); } $publicProps = $getPublic($row); - Alain Tiemblo
@ninsuo,我刚刚尝试了你的示例,但是显然仍然在相同的范围内..受保护的属性仍然被返回。 - clarkk
Data_model_Accounting 是一个新实例的扩展。当前对象和 Data_model_Accounting 具有相同的父级,但位于两个不同的实例/对象中。如果这样说可以理解的话,它们不应该在同一作用域内。 - clarkk

0
你正在使用哪个版本的PHP?
如果你在Data_model_Accounting::method中调用get_object_vars,那么受保护的属性应该是可见的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接