【问题标题】:How to PHP pass a public method ClassName.methodName() to 'unserialize_callback_func' when call `ini_set`?如何在调用`ini_set`时将公共方法ClassName.methodName()传递给'unserialize_callback_func'?
【发布时间】:2011-12-18 15:19:21
【问题描述】:

作为来自 php.org 的官方 site 中的 example #2,为了避免未知的类名,我们提供了对序列化类的定义的 include 调用。

<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';

// unserialize_callback_func directive available as of PHP 4.2.0
ini_set('unserialize_callback_func', 'mycallback'); // set your callback_function

function mycallback($classname) 
{
    // just include a file containing your classdefinition
    // you get $classname to figure out which classdefinition is required
}
?>

我的问题是如果mycallback是C类的公共方法,我们如何在调用ini_set时将其作为参数传递?

【问题讨论】:

    标签: php serialization methods pass-by-reference deserialization


    【解决方案1】:

    我的问题是如果mycallback是C类的公共方法,我们如何在调用ini_set时将其作为参数传递?

    我认为您不能对对象的标准公共函数执行此操作,因为unserialize_callback_func 是字符串设置,但对象函数的callbackArray

    但如果你把它设为static公共函数,你可以将它作为字符串传递:

    class C
    {
        public static function mycallback($classname) 
        {
            // just include a file containing your classdefinition
            // you get $classname to figure out which classdefinition is required
        }
    }
    
    ini_set('unserialize_callback_func', 'C::mycallback'); // set your callback_function
    

    这可能是更好的选择。否则,您也可以将其包装成标准函数:

    function c_mycallback_wrapper($classname)
    {
        $c = new C;
        return $c->mycallback($classname);
    }
    ini_set('unserialize_callback_func', 'c_mycallback_wrapper');
    

    另一种选择是,您使用autoloading(例如spl_autoload_register)。 unserialize 支持自动加载,但我不知道自动加载是否对您有帮助,通常情况下确实如此。

    【讨论】:

    • Warning: ini_set() expects parameter 2 to be string, array given in ... on line ... 是我通过array($c, 'mycallback')时得到的
    • @NamGiVU:是的,我的假设是,我也检查了这一点并稍微编辑了问题,更多链接和更好的解释。我还用包装函数详细说明了这个例子。
    • @NamGiVU:当您正在寻找静态类函数示例时,我添加了它。
    【解决方案2】:

    这是怎么做的

    <?php 
    class C {
        var $serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}'; 
    
        function mycallback($classname)  
        { 
            // just include a file containing your classdefinition 
            // you get $classname to figure out which classdefinition is required 
        } 
    
    }
    
    $c = new C();
    
    // unserialize_callback_func directive available as of PHP 4.2.0 
    ini_set('unserialize_callback_func', 'C::mycallback'); // set your callback_function 
    
    unserialize($c->serialized_object);
    ?> 
    

    【讨论】:

    • 我猜你需要为方法添加static。这样你的答案就是被接受的:)
    • 很抱歉我没能在没有静态的情况下使用它
    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2011-03-25
    • 2012-02-24
    相关资源
    最近更新 更多