Как PHP передать открытый метод ClassName.methodName () в unserialize_callback_func при вызове ini_set? - PullRequest
0 голосов
/ 31 октября 2011

Как example #2 на этом официальном сайте от php.org, чтобы избежать неизвестного имени класса, мы предоставляем 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?

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Вот как это делается

<?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);
?> 
0 голосов
/ 31 октября 2011

У меня вопрос: если mycallback является публичным методом класса C, как мы можем передать его в качестве параметра при вызове ini_set?

Я думаю, что вы не можетесделать это для стандартной публичной функции объекта, потому что unserialize_callback_func является строковым параметром, а обратный вызов объектной функции - Array.

Но если вы сделаете ее публичной функцией 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');

Другой альтернативой является использование автозагрузки (например, spl_autoload_register).unserialize поддерживает автозагрузку, но я не знаю, помогает ли автозагрузка в вашем случае, часто это так.

...